/** * destroy function */ static void destroy(void) { LM_DBG("destroying module ...\n"); ds_destroy_list(); if(ds_db_url.s) ds_disconnect_db(); }
/** * destroy function */ static void destroy(void) { LM_DBG("destroying module ...\n"); ds_destroy_list(); /* destroy blacklists */ destroy_ds_bls(); }
/*! \brief * destroy function */ static void destroy(void) { ds_destroy_list(); if(ds_db_url.s) ds_disconnect_db(); ds_hash_load_destroy(); if(ds_ping_reply_codes) shm_free(ds_ping_reply_codes); }
int ds_load_list(char *lfile) { char line[256], *p; FILE *f = NULL; int id, i, j, setn; str uri; struct sip_uri puri; ds_dest_p dp = NULL, dp0 = NULL; ds_set_p sp = NULL, sp0 = NULL; ds_setidx_p si = NULL, si0 = NULL; if(lfile==NULL || strlen(lfile)<=0) { LOG(L_ERR, "DISPATCHER:ds_load_list: bad list file\n"); return -1; } f = fopen(lfile, "r"); if(f==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: can't open list file [%s]\n", lfile); return -1; } id = setn = 0; p = fgets(line, 256, f); while(p) { /* eat all white spaces */ while(*p && (*p==' ' || *p=='\t' || *p=='\r' || *p=='\n')) p++; if(*p=='\0' || *p=='#') goto next_line; /* get set id */ id = 0; while(*p>='0' && *p<='9') { id = id*10+ (*p-'0'); p++; } /* eat all white spaces */ while(*p && (*p==' ' || *p=='\t' || *p=='\r' || *p=='\n')) p++; if(*p=='\0' || *p=='#') { LOG(L_ERR, "DISPATCHER:ds_load_list: bad line [%s]\n", line); goto error; } /* get uri */ uri.s = p; while(*p && *p!=' ' && *p!='\t' && *p!='\r' && *p!='\n' && *p!='#') p++; uri.len = p-uri.s; /* check uri */ if(parse_uri(uri.s, uri.len, &puri)!=0) { LOG(L_ERR, "DISPATCHER:ds_load_list: bad uri [%.*s]\n", uri.len, uri.s); goto error; } /* check index */ si = _ds_index; while(si) { if(si->id == id) break; si = si->next; } if(si==NULL) { si = (ds_setidx_p)pkg_malloc(sizeof(ds_setidx_t)); if(si==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: no more memory\n"); goto error; } memset(si, 0, sizeof(ds_setidx_t)); si->id = id; si->next = _ds_index; if(_ds_index!=NULL) si->index = _ds_index->index + 1; _ds_index = si; } /* get dest set */ sp = _ds_list; while(sp) { if(sp->id == id) break; sp = sp->next; } if(sp==NULL) { sp = (ds_set_p)pkg_malloc(sizeof(ds_set_t)); if(sp==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: no more memory.\n"); goto error; } memset(sp, 0, sizeof(ds_set_t)); sp->next = _ds_list; _ds_list = sp; setn++; } sp->id = id; sp->nr++; sp->index = si->index; /* store uri */ dp = (ds_dest_p)pkg_malloc(sizeof(ds_dest_t)); if(dp==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: no more memory!\n"); goto error; } memset(dp, 0, sizeof(ds_dest_t)); dp->uri.s = (char*)pkg_malloc(uri.len+1); if(dp->uri.s==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: no more memory!!\n"); pkg_free(dp); goto error; } strncpy(dp->uri.s, uri.s, uri.len); dp->uri.s[uri.len]='\0'; dp->uri.len = uri.len; dp->next = sp->dlist; sp->dlist = dp; DBG("DISPATCHER:ds_load_list: dest [%d/%d/%d] <%.*s>\n", sp->index, sp->id, sp->nr, dp->uri.len, dp->uri.s); next_line: p = fgets(line, 256, f); } fclose(f); f = NULL; DBG("DISPATCHER:ds_load_list: found [%d] dest sets\n", setn); /* re-index destination sets for fast access */ sp0 = (ds_set_p)pkg_malloc(setn*sizeof(ds_set_t)); if(sp0==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: no more memory!!\n"); goto error; } memset(sp0, 0, setn*sizeof(ds_set_t)); sp = _ds_list; for(i=setn-1; i>=0; i--) { memcpy(&sp0[i], sp, sizeof(ds_set_t)); if(i==setn-1) sp0[i].next = NULL; else sp0[i].next = &sp0[i+1]; dp0 = (ds_dest_p)pkg_malloc(sp0[i].nr*sizeof(ds_dest_t)); if(dp0==NULL) { LOG(L_ERR, "DISPATCHER:ds_load_list: no more memory!\n"); ds_destroy_list(); goto error; } memset(dp0, 0, sp0[i].nr*sizeof(ds_dest_t)); dp = sp0[i].dlist; for(j=sp0[i].nr-1; j>=0; j--) { memcpy(&dp0[j], dp, sizeof(ds_dest_t)); if(j==sp0[j].nr-1) dp0[j].next = NULL; else dp0[j].next = &dp0[j+1]; dp = dp->next; } sp0[i].dlist = dp0; sp = sp->next; } sp = _ds_list; _ds_list = sp0; while(sp) { dp = sp->dlist; while(dp) { dp0 = dp; dp = dp->next; pkg_free(dp0); } sp0 = sp; sp = sp->next; pkg_free(sp0); } return 0; error: if(f!=NULL) fclose(f); si = _ds_index; while(si) { si0 = si; si = si->next; pkg_free(si0); } _ds_index = NULL; sp = _ds_list; while(sp) { dp = sp->dlist; while(dp) { if(dp->uri.s!=NULL) pkg_free(dp->uri.s); dp->uri.s=NULL; dp0 = dp; dp = dp->next; pkg_free(dp0); } sp0 = sp; sp = sp->next; pkg_free(sp0); } return -1; }
/** * destroy function */ static void destroy(void) { LM_DBG("destroying module ...\n"); ds_destroy_list(); }
/** * destroy function */ void destroy(void) { DBG("DISPATCHER: destroy module ...\n"); ds_destroy_list(); }