/* * Initialize the static structure to zeros, then * apply all the default values. */ static void init_resource(CONFIG *config, int type, RES_ITEM *items, int pass) { int i; int rindex = type - r_first; memset(config->m_res_all, 0, config->m_res_all_size); res_all.hdr.rcode = type; res_all.hdr.refcnt = 1; /* Set defaults in each item */ for (i=0; items[i].name; i++) { Dmsg3(900, "Item=%s def=%s defval=%d\n", items[i].name, (items[i].flags & ITEM_DEFAULT) ? "yes" : "no", items[i].default_value); if (items[i].flags & ITEM_DEFAULT && items[i].default_value != 0) { if (items[i].handler == store_bit) { *(uint32_t *)(items[i].value) |= items[i].code; } else if (items[i].handler == store_bool) { *(bool *)(items[i].value) = items[i].default_value != 0; } else if (items[i].handler == store_pint32 || items[i].handler == store_int32) { *(uint32_t *)(items[i].value) = items[i].default_value; } else if (items[i].handler == store_int64) { *(int64_t *)(items[i].value) = items[i].default_value; } else if (items[i].handler == store_size) { *(uint64_t *)(items[i].value) = (uint64_t)items[i].default_value; } else if (items[i].handler == store_time) { *(utime_t *)(items[i].value) = (utime_t)items[i].default_value; } else if (pass == 1 && items[i].handler == store_addresses) { init_default_addresses((dlist**)items[i].value, items[i].default_value); } } /* If this triggers, take a look at lib/parse_conf.h */ if (i >= MAX_RES_ITEMS) { Emsg1(M_ERROR_TERM, 0, _("Too many items in %s resource\n"), resources[rindex]); } } }
int main(int argc, char **argv){ int listen_socket; int opt_ret = 0; struct k_message msg; struct sockaddr_atmsvc control_listen_addr; struct sockaddr_atmsvc mps_ctrl_addr; struct sockaddr_atmsvc lec_addr; memset(&control_listen_addr,0,sizeof(struct sockaddr_atmsvc)); memset(&mpc_control.data_listen_addr,0,sizeof(struct sockaddr_atmsvc)); memset(&lec_addr,0,sizeof(struct sockaddr_atmsvc)); memset(&mps_ctrl_addr,0,sizeof(struct sockaddr_atmsvc)); memset(&msg,0,sizeof(struct k_message)); memset(&mpc_control,0,sizeof(mpc_control)); mpc_control.elan_name[32] = '\0'; init_default_addresses(&control_listen_addr, &mpc_control.data_listen_addr); while( opt_ret != -1 ){ opt_ret = getopt(argc, argv, "h:s:l:c:L:n:C:i:m:"); switch(opt_ret) { case 'h': usage(argv[0]); exit(0); break; case 's': if(text2atm(optarg,(struct sockaddr *)&control_listen_addr, sizeof(struct sockaddr_atmsvc),T2A_SVC | T2A_NAME)<0){ printf("mpcd: main.c: text2atm failed.\n"); usage(argv[0]); exit(1); } memcpy(mpc_control.OWN_ATM_ADDRESS,control_listen_addr.sas_addr.prv, ATM_ESA_LEN); break; case 'l': if(text2atm(optarg,(struct sockaddr *)&mpc_control.data_listen_addr, sizeof(struct sockaddr_atmsvc),T2A_SVC | T2A_NAME)<0){ printf("mpcd: main.c: text2atm failed.\n"); usage(argv[0]); exit(1); } break; case 'c': if(text2atm(optarg,(struct sockaddr *)&mps_ctrl_addr, sizeof(struct sockaddr_atmsvc),T2A_SVC | T2A_NAME)<0){ printf("mpcd: main.c: text2atm failed.\n"); usage(argv[0]); exit(1); } memcpy(mpc_control.MPS_CTRL_ATM_ADDR,mps_ctrl_addr.sas_addr.prv,ATM_ESA_LEN); mpc_control.mps_ctrl_addr_set = 1; break; case 'L': if(text2atm(optarg,(struct sockaddr *)&lec_addr, sizeof(struct sockaddr_atmsvc),T2A_SVC | T2A_NAME)<0){ printf("mpcd: main.c: text2atm failed.\n"); usage(argv[0]); exit(1); } memcpy(mpc_control.LEC_ADDRESS,lec_addr.sas_addr.prv,ATM_ESA_LEN); mpc_control.use_lecs = 1; break; case 'n': strncpy(mpc_control.elan_name,optarg,33); break; case 'C': if(text2atm(optarg,(struct sockaddr *)&mpc_control.lecs_address, sizeof(struct sockaddr_atmsvc),T2A_SVC | T2A_NAME)<0){ printf("mpcd: main.c: text2atm failed.\n"); usage(argv[0]); exit(1); } break; case 'm': strncpy(mpc_control.MPS_MAC_ADDRESS,optarg,13); mpc_control.mps_mac_addr_set = 1; break; case 'i': mpc_control.INTERFACE_NUMBER = atoi(optarg); break; } } if (argc != optind) { usage(argv[0]); exit(1); } while(1){ create_kernel_socket(mpc_control.INTERFACE_NUMBER); if(mpc_control.use_lecs){ get_mpc_config(&mpc_control.lecs_address, mpc_control.LEC_ADDRESS, mpc_control.elan_name); } msg.type = SET_MPC_CTRL_ADDR; memcpy(msg.MPS_ctrl,mpc_control.OWN_ATM_ADDRESS,ATM_ESA_LEN); if (send_to_kernel(&msg) < 0) { printf("mpcd: main.c: send_to_kernel(SET_MPC_CTRL_ADDR) failed\n"); exit(1); } if(mpc_control.mps_mac_addr_set) set_mps_mac_addr(); listen_to_MPS( control_listen_addr ); if ( (listen_socket = get_listen_socket(&mpc_control.data_listen_addr)) < 0) { printf("mpcd: main.c: listen_socket creation failed\n"); exit (1); } signal(SIGHUP, signal_handler); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); signal(SIGABRT, signal_handler); signal(SIGTERM, signal_handler); main_loop(listen_socket); sleep(5); printf("mpcd: main.c: going back to main loop...\n"); } return 0; }
/* * Initialize the static structure to zeros, then * apply all the default values. */ static inline void init_resource(CONFIG *config, int type, RES_ITEM *items, int pass) { memset(config->m_res_all, 0, config->m_res_all_size); res_all.hdr.rcode = type; res_all.hdr.refcnt = 1; /* * Set defaults in each item. We only set defaults in pass 1. */ if (pass == 1) { int i; for (i = 0; items[i].name; i++) { Dmsg3(900, "Item=%s def=%s defval=%s\n", items[i].name, (items[i].flags & ITEM_DEFAULT) ? "yes" : "no", (items[i].default_value) ? items[i].default_value : "None"); /* * Sanity check. * * Items with a default value but without the ITEM_DEFAULT flag set * are most of the time an indication of a programmers error. */ if (items[i].default_value != NULL && !(items[i].flags & ITEM_DEFAULT)) { Pmsg1(000, _("Found config item %s which has default value but no ITEM_DEFAULT flag set\n"), items[i].name); items[i].flags |= ITEM_DEFAULT; } if (items[i].flags & ITEM_DEFAULT && items[i].default_value != NULL) { /* * First try to handle the generic types. */ if (items[i].handler == store_bit) { if (bstrcasecmp(items[i].default_value, "on")) { *(uint32_t *)(items[i].value) |= items[i].code; } else if (bstrcasecmp(items[i].default_value, "off")) { *(uint32_t *)(items[i].value) &= ~(items[i].code); } } else if (items[i].handler == store_bool) { if (bstrcasecmp(items[i].default_value, "yes") || bstrcasecmp(items[i].default_value, "true")) { *(bool *)(items[i].value) = true; } else if (bstrcasecmp(items[i].default_value, "no") || bstrcasecmp(items[i].default_value, "false")) { *(bool *)(items[i].value) = false; } } else if (items[i].handler == store_pint32 || items[i].handler == store_int32 || items[i].handler == store_size32) { *(uint32_t *)(items[i].value) = str_to_int32(items[i].default_value); } else if (items[i].handler == store_int64) { *(int64_t *)(items[i].value) = str_to_int64(items[i].default_value); } else if (items[i].handler == store_size64) { *(uint64_t *)(items[i].value) = str_to_uint64(items[i].default_value); } else if (items[i].handler == store_speed) { *(uint64_t *)(items[i].value) = str_to_uint64(items[i].default_value); } else if (items[i].handler == store_time) { *(utime_t *)(items[i].value) = str_to_int64(items[i].default_value); } else if (items[i].handler == store_strname || items[i].handler == store_str) { *items[i].value = bstrdup(items[i].default_value); } else if (items[i].handler == store_dir) { char pathname[MAXSTRING]; bstrncpy(pathname, items[i].default_value, sizeof(pathname)); if (pathname[0] != '|') { do_shell_expansion(pathname, sizeof(pathname)); } *items[i].value = bstrdup(pathname); } else if (items[i].handler == store_addresses) { init_default_addresses((dlist **)items[i].value, items[i].default_value); } else { /* * None of the generic types fired if there is a registered callback call that now. */ if (config->m_init_res) { config->m_init_res(&items[i]); } } } /* * If this triggers, take a look at lib/parse_conf.h */ if (i >= MAX_RES_ITEMS) { Emsg1(M_ERROR_TERM, 0, _("Too many items in %s resource\n"), resources[type - r_first]); } } } }
/* * Initialize the static structure to zeros, then apply all the default values. */ void CONFIG::init_resource(int type, RES_ITEM *items, int pass) { URES *res_all; memset(m_res_all, 0, m_res_all_size); res_all = ((URES *)m_res_all); res_all->hdr.rcode = type; res_all->hdr.refcnt = 1; /* * See what pass of the config parsing this is. */ switch (pass) { case 1: { /* * Set all defaults for types that are filled in pass 1 of the config parser. */ int i; for (i = 0; items[i].name; i++) { Dmsg3(900, "Item=%s def=%s defval=%s\n", items[i].name, (items[i].flags & CFG_ITEM_DEFAULT) ? "yes" : "no", (items[i].default_value) ? items[i].default_value : "None"); /* * Sanity check. * * Items with a default value but without the CFG_ITEM_DEFAULT flag set * are most of the time an indication of a programmers error. */ if (items[i].default_value != NULL && !(items[i].flags & CFG_ITEM_DEFAULT)) { Pmsg1(000, _("Found config item %s which has default value but no CFG_ITEM_DEFAULT flag set\n"), items[i].name); items[i].flags |= CFG_ITEM_DEFAULT; } /* * See if the CFG_ITEM_DEFAULT flag is set and a default value is available. */ if (items[i].flags & CFG_ITEM_DEFAULT && items[i].default_value != NULL) { /* * First try to handle the generic types. */ switch (items[i].type) { case CFG_TYPE_BIT: if (bstrcasecmp(items[i].default_value, "on")) { set_bit(items[i].code, items[i].bitvalue); } else if (bstrcasecmp(items[i].default_value, "off")) { clear_bit(items[i].code, items[i].bitvalue); } break; case CFG_TYPE_BOOL: if (bstrcasecmp(items[i].default_value, "yes") || bstrcasecmp(items[i].default_value, "true")) { *(items[i].boolvalue) = true; } else if (bstrcasecmp(items[i].default_value, "no") || bstrcasecmp(items[i].default_value, "false")) { *(items[i].boolvalue) = false; } break; case CFG_TYPE_PINT32: case CFG_TYPE_INT32: case CFG_TYPE_SIZE32: *(items[i].ui32value) = str_to_int32(items[i].default_value); break; case CFG_TYPE_INT64: *(items[i].i64value) = str_to_int64(items[i].default_value); break; case CFG_TYPE_SIZE64: *(items[i].ui64value) = str_to_uint64(items[i].default_value); break; case CFG_TYPE_SPEED: *(items[i].ui64value) = str_to_uint64(items[i].default_value); break; case CFG_TYPE_TIME: *(items[i].utimevalue) = str_to_int64(items[i].default_value); break; case CFG_TYPE_STRNAME: case CFG_TYPE_STR: *(items[i].value) = bstrdup(items[i].default_value); break; case CFG_TYPE_DIR: { POOL_MEM pathname(PM_FNAME); pm_strcpy(pathname, items[i].default_value); if (*pathname.c_str() != '|') { int size; /* * Make sure we have enough room */ size = pathname.size() + 1024; pathname.check_size(size); do_shell_expansion(pathname.c_str(), pathname.size()); } *items[i].value = bstrdup(pathname.c_str()); break; } case CFG_TYPE_ADDRESSES: init_default_addresses(items[i].dlistvalue, items[i].default_value); break; default: /* * None of the generic types fired if there is a registered callback call that now. */ if (m_init_res) { m_init_res(&items[i], pass); } break; } if (!m_omit_defaults) { set_bit(i, res_all->hdr.inherit_content); } } /* * If this triggers, take a look at lib/parse_conf.h */ if (i >= MAX_RES_ITEMS) { Emsg1(M_ERROR_TERM, 0, _("Too many items in %s resource\n"), m_resources[type - m_r_first]); } } break; } case 2: { /* * Set all defaults for types that are filled in pass 2 of the config parser. */ int i; for (i = 0; items[i].name; i++) { Dmsg3(900, "Item=%s def=%s defval=%s\n", items[i].name, (items[i].flags & CFG_ITEM_DEFAULT) ? "yes" : "no", (items[i].default_value) ? items[i].default_value : "None"); /* * See if the CFG_ITEM_DEFAULT flag is set and a default value is available. */ if (items[i].flags & CFG_ITEM_DEFAULT && items[i].default_value != NULL) { /* * First try to handle the generic types. */ switch (items[i].type) { case CFG_TYPE_ALIST_STR: if (!*items[i].alistvalue) { *(items[i].alistvalue) = New(alist(10, owned_by_alist)); } (*(items[i].alistvalue))->append(bstrdup(items[i].default_value)); break; case CFG_TYPE_ALIST_DIR: { POOL_MEM pathname(PM_FNAME); if (!*items[i].alistvalue) { *(items[i].alistvalue) = New(alist(10, owned_by_alist)); } pm_strcpy(pathname, items[i].default_value); if (*items[i].default_value != '|') { int size; /* * Make sure we have enough room */ size = pathname.size() + 1024; pathname.check_size(size); do_shell_expansion(pathname.c_str(), pathname.size()); } (*(items[i].alistvalue))->append(bstrdup(pathname.c_str())); break; } default: /* * None of the generic types fired if there is a registered callback call that now. */ if (m_init_res) { m_init_res(&items[i], pass); } break; } if (!m_omit_defaults) { set_bit(i, res_all->hdr.inherit_content); } } /* * If this triggers, take a look at lib/parse_conf.h */ if (i >= MAX_RES_ITEMS) { Emsg1(M_ERROR_TERM, 0, _("Too many items in %s resource\n"), m_resources[type - m_r_first]); } } break; } default: break; } }