extern int gametrans_unload(void) { t_elem * curr; t_gametrans * entry; if (gametrans_head) { LIST_TRAVERSE(gametrans_head,curr) { if (!(entry = elem_get_data(curr))) eventlog(eventlog_level_error,"gametrans_unload","found NULL entry in list"); else { netaddr_destroy(entry->exclude); addr_destroy(entry->output); addr_destroy(entry->client); addr_destroy(entry->viewer); free(entry); } list_remove_elem(gametrans_head,curr); } list_destroy(gametrans_head); gametrans_head = NULL; } return 0; }
extern int trans_unload(void) { t_elem *curr; t_trans *entry; if (trans_head) { LIST_TRAVERSE(trans_head, curr) { if (!(entry = (t_trans*)elem_get_data(curr))) { eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list"); } else { netaddr_destroy(entry->network); addr_destroy(entry->output); addr_destroy(entry->input); xfree(entry); } list_remove_elem(trans_head, &curr); } list_destroy(trans_head); trans_head = NULL; } return 0; }
extern int gametrans_load(char const * filename) { FILE * fp; unsigned int line; unsigned int pos; char * buff; char * temp; char const * viewer; char const * client; char const * output; char const * exclude; t_gametrans * entry; if (!filename) { eventlog(eventlog_level_error,"gametrans_load","got NULL filename"); return -1; } if (!(gametrans_head = list_create())) { eventlog(eventlog_level_error,"gametrans_load","could not create list"); return -1; } if (!(fp = fopen(filename,"r"))) { eventlog(eventlog_level_error,"gametrans_load","could not open file \"%s\" for reading (fopen: %s)",filename,strerror(errno)); list_destroy(gametrans_head); gametrans_head = NULL; return -1; } for (line=1; (buff = file_get_line(fp)); line++) { for (pos=0; buff[pos]=='\t' || buff[pos]==' '; pos++); if (buff[pos]=='\0' || buff[pos]=='#') { free(buff); continue; } if ((temp = strrchr(buff,'#'))) { unsigned int len; unsigned int endpos; *temp = '\0'; len = strlen(buff)+1; for (endpos=len-1; buff[endpos]=='\t' || buff[endpos]==' '; endpos--); buff[endpos+1] = '\0'; } if (!(viewer = strtok(buff," \t"))) /* strtok modifies the string it is passed */ { eventlog(eventlog_level_error,"gametrans_load","missing viewer on line %u of file \"%s\"",line,filename); free(buff); continue; } if (!(client = strtok(NULL," \t"))) { eventlog(eventlog_level_error,"gametrans_load","missing client on line %u of file \"%s\"",line,filename); free(buff); continue; } if (!(output = strtok(NULL," \t"))) { eventlog(eventlog_level_error,"gametrans_load","missing output on line %u of file \"%s\"",line,filename); free(buff); continue; } if (!(exclude = strtok(NULL," \t"))) exclude = "0.0.0.0/0"; /* no excluded network address */ if (!(entry = malloc(sizeof(t_gametrans)))) { eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for entry"); free(buff); continue; } if (!(entry->viewer = addr_create_str(viewer,0,0))) { eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for viewer address"); free(entry); free(buff); continue; } if (!(entry->client = addr_create_str(client,0,6112))) { eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for client address"); addr_destroy(entry->viewer); free(entry); free(buff); continue; } if (!(entry->output = addr_create_str(output,0,6112))) { eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for output address"); addr_destroy(entry->client); addr_destroy(entry->viewer); free(entry); free(buff); continue; } if (!(entry->exclude = netaddr_create_str(exclude))) { eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for exclude address"); addr_destroy(entry->output); addr_destroy(entry->client); addr_destroy(entry->viewer); free(entry); free(buff); continue; } free(buff); if (list_append_data(gametrans_head,entry)<0) { eventlog(eventlog_level_error,"gametrans_load","could not append item"); netaddr_destroy(entry->exclude); addr_destroy(entry->output); addr_destroy(entry->client); addr_destroy(entry->viewer); free(entry); } } if (fclose(fp)<0) eventlog(eventlog_level_error,"gametrans_load","could not close gametrans file \"%s\" after reading (fclose: %s)",filename,strerror(errno)); return 0; }