static void conn_main(void) { const AtmAddr_t *addr; int main_conn; const char *str; int i; addr = get_var_addr(&conn_unit, "S1"); if (addr == NULL) { dump_printf(EL_ERROR, "S1 (LES Address) must be specified"); event_put(&conn_unit, CE_EXIT, NULL); } else { str = get_var_str(&conn_unit,"S2"); if (str == NULL) { set_var_str(&conn_unit, "S2", S2_default); } i = get_var_int(&conn_unit,"S3"); if (i == 0) { set_var_int(&conn_unit,"S3", S3_default); } i = get_var_int(&conn_unit,"S4"); if (i == 0) { set_var_int(&conn_unit,"S4", S4_default); } i = get_var_int(&conn_unit,"S5"); if (i == 0) { set_var_int(&conn_unit,"S5", S5_default); } addr = get_var_addr(&conn_unit, "S6"); if (addr == NULL) { dump_printf(EL_ERROR, "S6 (BUS Address) must be specified"); event_put(&conn_unit, CE_EXIT, NULL); } else { main_conn = atm_create_socket(CONTROL_DIRECT, get_var_addr(&conn_unit, "S1")); if (main_conn >= 0) { (void)conn_add(CT_MAIN, main_conn,0); } } } }
int main(int argc, char **argv) { int i =0; char *config_file =NULL; char *listen_addr = NULL; int fd_arr[MAX_FD]; int no_fds=1; int just_dump=0; fd_set fds; struct sockaddr_atmsvc client; int len; unsigned char buffer[P_SIZE]; while(i!=-1) { i = getopt(argc, argv, "f:l:d"); switch(i) { case 'd': printf("Dumping databasefile\n"); just_dump=1; break; case 'f': if (config_file) { usage(argv[0]); exit(-1); } config_file = (char*)mem_alloc(COMP_NAME, strlen(optarg)+1); if (!config_file) { exit(-1); } memcpy(config_file, optarg, strlen(optarg)+1); break; case 'l': if (listen_addr) { usage(argv[0]); exit(-1); } listen_addr = (char*)mem_alloc(COMP_NAME, strlen(optarg)+1); if (!listen_addr) exit(-1); memcpy(listen_addr, optarg, strlen(optarg)+1); break; case -1: break; default: usage(argv[0]); exit(-1); } } if (argc != optind) { usage(argv[0]); exit(-1); } /* Following gets run in the beginning or when lecs is restarted */ while (stay_alive) { /* Read configuration file */ if (config_file) { if (load_db(config_file)<0) exit(-1); } else { if (load_db(DEFAULT_CONFIG)<0) exit(-1); } if (just_dump) { dump_db(NULL); exit(0); } /* Reserve signals */ signal(SIGHUP, sig_reset); signal(SIGINT, sig_kill); signal(SIGQUIT, sig_kill); signal(SIGABRT, sig_kill); signal(SIGTERM, sig_kill); signal(SIGSEGV, sig_kill); /* CHANGE: First parameter, then configuration file! */ fd_arr[0] = atm_create_socket(CONFIGURATION_DIRECT, get_lecs_addr()); no_fds=1; if (fd_arr[0] <0) { stay_alive=0; /* No need to go on */ } while(!reset && stay_alive) { FD_ZERO(&fds); for(i=0;i<no_fds;i++) { FD_SET(fd_arr[i],&fds); } if (select(MAX_FD, &fds, NULL, NULL, NULL)<0) { perror("select(MAX_FD,...)"); stay_alive=0; } else { if (FD_ISSET(fd_arr[0],&fds)) { /* Incoming call */ if (no_fds == MAX_FD) { close(fd_arr[1]); /* Oldest */ memmove(&fd_arr[1], &fd_arr[2], sizeof(int)*(MAX_FD-2)); no_fds--; } len = sizeof(client); fd_arr[no_fds] = accept(fd_arr[0], (struct sockaddr*)&client, &len); if (fd_arr[no_fds]<0) { if (errno==ENETRESET) reset=1; if (errno==EUNATCH) stay_alive=1; } else { no_fds++; } } for(i=1;i<no_fds;i++) { if (FD_ISSET(fd_arr[i],&fds)) { len = read(fd_arr[i], buffer, P_SIZE); if (len <0 && (errno == ENETRESET || errno == EUNATCH)) { reset=0; } if (len<=0) { close(fd_arr[i]); memmove(&fd_arr[i], &fd_arr[i+1], sizeof(int)*(--no_fds -i)); i--; } else { if(send_response(fd_arr[i], buffer, len)<0) { close(fd_arr[i]); memmove(&fd_arr[i], &fd_arr[i+1], sizeof(int)*(--no_fds -i)); } } } } } } /* This gets done if a signal has been caught, or if network resets/becomes unavailable */ reset=0; for(i=0;i<no_fds;i++) close(fd_arr[i]); no_fds=0; reset_db(); } return 0; }