diff options
-rw-r--r-- | src/gsmd/gsmd.c | 20 | ||||
-rw-r--r-- | src/gsmd/machine.c | 53 |
2 files changed, 54 insertions, 19 deletions
diff --git a/src/gsmd/gsmd.c b/src/gsmd/gsmd.c index 12c7c3f..27bf8d9 100644 --- a/src/gsmd/gsmd.c +++ b/src/gsmd/gsmd.c @@ -158,15 +158,17 @@ static struct option opts[] = { { "logfile", 1, NULL, 'l' }, { "hwflow", 0, NULL, 'F' }, { "leak-report", 0, NULL, 'L' }, + { "vendor", 1, NULL, 'v' }, + { "machine", 1, NULL, 'm' }, { 0, 0, 0, 0 } }; static void print_help(void) { - printf("gsmd - (C) 2006 by Harald Welte <laforge@gnumonks.org>\n" + printf("gsmd - (C) 2006-2007 by Harald Welte <laforge@gnumonks.org>\n" "This program is FREE SOFTWARE under the terms of GNU GPL\n\n" "Usage:\n" - "\t-v\t--version\tDisplay program version\n" + "\t-V\t--version\tDisplay program version\n" "\t-d\t--daemon\tDeamonize\n" "\t-h\t--help\t\tDisplay this help message\n" "\t-p dev\t--device dev\tSpecify serial device to be used\n" @@ -174,6 +176,8 @@ static void print_help(void) "\t-F\t--hwflow\tHardware Flow Control (RTS/CTS)\n" "\t-L\t--leak-report\tLeak Report of talloc memory allocator\n" "\t-l file\t--logfile file\tSpecify a logfile to log to\n" + "\t-v\t--vendor v\tSpecify GSM modem vendor plugin\n" + "\t-m\t--machine m\tSpecify GSM modem machine plugin\n" ); } @@ -200,6 +204,8 @@ int main(int argc, char **argv) int hwflow = 0; char *device = "/dev/ttyUSB0"; char *logfile = "syslog"; + char *vendor_name = NULL; + char *machine_name = NULL; signal(SIGTERM, sig_handler); signal(SIGINT, sig_handler); @@ -209,7 +215,7 @@ int main(int argc, char **argv) gsmd_tallocs = talloc_named_const(NULL, 1, "GSMD"); /*FIXME: parse commandline, set daemonize, device, ... */ - while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:", opts, NULL)) != -1) { + while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:v:m:", opts, NULL)) != -1) { switch (argch) { case 'V': /* FIXME */ @@ -240,6 +246,12 @@ int main(int argc, char **argv) exit(2); } break; + case 'v': + vendor_name = optarg; + break; + case 'm': + machine_name = optarg; + break; } } @@ -261,7 +273,7 @@ int main(int argc, char **argv) exit(1); } - if (gsmd_machine_plugin_init(&g) < 0) { + if (gsmd_machine_plugin_init(&g, machine_name, vendor_name) < 0) { fprintf(stderr, "no machine plugins found\n"); exit(1); } diff --git a/src/gsmd/machine.c b/src/gsmd/machine.c index 40c08cb..8db210b 100644 --- a/src/gsmd/machine.c +++ b/src/gsmd/machine.c @@ -102,11 +102,11 @@ struct machines { { NULL, NULL, NULL }, }; -int gsmd_machine_plugin_init(struct gsmd *g, int fd) +int gsmd_machine_plugin_init(struct gsmd *g, char *machine_name, char *vendor_name) { FILE *cpuinfo; char buf[1024]; - char *line, *machine = NULL; + char *line, *hw = NULL; int i, rc; cpuinfo = fopen("/proc/cpuinfo", "r"); @@ -117,23 +117,46 @@ int gsmd_machine_plugin_init(struct gsmd *g, int fd) line = strtok(buf, "\n"); while (line = strtok(NULL, "\n")) { if (strncmp(line, "Hardware\t: ", 11) == 0) { - machine = line+11; + hw = line+11; break; } } - /* FIXME: do this dynamically */ - for (i = 0; machines[i].cpuinfo; i++) { - if (machine && strcmp(machine, machines[i].cpuinfo) == 0) { - DEBUGP("detected %s\n", machine); - rc = gsmd_machine_plugin_load(machines[i].machine); - rc |= gsmd_vendor_plugin_load(machines[i].vendor); - return rc; + + if (hw) { + /* FIXME: do this dynamically */ + for (i = 0; machines[i].cpuinfo; i++) { + if (strcmp(hw, machines[i].cpuinfo) == 0) { + DEBUGP("detected '%s' hardware\n", hw); + if (machine_name) + DEBUGP("warning: auto-detected machine '%s', " + "but user override to '%s'\n", + machines[i].machine, machine_name); + else + machine_name = machines[i].machine; + + if (vendor_name) + DEBUGP("wanring: auto-detected vendor '%s', " + "but user override to '%s'\m", + machines[i].vendor, vendor_name); + else + vendor_name = machines[i].vendor; + break; + } } } - /* load generic machine and all vendor plugins */ - rc = gsmd_machine_plugin_load("generic"); - gsmd_vendor_plugin_load("ti"); - gsmd_vendor_plugin_load("tihtc"); - gsmd_vendor_plugin_load("qc"); + + if (machine_name) + rc = gsmd_machine_plugin_load(machine_name); + else + rc = gsmd_machine_plugin_load("generic"); + + if (vendor_name) + gsmd_vendor_plugin_load(vendor_name); + else { + gsmd_vendor_plugin_load("ti"); + gsmd_vendor_plugin_load("tihtc"); + gsmd_vendor_plugin_load("qc"); + } + return rc; } |