#include #include #include #include #include #include /* we use non arch dependant path to compile even if kernel * has not been compiled first; * nvram structures of spc200c and spc200e are the same */ #include #define HWADDR_LEN 6 /* * Default nvram image */ static spidcom_nvram_t image = { .magicWord1 = NVRAM_MAGIC_WORD1, .magicWord2 = NVRAM_MAGIC_WORD2, .boardNumber = 0, .serialNumber = { "1234567890" }, .sysDescr = { "Spidcom SPC200 EoC modem" }, .ethPhysAddress = { "\x00\x13\xd7\x00\x00\x00" }, .plcPhysAddress = { "\x00\x13\xd7\x00\x00\x01" }, .magicNvram2 = { NVRAM2_MAGIC }, .boardDesc = { "" }, .boardId = 0, .vendorInfo = { "" }, .sdramSize = 32, .imageOffset0 = (unsigned char*)0x000a0000, .imageOffset1 = (unsigned char*)0x00250000, .ethPortNum = 1, .manufactoryInfo = { "" } }; /* * Private functions */ static void print_usage(const char *cmd) { fprintf(stderr, "Usage : %s " \ "[ --infile conf_file ]" \ "[ --oufile result_file ]" \ "[ --serial sn ]" \ "[ --desc system desc ]" \ "[ --ether hwaddr ]" \ "[ --plc hwaddr ]" \ "[ --afe type ]" \ "[ --board_desc desc ]" \ "[ --board_id 0-4 ]" \ "[ --vendor vendor info ]" \ "[ --sdram size]" \ "[ --image0 addr ]" \ "[ --image1 addr ]" \ "[ --eth_port number ]" \ "[ --manufactory info ]\n", cmd); } static int str2hwaddr(unsigned char *hw, const char *str) { /* * Little-endian only... */ int c; unsigned char hwaddr[16]; c = sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x", &hwaddr[0], &hwaddr[1], &hwaddr[2], &hwaddr[3], &hwaddr[4], &hwaddr[5]); memcpy(hw, hwaddr, HWADDR_LEN); return (c != HWADDR_LEN); } /* * *** Parser *** */ struct parser { char label[32]; int (*func)(char*); }; /* * Parser functions */ static int parse_serial(char *arg) { strncpy(image.serialNumber, arg, sizeof(image.serialNumber)); return 0; } static int parse_desc(char *arg) { strncpy(image.sysDescr, arg, sizeof(image.sysDescr)); return 0; } static int parse_eth(char *arg) { return str2hwaddr(image.ethPhysAddress, arg); } static int parse_plc(char *arg) { return str2hwaddr(image.plcPhysAddress, arg); } static int parse_board_desc(char *arg) { strncpy(image.boardDesc, arg, sizeof(image.boardDesc)); return 0; } static int parse_board_id(char *arg) { return (image.boardId = atoi(arg)); } static int parse_vendor(char *arg) { strncpy(image.vendorInfo, arg, sizeof(image.vendorInfo)); return 0; } static int parse_sdram(char *arg) { return (image.sdramSize = atoi(arg)); } static int parse_image0(char *arg) { return sscanf(arg, "0x%08x", &image.imageOffset0); } static int parse_image1(char *arg) { return sscanf(arg, "0x%08x", &image.imageOffset1); } static int parse_afe_type(char *arg) { return (sscanf(arg, "%u", &image.afeType)); } static int parse_eth_port(char *arg) { return (sscanf(arg, "%u", &image.ethPortNum)); } static int parse_manufactory(char *arg) { strncpy(image.manufactoryInfo, arg, sizeof(image.manufactoryInfo)); return 0; } static char *chop(char *str) { int i; for(i = strlen(str); i > 0; i--) { if(str[i] == ' ' || str[i] == '\t' || str[i] == '\n') str[i] = '\0'; else break; } while(*str == ' ' || *str == '\t') str++; return str; } /* * Parser tables */ struct parser parse_table[] = { { "serial", parse_serial }, { "description", parse_desc }, { "ethernet", parse_eth }, { "plc", parse_plc }, { "board_desc", parse_board_desc }, { "board_id", parse_board_id }, { "vendor", parse_vendor }, { "sdram", parse_sdram }, { "image0", parse_image0 }, { "image1", parse_image1 }, { "afe_type", parse_afe_type }, { "eth_port", parse_eth_port }, { "manufactory", parse_manufactory }}; /* * Parser main functions */ static int parse(char *line) { int i; char *plabel, *parg; parg = line; /* Separate fields */ plabel = strsep(&parg, "="); if(!parg) return; /* keyword processing */ for(i = sizeof(parse_table) / sizeof(struct parser); i--;) { if(!strcasecmp(parse_table[i].label, chop(plabel))) { //fprintf(stderr, "found label %s\n", parse_table[i].label); parse_table[i].func(chop(parg)); break; } } return 0; } static int parse_file(char* filename) { FILE *fp; char line[256]; if((fp = fopen(filename, "r")) != NULL) { while(!feof(fp)) { fgets(line, sizeof(line), fp); parse(line); } } return 0; } /* * Main program */ int main(int argc, char **argv) { int c, input = 0; int opt_index = 0; char line[256]; struct option long_opts[] = { { "infile", required_argument, NULL, 'i' }, { "outfile", required_argument, NULL, 'o' }, { "serial", required_argument, NULL, 's' }, { "desc", required_argument, NULL, 'd' }, { "afe", required_argument, NULL, 'a' }, { "ether", required_argument, NULL, 'e' }, { "plc", required_argument, NULL, 'p' }, { "board_desc", required_argument, NULL, 'b' }, { "board_id", required_argument, NULL, 'B' }, { "vendor", required_argument, NULL, 'v' }, { "sdram", required_argument, NULL, 'r' }, { "image0", required_argument, NULL, '0' }, { "image1", required_argument, NULL, '1' }, { "port", required_argument, NULL, 'P' }, { "manufactory", required_argument, NULL, 'm' }}; while((c = getopt_long_only(argc, argv, "i:o:s:d:a:e:p:b:B:v:r:0:1:P:", long_opts, &opt_index)) != -1){ switch(c){ case 'i' : /* config file */ input = 1; parse_file(optarg); break; case 'o' : /* result NVRAM file */ freopen(optarg, "w", stdout); break; case 's' : /* serial */ strncpy(image.serialNumber, optarg, sizeof(image.serialNumber)); break; case 'd' : /* desc */ strncpy(image.sysDescr, optarg, sizeof(image.sysDescr)); break; case 'a' : /* desc */ sscanf(optarg, "%u", &image.afeType); break; case 'e' : /* ether */ str2hwaddr(image.ethPhysAddress, optarg); break; case 'p' : /* plc */ str2hwaddr(image.plcPhysAddress, optarg); break; case 'b' : /* board_desc */ strncpy(image.boardDesc, optarg, sizeof(image.boardDesc)); break; case 'B' : /* board_id */ image.boardId = atoi(optarg); break; case 'v' : /* vendor */ strncpy(image.vendorInfo, optarg, sizeof(image.vendorInfo)); break; case 'r' : /* sdram */ image.sdramSize = atoi(optarg); break; case '0' : /* image0 */ sscanf(optarg, "0x%08x", &image.imageOffset0); break; case '1' : /* image1 */ sscanf(optarg, "0x%08x", &image.imageOffset1); break; case 'P' : /* sdram */ image.ethPortNum = atoi(optarg); break; case 'm' : /* sdram */ strncpy(image.manufactoryInfo, optarg, sizeof(image.manufactoryInfo)); break; default : print_usage(argv[0]); return 1; } } /* Check there's no arguments left */ if (optind < argc) { printf("Unknown argument %s\n\n", argv[optind]); print_usage(argv[0]); return -1; } if (!input) { while ( !feof(stdin) ) { fscanf(stdin,"%s",line); parse(line); } } /* Output image */ write(fileno(stdout), &image, sizeof(image)); return 0; }