/* * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * Released under the terms of the GNU GPL v2.0. */ #include <locale.h> #include <ctype.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <getopt.h> #include <sys/stat.h> #include <sys/time.h> #include <errno.h> #include "lkc.h" static void conf(struct menu *menu); static void check_conf(struct menu *menu); static void xfgets(char *str, int size, FILE *in); enum input_mode { oldaskconfig, silentoldconfig, oldconfig, allnoconfig, allyesconfig, allmodconfig, alldefconfig, randconfig, defconfig, savedefconfig, listnewconfig, olddefconfig, } input_mode = oldaskconfig; static int indent = 1; static int tty_stdio; static int valid_stdin = 1; static int sync_kconfig; static int conf_cnt; static char line[PATH_MAX]; static struct menu *rootEntry; static void print_help(struct menu *menu) { struct gstr help = str_new(); menu_get_ext_help(menu, &help); printf("\n%s\n", str_get(&help)); str_free(&help); } static void strip(char *str) { char *p = str; int l; while ((isspace(*p))) p++; l = strlen(p); if (p != str) memmove(str, p, l + 1); if (!l) return; p = str + l - 1; while ((isspace(*p))) *p-- = 0; } static void check_stdin(void) { if (!valid_stdin) { printf(_("aborted!\n\n")); printf(_("Console input/output is redirected. ")); printf(_("Run 'make oldconfig' to update configuration.\n\n")); exit(1); } } static int conf_askvalue(struct symbol *sym, const char *def) { enum symbol_type type = sym_get_type(sym); if (!sym_has_value(sym)) printf(_("(NEW) ")); line[0] = '\n'; line[1] = 0; if (!sym_is_changable(sym)) { printf("%s\n", def); line[0] = '\n'; line[1] = 0; return 0; } switch (input_mode) { case oldconfig: case silentoldconfig: if (sym_has_value(sym)) { printf("%s\n", def); return 0; } check_stdin(); /* fall through */ case oldaskconfig: fflush(stdout); xfgets(line, sizeof(line), stdin); if (!tty_stdio) printf("\n"); return 1; default: break; } switch (type) { case S_INT: case S_HEX: case S_STRING: printf("%s\n", def); return 1; default: ; } printf("%s", line); return 1; } static int conf_string(struct menu *menu) { struct symbol *sym = menu->sym; const char *def; while (1) { printf("%*s%s ", indent - 1, "", _(menu->prompt->text)); printf("(%s) ", sym->name); def = sym_get_string_value(sym); if (sym_get_string_value(sym)) printf("[%s] ", def); if (!conf_askvalue(sym, def)) return 0; switch (line[0]) { case '\n': break; case '?': /* print help */ if (line[1] == '\n') { print_help(menu); def = NULL; break; } /* fall through */ default: line[strlen(line)-1] = 0; def = line; } if (def && sym_set_string_value(sym, def)) return 0; } } static int conf_sym(struct menu *menu) { struct symbol *sym = menu->sym; tristate oldval, newval; while (1) { printf("%*s%s ", indent - 1, "", _(menu->prompt->text)); if (sym->name) printf("(%s) ", sym->name); putchar('['); oldval = sym_get_tristate_value(sym); switch (oldval) { case no: putchar('N'); break; case mod: putchar('M'); break; case yes: putchar('Y'); break; } if (oldval != no && sym_tristate_within_range(sym, no)) printf("/n"); if (oldval != mod && sym_tristate_within_range(sym, mod)) printf("/m"); if (oldval != yes && sym_tristate_within_range(sym, yes)) printf("/y"); if (menu_has_help(menu)) printf("/?"); printf("] "); if (!conf_askvalue(sym, sym_get_string_value(sym))) return 0; strip(line); switch (line[0]) { case 'n': case 'N': newval = no; if (!line[1] || !strcmp(&line[1], "o")) break; continue; case 'm': case 'M': newval = mod; if (!line[1]) break; continue; case 'y': case 'Y': newval = yes; if (!line[1] || !strcmp(&line[1], "es")) break; continue; case 0: newval = oldval; break; case '?': goto help; default: continue; } if (sym_set_tristate_value(sym, newval)) return 0; help: print_help(menu); } } static int conf_choice(struct menu *menu) { struct symbol *sym, *def_sym; struct menu *child; bool is_new; sym = menu->sym; is_new = !sym_has_value(sym); if (sym_is_changable(sym)) { conf_sym(menu); sym_calc_value(sym); switch (sym_get_tristate_value(sym)) { case no: return 1; case mod: return 0; case yes: break; } } else { switch (sym_get_tristate_value(sym)) { case no: return 1; case mod: printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu))); return 0; case yes: break; } } while (1) { int cnt, def; printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu))); def_sym = sym_get_choice_value(sym); cnt = def = 0; line[0] = 0; for (child = menu->list; child; child = child->next) { if (!menu_is_visible(child)) continue; if (!child->sym) { printf("%*c %s\n", indent, '*', _(menu_get_prompt(child))); continue; } cnt++; if (child->sym == def_sym) { def = cnt; printf("%*c", indent, '>'); } else printf("%*c", indent, ' '); printf(" %d. %s", cnt, _(menu_get_prompt(child))); if (child->sym->name) printf(" (%s)", child->sym->name); if (!sym_has_value(c<style>pre { line-height: 125%; margin: 0; } td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #ffffff; } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="c">#</span> <span class="c"># Copyright (C) 2008 OpenWrt.org</span> <span class="c">#</span> <span class="c"># This is free software, licensed under the GNU General Public License v2.</span> <span class="c"># See /LICENSE for more information.</span> <span class="c">#</span> <span class="cp">include $(TOPDIR)/rules.mk</span> <span class="cp">include $(INCLUDE_DIR)/kernel.mk</span> <span class="nv">PKG_NAME</span><span class="o">:=</span>wrt55agv2-spidevs <span class="nv">PKG_RELEASE</span><span class="o">:=</span><span class="m">1</span> <span class="cp">include $(INCLUDE_DIR)/package.mk</span> <span class="cp">define KernelPackage/wrt55agv2-spidevs</span> SUBMENU:<span class="o">=</span>Other modules TITLE:<span class="o">=</span>WRT55AG v2 SPI devices support DEPENDS:<span class="o">=</span>@LINUX_2_6 @TARGET_atheros +kmod-spi-gpio-old +kmod-spi-ks8995 FILES:<span class="o">=</span><span class="k">$(</span>PKG_BUILD_DIR<span class="k">)</span>/wrt55agv2_spidevs.<span class="k">$(</span>LINUX_KMOD_SUFFIX<span class="k">)</span> <span class="cp">endef</span> <span class="cp">define KernelPackage/wrt55agv2-spidevs/description</span> Kernel module <span class="k">for</span> the SPI devices on the WRT55AG v2 board. <span class="cp">endef</span> <span class="nv">EXTRA_KCONFIG</span><span class="o">:=</span> <span class="se">\</span> <span class="nv">CONFIG_WRT55AGV2_SPIDEVS</span><span class="o">=</span>m <span class="nv">EXTRA_CFLAGS</span><span class="o">:=</span> <span class="se">\</span> <span class="k">$(</span>patsubst CONFIG_%, -DCONFIG_%<span class="o">=</span><span class="m">1</span>, <span class="k">$(</span>patsubst %<span class="o">=</span>m,%,<span class="k">$(</span>filter %<span class="o">=</span>m,<span class="k">$(</span>EXTRA_KCONFIG<span class="k">))))</span> <span class="se">\</span> <span class="k">$(</span>patsubst CONFIG_%, -DCONFIG_%<span class="o">=</span><span class="m">1</span>, <span class="k">$(</span>patsubst %<span class="o">=</span>y,%,<span class="k">$(</span>filter %<span class="o">=</span>y,<span class="k">$(</span>EXTRA_KCONFIG<span class="k">))))</span> <span class="se">\</span> <span class="nv">MAKE_OPTS</span><span class="o">:=</span> <span class="se">\</span> <span class="nv">ARCH</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>LINUX_KARCH<span class="k">)</span><span class="s2">"</span> <span class="se">\</span> <span class="nv">CROSS_COMPILE</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>TARGET_CROSS<span class="k">)</span><span class="s2">"</span> <span class="se">\</span> <span class="nv">SUBDIRS</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>PKG_BUILD_DIR<span class="k">)</span><span class="s2">"</span> <span class="se">\</span> <span class="nv">EXTRA_CFLAGS</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>EXTRA_CFLAGS<span class="k">)</span><span class="s2">"</span> <span class="se">\</span> <span class="nv">LINUXINCLUDE</span><span class="o">=</span><span class="s2">"-I</span><span class="k">$(</span>LINUX_DIR<span class="k">)</span><span class="s2">/include -I</span><span class="k">$(</span>LINUX_DIR<span class="k">)</span><span class="s2">/arch/mips/include -include linux/autoconf.h"</span> <span class="se">\</span> <span class="k">$(</span>EXTRA_KCONFIG<span class="k">)</span> <span class="cp">define Build/Prepare</span> mkdir -p <span class="k">$(</span>PKG_BUILD_DIR<span class="k">)</span> <span class="k">$(</span>CP<span class="k">)</span> ./src/* <span class="k">$(</span>PKG_BUILD_DIR<span class="k">)</span>/ <span class="cp">endef</span> <span class="cp">define Build/Compile</span> <span class="k">$(</span>MAKE<span class="k">)</span> -C <span class="s2">"</span><span class="k">$(</span>LINUX_DIR<span class="k">)</span><span class="s2">"</span> <span class="se">\</span> <span class="k">$(</span>MAKE_OPTS<span class="k">)</span> <span class="se">\</span> modules <span class="cp">endef</span> <span class="k">$(</span><span class="nv">eval</span> <span class="k">$(</span><span class="nv">call</span> <span class="nv">KernelPackage</span>,<span class="nv">wrt55agv2-spidevs</span><span class="k">))</span> </pre></div> </code></pre></td></tr></table> </div> <!-- class=content --> <div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2025-03-27 12:53:18 +0000</div> </div> <!-- id=cgit --> </body> </html> n 0; } /* * Helper function to facilitate fgets() by Jean Sacren. */ void xfgets(char *str, int size, FILE *in) { if (fgets(str, size, in) == NULL) fprintf(stderr, "\nError in reading or end of file.\n"); }