static void is_gstate(struct global_state *gstate) { /* Could use lots more checks on gstate... */ TYPEIS(gstate, type_vector); if (vector_len(gstate) != 8) RUNTIME_ERROR(error_bad_type); }
static int parse_tokens(acmi_config_t *config, int idx, enum miconf_parse_st *st, char *tok) { static char *p; arms_line_conf_pppoe_t *pppoeconf; arms_line_conf_mobile_t *mobileconf; arms_line_conf_static_t *staticconf; enum miconf_tokens tokn; tokn = tok2num(tok); pppoeconf = &config->line_defs[config->num_line].conf.pppoe; mobileconf = &config->line_defs[config->num_line].conf.mobile; staticconf = &config->line_defs[config->num_line].conf.staticip; switch (*st) { case ST_INITIAL: /* * line configuration storage has no (server) index. * then, idx > 0 should be ignored. sigh... */ switch (tokn) { case TOK_APPPOE: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_ANONPPPOE; *st = ST_LINE; } break; case TOK_LPPPOE: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_PPPOE; *st = ST_LINE; } break; case TOK_LDHCP: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_DHCP; *st = ST_LINE; } break; case TOK_AMOBILE: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_ANONMOBILE; *st = ST_LINE; } break; case TOK_LMOBILE: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_MOBILE; *st = ST_LINE; } break; case TOK_LSTATIC: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_STATIC; *st = ST_LINE; } break; case TOK_LRA: if (idx == 0) { config->line_defs[config->num_line].type = ARMS_LINE_RA; *st = ST_LINE; } break; case TOK_RSCERT: *st = ST_RSCERT; p = config->server_defs[idx].cacert; config->server_defs[idx].have_cert = 1; break; default: break; } break; case ST_LINE: switch (tokn) { case TOK_IFINDEX: *st = ST_LINE_IFINDEX; break; case TOK_ACCOUNT: *st = ST_LINE_ACCOUNT; break; case TOK_PASSWD: *st = ST_LINE_PASSWD; break; case TOK_TELNO: *st = ST_LINE_TELNO; break; case TOK_CID: *st = ST_LINE_CID; break; case TOK_APN: *st = ST_LINE_APN; break; case TOK_PDP: *st = ST_LINE_PDP; break; case TOK_IPADDR: *st = ST_LINE_IPADDR; break; case TOK_OC: /* ignore */ break; case TOK_CC: *st = ST_INITIAL; config->num_line++; break; default: break; } break; case ST_LINE_IFINDEX: /* offset 0 of all types: ifindex */ pppoeconf->ifindex = atoi(tok); *st = ST_LINE; break; case ST_LINE_ACCOUNT: if (TYPEIS(PPPOE)) strlcpy(pppoeconf->id, tok, MAX_PPP_ID); if (TYPEIS(MOBILE)) strlcpy(mobileconf->id, tok, MAX_MOBILE_PPP_ID); *st = ST_LINE; break; case ST_LINE_PASSWD: if (TYPEIS(PPPOE)) strlcpy(pppoeconf->pass, tok, MAX_PPP_PASS); if (TYPEIS(MOBILE)) strlcpy(mobileconf->pass, tok, MAX_MOBILE_PPP_PASS); *st = ST_LINE; break; case ST_LINE_TELNO: if (TYPEIS(MOBILE)) strlcpy(mobileconf->telno, tok, MAX_MOBILE_TEL_LEN); *st = ST_LINE; break; case ST_LINE_CID: if (TYPEIS(MOBILE)) mobileconf->cid = atoi(tok); *st = ST_LINE; break; case ST_LINE_APN: if (TYPEIS(MOBILE)) strlcpy(mobileconf->apn, tok, MAX_MOBILE_APN_LEN); *st = ST_LINE; break; case ST_LINE_PDP: if (TYPEIS(MOBILE)) strlcpy(mobileconf->pdp, tok, MAX_MOBILE_PDP_LEN); *st = ST_LINE; break; case ST_LINE_IPADDR: if (TYPEIS(MOBILE)) strlcpy(mobileconf->ipaddr, tok, 48); if (TYPEIS(STATIC)) strlcpy(staticconf->ipaddr, tok, 48); *st = ST_LINE; break; case ST_RSCERT: switch (tokn) { case TOK_BEGIN_CERT: p = append_cert(p, "-----BEGIN CERTIFICATE-----"); /* ignore */ break; case TOK_END_CERT: p = append_cert(p, "-----END CERTIFICATE-----"); /* ignore */ break; case TOK_CERT: /* ignore */ break; case TOK_OC: break; case TOK_CC: *st = ST_INITIAL; break; default: p = append_cert(p, tok); break; } break; default: break; } return 0; }