static int load_module(void) { struct ast_config *cfg; int res; const char *tmp; if ((cfg = ast_config_load(cdr_config))) { ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "usegmtime")), RADIUS_FLAG_USEGMTIME); ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "loguniqueid")), RADIUS_FLAG_LOGUNIQUEID); ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "loguserfield")), RADIUS_FLAG_LOGUSERFIELD); if ((tmp = ast_variable_retrieve(cfg, "radius", "radiuscfg"))) ast_copy_string(radiuscfg, tmp, sizeof(radiuscfg)); ast_config_destroy(cfg); } else return AST_MODULE_LOAD_DECLINE; /* start logging */ rc_openlog("asterisk"); /* read radiusclient-ng config file */ if (!(rh = rc_read_config(radiuscfg))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng configuration file %s.\n", radiuscfg); return AST_MODULE_LOAD_DECLINE; } /* read radiusclient-ng dictionaries */ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n"); return AST_MODULE_LOAD_DECLINE; } res = ast_cdr_register(name, desc, radius_log); return AST_MODULE_LOAD_SUCCESS; }
static int load_module(void) { struct ast_config *cfg; struct ast_flags config_flags = { 0 }; const char *tmp; if ((cfg = ast_config_load(cel_config, config_flags))) { ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "usegmtime")), RADIUS_FLAG_USEGMTIME); if ((tmp = ast_variable_retrieve(cfg, "radius", "radiuscfg"))) { ast_copy_string(radiuscfg, tmp, sizeof(radiuscfg)); } ast_config_destroy(cfg); } else { return AST_MODULE_LOAD_DECLINE; } /* * start logging * * NOTE: Yes this causes a slight memory leak if the module is * unloaded. However, it is better than a crash if cdr_radius * and cel_radius are both loaded. */ tmp = ast_strdup("asterisk"); if (tmp) { rc_openlog((char *) tmp); } /* read radiusclient-ng config file */ if (!(rh = rc_read_config(radiuscfg))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng configuration file %s.\n", radiuscfg); return AST_MODULE_LOAD_DECLINE; } /* read radiusclient-ng dictionaries */ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n"); rc_destroy(rh); rh = NULL; return AST_MODULE_LOAD_DECLINE; } event_sub = ast_event_subscribe(AST_EVENT_CEL, radius_log, "CEL Radius Logging", NULL, AST_EVENT_IE_END); if (!event_sub) { rc_destroy(rh); rh = NULL; return AST_MODULE_LOAD_DECLINE; } else { return AST_MODULE_LOAD_SUCCESS; } }
static int load_module(void) { struct ast_config *cfg; struct ast_flags config_flags = { 0 }; const char *tmp; if ((cfg = ast_config_load(cdr_config, config_flags)) && cfg != CONFIG_STATUS_FILEINVALID) { ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "usegmtime")), RADIUS_FLAG_USEGMTIME); ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "loguniqueid")), RADIUS_FLAG_LOGUNIQUEID); ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "loguserfield")), RADIUS_FLAG_LOGUSERFIELD); if ((tmp = ast_variable_retrieve(cfg, "radius", "radiuscfg"))) ast_copy_string(radiuscfg, tmp, sizeof(radiuscfg)); ast_config_destroy(cfg); } else return AST_MODULE_LOAD_DECLINE; /* * start logging * * NOTE: Yes this causes a slight memory leak if the module is * unloaded. However, it is better than a crash if cdr_radius * and cel_radius are both loaded. */ tmp = ast_strdup("asterisk"); if (tmp) { rc_openlog((char *) tmp); } /* read radiusclient-ng config file */ if (!(rh = rc_read_config(radiuscfg))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng configuration file %s.\n", radiuscfg); return AST_MODULE_LOAD_DECLINE; } /* read radiusclient-ng dictionaries */ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n"); rc_destroy(rh); rh = NULL; return AST_MODULE_LOAD_DECLINE; } if (ast_cdr_register(name, desc, radius_log)) { rc_destroy(rh); rh = NULL; return AST_MODULE_LOAD_DECLINE; } else { return AST_MODULE_LOAD_SUCCESS; } }
int init_radius_handle(void) { int i; DICT_ATTR *da; char name[256]; map_list *mp; if (!config_file) { LM_ERR("radius configuration file not set\n"); return -1; } if ( syslog_name!=NULL && syslog_name[0]!=0 ) rc_openlog(syslog_name); if (!(rh = rc_read_config(config_file))) { LM_ERR("failed to open radius config file: %s\n", config_file); return -1; } if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) { LM_ERR("failed to read radius dictionary\n"); return -1; } attr = rc_dict_findattr(rh, "SIP-AVP"); /* initialize values for the attributes in sets */ for (i = 0; i < set_size; i++) { mp = sets[i]->parsed; while (mp) { sprintf(name,"%.*s", mp->name.len, mp->name.s); da = rc_dict_findattr(rh, name); if (!da) { LM_ERR("attribute not found %s\n", name); return -1; } else mp->value = da->value; mp = mp->next; } } return 0; }
static int mod_init(void) { DICT_VENDOR *vend; memset(attrs, 0, sizeof(attrs)); memset(vals, 0, sizeof(vals)); attrs[A_USER_NAME].n = "User-Name"; attrs[A_SER_SERVICE_TYPE].n = "SER-Service-Type"; attrs[A_SER_ATTR].n = "SER-Attr"; attrs[A_SER_DID].n = "SER-DID"; attrs[A_SER_URI_SCHEME].n = "SER-Uri-Scheme"; vals[V_GET_URI_ATTRS].n = "Get-URI-Attrs"; vals[V_GET_USER_ATTRS].n = "Get-User-Attrs"; /* open log */ rc_openlog("ser"); /* read config */ if ((rh = rc_read_config(radius_config)) == NULL) { LOG(L_ERR, "avp_radius: Error opening radius config file: %s\n", radius_config); return -1; } /* read dictionary */ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) { LOG(L_ERR, "avp_radius: Error reading radius dictionary\n"); return -1; } vend = rc_dict_findvend(rh, "iptelorg"); if (vend == NULL) { ERR("RADIUS dictionary is missing required vendor 'iptelorg'\n"); return -1; } INIT_AV(rh, attrs, vals, "avp", -1, -1); return 0; }
int pmip_mn_to_hnp_cache_init(void) { dbg ("\n"); memset(g_mn_hn_map, 0, sizeof(mnid_hnp_t) * MAX_MOBILES); rc_openlog("pmip_radius_client"); if ((g_rh = rc_read_config(conf.RadiusClientConfigFile)) == NULL) { dbg ("ERROR INIT CLIENT RADIUS\n"); return ERROR_RC; } else { dbg ("RADIUS client radius read config file OK\n"); } if (rc_read_dictionary(g_rh, rc_conf_str(g_rh, "dictionary")) != 0) { dbg ("ERROR INIT CLIENT RADIUS DICTIONNARY\n"); return ERROR_RC; } else { dbg ("client radius read dictionnary file OK\n"); } g_default_realm = rc_conf_str(g_rh, "default_realm"); return 0; }
int main (int argc, char **argv) { char username[128]; char passwd[AUTH_PASS_LEN + 1]; int tries, remaining, c; UINT4 client_port; void (*login_func)(char *); FILE *fp; char buf[4096]; char tty[1024], *p; int noissue = 0; int maxtries = 0; char *ttyn = NULL; char *path_radiusclient_conf = RC_CONFIG_FILE; extern char *optarg; extern int optind; pname = (pname = strrchr(argv[0],'/'))?pname+1:argv[0]; rc_openlog(pname); while ((c = getopt(argc,argv,"f:m:i:nhV")) > 0) { switch(c) { case 'f': path_radiusclient_conf = optarg; break; case 'i': ttyn = optarg; break; case 'n': noissue = 1; break; case 'm': maxtries = atoi(optarg); break; case 'V': version(); break; case 'h': usage(); break; default: exit(ERROR_RC); break; } } if (rc_read_config(path_radiusclient_conf) != 0) exit(ERROR_RC); if (rc_read_dictionary(rc_conf_str("dictionary")) != 0) exit (ERROR_RC); if (rc_read_mapfile(rc_conf_str("mapfile")) != 0) exit (ERROR_RC); if (ttyn != NULL) { client_port = rc_map2id(ttyn); if ((p = strrchr(ttyn, '/')) == NULL) strncpy(tty, ttyn, sizeof(tty)); else strncpy(tty, p+1, sizeof(tty)); } else { ttyn = ttyname(0); if (ttyn) { if ((p = strrchr(ttyn, '/')) == NULL) strncpy(tty, ttyn, sizeof(tty)); else strncpy(tty, p+1, sizeof(tty)); client_port = rc_map2id(ttyn); } else { *tty = '\0'; client_port = 0; } } #ifdef SETVBUF_REVERSED setvbuf(stdout, _IONBF, NULL, 0); #else setvbuf(stdout, NULL, _IONBF, 0); #endif if ((argc - optind) == 1) { strncpy(username,argv[optind], sizeof(username)); } else { *username = '******'; if (!noissue) { if (rc_conf_str("issue") && ((fp = fopen(rc_conf_str("issue"), "r")) != NULL)) { while (fgets(buf, sizeof(buf), fp) != NULL) fputs(subst_placeholders(buf, tty), stdout); fflush(stdout); fclose(fp); } else { fputs(subst_placeholders(SC_DEFAULT_ISSUE, tty), stdout); fflush(stdout); } } } if ((env = rc_new_env(ENV_SIZE)) == NULL) { rc_log(LOG_CRIT, "rc_new_env: FATAL: out of memory"); abort(); } #ifdef SECURITY_DISABLED if (rc_import_env(env,environ) < 0) { rc_log(LOG_CRIT, "rc_import_env: FATAL: not enough space for environment (increase ENV_SIZE)"); abort(); } #else rc_add_env(env, "IFS", " "); rc_add_env(env, "PATH", RC_SECURE_PATH); #endif signal(SIGALRM, alarm_handler); remaining = rc_conf_int("login_timeout"); if (!maxtries) maxtries = rc_conf_int("login_tries"); tries = 1; while (tries <= maxtries) { alarm(remaining); while (!*username) { p = rc_getstr (SC_LOGIN, 1); if (p) strncpy(username, p, sizeof(username)); else exit (ERROR_RC); } p = rc_getstr(SC_PASSWORD,0); if (p) strncpy (passwd, p, sizeof (passwd)); else exit (ERROR_RC); remaining = alarm(0); login_func = NULL; if (rc_conf_int("auth_order") & AUTH_LOCAL_FST) { login_func = auth_local(username, passwd); if (!login_func) if (rc_conf_int("auth_order") & AUTH_RADIUS_SND) login_func = auth_radius(client_port, username, passwd); } else { login_func = auth_radius(client_port, username, passwd); if (!login_func) if (rc_conf_int("auth_order") & AUTH_LOCAL_SND) login_func = auth_local(username, passwd); } memset(passwd, '\0', sizeof(passwd)); if (login_func != NULL) if (login_allowed(tty)) { (*login_func)(username); } else { sleep(1); exit (ERROR_RC); } *username = '******'; if ((++tries) <= maxtries) { alarm(remaining); sleep(tries * 2); remaining = alarm(0); } } fprintf(stderr, SC_EXCEEDED); sleep(1); exit (ERROR_RC); }
static int load_module(void) { struct ast_config *cfg; struct ast_flags config_flags = { 0 }; const char *tmp; if ((cfg = ast_config_load(cel_config, config_flags))) { ast_set2_flag(&global_flags, ast_true(ast_variable_retrieve(cfg, "radius", "usegmtime")), RADIUS_FLAG_USEGMTIME); if ((tmp = ast_variable_retrieve(cfg, "radius", "radiuscfg"))) { ast_copy_string(radiuscfg, tmp, sizeof(radiuscfg)); } ast_config_destroy(cfg); } else { return AST_MODULE_LOAD_DECLINE; } /* create dir /var/lib/cdr if it does not exist. add by liucl */ if (access(cdr_directory,F_OK) == -1){ ast_log(LOG_DEBUG,"cdr_directory %s is not exist, I will create it.\n",cdr_directory); if(ast_mkdir(cdr_directory, 0755) == -1) { ast_log(LOG_ERROR,"Failed to create %s\n", cdr_directory); }else{ ast_log(LOG_DEBUG,"Create directory %s is OK\n",cdr_directory); } } /* liucl add end*/ /* * start logging * * NOTE: Yes this causes a slight memory leak if the module is * unloaded. However, it is better than a crash if cdr_radius * and cel_radius are both loaded. */ tmp = ast_strdup("asterisk"); if (tmp) { rc_openlog((char *) tmp); } /* read radiusclient-ng config file */ if (!(rh = rc_read_config(radiuscfg))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng configuration file %s.\n", radiuscfg); return AST_MODULE_LOAD_DECLINE; } /* read radiusclient-ng dictionaries */ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) { ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n"); rc_destroy(rh); rh = NULL; return AST_MODULE_LOAD_DECLINE; } if (ast_cel_backend_register(RADIUS_BACKEND_NAME, radius_log)) { rc_destroy(rh); rh = NULL; return AST_MODULE_LOAD_DECLINE; } else { /* * * Create a independent thread to monitoring /var/lib/cdr. * * If there is file in the directory, then send it to radius. * * add by liucl * */ start_monitor(); return AST_MODULE_LOAD_SUCCESS; } }
int main (int argc, char **argv) { int result = ERROR_RC; int c,i; char *p, msg[4096]; SERVER *srv; char *path_radiusclient_conf = RC_CONFIG_FILE; rc_handle *rh; extern int optind; pname = (pname = strrchr(argv[0],'/'))?pname+1:argv[0]; rc_openlog(pname); while ((c = getopt(argc,argv,"hVf:")) > 0) { switch(c) { case 'f': path_radiusclient_conf = optarg; break; case 'V': version(); break; case 'h': usage(); break; default: exit(ERROR_RC); break; } } argc -= optind; argv += optind; if ((rh = rc_read_config(path_radiusclient_conf)) == NULL) exit(ERROR_RC); if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) exit (ERROR_RC); if (argc > 0) { for (i = 0; i < argc; i++) { if ((p = strchr(argv[i], ':')) == NULL) { result = rc_check(rh, argv[i],rc_getport(AUTH), msg); } else if (!strcmp(p+1, "auth")) { *p = '\0'; result = rc_check(rh, argv[i],rc_getport(AUTH), msg); } else if (!strcmp(p+1, "acct")) { *p = '\0'; result = rc_check(rh, argv[i],rc_getport(ACCT), msg); } else { *p = '\0'; result = rc_check(rh, argv[i], atoi(p+1), msg); } if (result == OK_RC) fputs(msg, stdout); else printf(SC_STATUS_FAILED); } } else { srv = rc_conf_srv(rh, "authserver"); for(i=0; i<srv->max ; i++) { result = rc_check(rh, srv->name[i], srv->port[i], msg); fputs(msg, stdout); } srv = rc_conf_srv(rh, "acctserver"); for(i=0; i<srv->max ; i++) { result = rc_check(rh, srv->name[i], srv->port[i], msg); fputs(msg, stdout); } } }
int auth_call_radius(const uschar *s, uschar **errptr) { uschar *user; const uschar *radius_args = s; int result; int sep = 0; #ifdef RADIUS_LIB_RADLIB struct rad_handle *h; #else #ifdef RADIUS_LIB_RADIUSCLIENTNEW rc_handle *h; #endif VALUE_PAIR *send = NULL; VALUE_PAIR *received; unsigned int service = PW_AUTHENTICATE_ONLY; char msg[4096]; #endif user = string_nextinlist(&radius_args, &sep, big_buffer, big_buffer_size); if (user == NULL) user = US""; DEBUG(D_auth) debug_printf("Running RADIUS authentication for user \"%s\" " "and \"%s\"\n", user, radius_args); *errptr = NULL; /* Authenticate using the radiusclient library */ #ifndef RADIUS_LIB_RADLIB rc_openlog("exim"); #ifdef RADIUS_LIB_RADIUSCLIENT if (rc_read_config(RADIUS_CONFIG_FILE) != 0) *errptr = string_sprintf("RADIUS: can't open %s", RADIUS_CONFIG_FILE); else if (rc_read_dictionary(rc_conf_str("dictionary")) != 0) *errptr = string_sprintf("RADIUS: can't read dictionary"); else if (rc_avpair_add(&send, PW_USER_NAME, user, 0) == NULL) *errptr = string_sprintf("RADIUS: add user name failed\n"); else if (rc_avpair_add(&send, PW_USER_PASSWORD, CS radius_args, 0) == NULL) *errptr = string_sprintf("RADIUS: add password failed\n"); else if (rc_avpair_add(&send, PW_SERVICE_TYPE, &service, 0) == NULL) *errptr = string_sprintf("RADIUS: add service type failed\n"); #else /* RADIUS_LIB_RADIUSCLIENT unset => RADIUS_LIB_RADIUSCLIENT2 */ if ((h = rc_read_config(RADIUS_CONFIG_FILE)) == NULL) *errptr = string_sprintf("RADIUS: can't open %s", RADIUS_CONFIG_FILE); else if (rc_read_dictionary(h, rc_conf_str(h, "dictionary")) != 0) *errptr = string_sprintf("RADIUS: can't read dictionary"); else if (rc_avpair_add(h, &send, PW_USER_NAME, user, Ustrlen(user), 0) == NULL) *errptr = string_sprintf("RADIUS: add user name failed\n"); else if (rc_avpair_add(h, &send, PW_USER_PASSWORD, CS radius_args, Ustrlen(radius_args), 0) == NULL) *errptr = string_sprintf("RADIUS: add password failed\n"); else if (rc_avpair_add(h, &send, PW_SERVICE_TYPE, &service, 0, 0) == NULL) *errptr = string_sprintf("RADIUS: add service type failed\n"); #endif /* RADIUS_LIB_RADIUSCLIENT */ if (*errptr != NULL) { DEBUG(D_auth) debug_printf("%s\n", *errptr); return ERROR; } #ifdef RADIUS_LIB_RADIUSCLIENT result = rc_auth(0, send, &received, msg); #else result = rc_auth(h, 0, send, &received, msg); #endif DEBUG(D_auth) debug_printf("RADIUS code returned %d\n", result); switch (result) { case OK_RC: return OK; case REJECT_RC: case ERROR_RC: return FAIL; case TIMEOUT_RC: *errptr = US"RADIUS: timed out"; return ERROR; default: case BADRESP_RC: *errptr = string_sprintf("RADIUS: unexpected response (%d)", result); return ERROR; } #else /* RADIUS_LIB_RADLIB is set */ /* Authenticate using the libradius library */ h = rad_auth_open(); if (h == NULL) { *errptr = string_sprintf("RADIUS: can't initialise libradius"); return ERROR; } if (rad_config(h, RADIUS_CONFIG_FILE) != 0 || rad_create_request(h, RAD_ACCESS_REQUEST) != 0 || rad_put_string(h, RAD_USER_NAME, CS user) != 0 || rad_put_string(h, RAD_USER_PASSWORD, CS radius_args) != 0 || rad_put_int(h, RAD_SERVICE_TYPE, RAD_AUTHENTICATE_ONLY) != 0 || rad_put_string(h, RAD_NAS_IDENTIFIER, CS primary_hostname) != 0) { *errptr = string_sprintf("RADIUS: %s", rad_strerror(h)); result = ERROR; } else { result = rad_send_request(h); switch(result) { case RAD_ACCESS_ACCEPT: result = OK; break; case RAD_ACCESS_REJECT: result = FAIL; break; case -1: *errptr = string_sprintf("RADIUS: %s", rad_strerror(h)); result = ERROR; break; default: *errptr = string_sprintf("RADIUS: unexpected response (%d)", result); result= ERROR; break; } } if (*errptr != NULL) DEBUG(D_auth) debug_printf("%s\n", *errptr); rad_close(h); return result; #endif /* RADIUS_LIB_RADLIB */ }
int main (int argc, char **argv) { int result = ERROR_RC; VALUE_PAIR *send = NULL; UINT4 client_port; int c; VALUE_PAIR *vp; DICT_VALUE *dval; char *username, *service, *fproto, *type; char *path_radiusclient_conf = RC_CONFIG_FILE; char *ttyn = NULL; rc_handle *rh; extern char *optarg; pname = (pname = strrchr(argv[0],'/'))?pname+1:argv[0]; rc_openlog(pname); while ((c = getopt(argc,argv,"f:i:hV")) > 0) { switch(c) { case 'f': path_radiusclient_conf = optarg; break; case 'i': ttyn = optarg; break; case 'V': version(); break; case 'h': usage(); break; default: exit(ERROR_RC); break; } } if ((rh = rc_read_config(path_radiusclient_conf)) == NULL) exit(ERROR_RC); if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) exit (ERROR_RC); if (rc_read_mapfile(rh, rc_conf_str(rh, "mapfile")) != 0) exit (ERROR_RC); if (ttyn != NULL) { client_port = rc_map2id(rh, ttyn); } else { /* we take stdout here, because stdin is usually connected * to our input file */ if ((ttyn = ttyname(1)) != NULL) { client_port = rc_map2id(rh, ttyn); } else { client_port = 0; } } if ((send = rc_avpair_readin(rh, stdin))) { username = service = type = "(unknown)"; fproto = NULL; if ((vp = rc_avpair_get(send, PW_ACCT_STATUS_TYPE, 0)) != NULL) if ((dval = rc_dict_getval(rh, vp->lvalue, vp->name)) != NULL) { type = dval->name; } if ((vp = rc_avpair_get(send, PW_USER_NAME, 0)) != NULL) username = vp->strvalue; if ((vp = rc_avpair_get(send, PW_SERVICE_TYPE, 0)) != NULL) if ((dval = rc_dict_getval(rh, vp->lvalue, vp->name)) != NULL) { service = dval->name; } if (vp && (vp->lvalue == PW_FRAMED) && ((vp = rc_avpair_get(send, PW_FRAMED_PROTOCOL, 0)) != NULL)) if ((dval = rc_dict_getval(rh, vp->lvalue, vp->name)) != NULL) { fproto = dval->name; } result = rc_acct(rh, client_port, send); if (result == OK_RC) { fprintf(stderr, SC_ACCT_OK); rc_log(LOG_NOTICE, "accounting OK, type %s, username %s, service %s%s%s", type, username, service,(fproto)?"/":"", (fproto)?fproto:""); } else { fprintf(stderr, SC_ACCT_FAILED, result); rc_log(LOG_NOTICE, "accounting FAILED, type %s, username %s, service %s%s%s", type, username, service,(fproto)?"/":"", (fproto)?fproto:""); } rc_avpair_free(send); } exit (result); }
static int mod_init(void) { DICT_VENDOR *vend; load_tm_f load_tm; /* import the TM auto-loading function */ if ( !(load_tm=(load_tm_f)find_export("load_tm", NO_SCRIPT, 0))) { LOG(L_ERR, "ERROR:acc:mod_init: can't import load_tm\n"); return -1; } /* let the auto-loading function load all TM stuff */ if (load_tm( &tmb )==-1) return -1; if (verify_fmt(log_fmt)==-1) return -1; /* register callbacks*/ /* listen for all incoming requests */ if (tmb.register_tmcb( 0, 0, TMCB_REQUEST_IN, on_req, 0, 0) <= 0) { LOG(L_ERR,"ERROR:acc:mod_init: cannot register TMCB_REQUEST_IN " "callback\n"); return -1; } memset(attrs, 0, sizeof(attrs)); memset(vals, 0, sizeof(vals)); attrs[A_USER_NAME].n = "User-Name"; attrs[A_SERVICE_TYPE].n = "Service-Type"; attrs[A_CALLED_STATION_ID].n = "Called-Station-Id"; attrs[A_CALLING_STATION_ID].n = "Calling-Station-Id"; attrs[A_ACCT_STATUS_TYPE].n = "Acct-Status-Type"; attrs[A_ACCT_SESSION_ID].n = "Acct-Session-Id"; attrs[A_SIP_METHOD].n = "Sip-Method"; attrs[A_SIP_RESPONSE_CODE].n = "Sip-Response-Code"; attrs[A_SIP_CSEQ].n = "Sip-CSeq"; attrs[A_SIP_TO_TAG].n = "Sip-To-Tag"; attrs[A_SIP_FROM_TAG].n = "Sip-From-Tag"; attrs[A_SIP_TRANSLATED_REQUEST_ID].n = "Sip-Translated-Request-Id"; attrs[A_SIP_SOURCE_IP_ADDRESS].n = "Sip-Source-IP-Address"; attrs[A_SIP_SOURCE_PORT].n = "Sip-Source-Port"; attrs[A_SER_ATTR].n = "SER-Attr"; attrs[A_SER_FROM].n = "SER-From"; attrs[A_SER_FLAGS].n = "SER-Flags"; attrs[A_SER_ORIGINAL_REQUEST_ID].n = "SER-Original-Request-Id"; attrs[A_SER_TO].n = "SER-To"; attrs[A_SER_DIGEST_USERNAME].n = "SER-Digest-Username"; attrs[A_SER_DIGEST_REALM].n = "SER-Digest-Realm"; attrs[A_SER_REQUEST_TIMESTAMP].n = "SER-Request-Timestamp"; attrs[A_SER_TO_DID].n = "SER-To-DID"; attrs[A_SER_FROM_UID].n = "SER-From-UID"; attrs[A_SER_FROM_DID].n = "SER-From-DID"; attrs[A_SER_TO_UID].n = "SER-To-UID"; attrs[A_SER_RESPONSE_TIMESTAMP].n = "SER-Response-Timestamp"; attrs[A_SER_SERVER_ID].n = "SER-Server-ID"; vals[V_START].n = "Start"; vals[V_STOP].n = "Stop"; vals[V_INTERIM_UPDATE].n = "Interim-Update"; vals[V_FAILED].n = "Failed"; vals[V_SIP_SESSION].n = "Sip-Session"; /* open log */ rc_openlog("ser"); /* read config */ if ((rh = rc_read_config(radius_config)) == NULL) { LOG(L_ERR, "ERROR:acc:mod_init: Error opening radius config file: %s\n", radius_config); return -1; } /* read dictionary */ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) { LOG(L_ERR, "ERROR:acc:mod_init: Error reading radius dictionary\n"); return -1; } vend = rc_dict_findvend(rh, "iptelorg"); if (vend == NULL) { ERR("RADIUS dictionary is missing required vendor 'iptelorg'\n"); return -1; } INIT_AV(rh, attrs, vals, "acc", -1, -1); if (service_type != -1) { vals[V_SIP_SESSION].v = service_type; } if (parse_attrs(&avps, &avps_n, attrs_param) < 0) { ERR("Error while parsing 'attrs' module parameter\n"); return -1; } return 0; }
static int mod_init( void ) { load_tm_f load_tm; fprintf( stderr, "acc - initializing\n"); /* import the TM auto-loading function */ if ( !(load_tm=(load_tm_f)find_export("load_tm", NO_SCRIPT, 0))) { LOG(L_ERR, "ERROR: acc: mod_init: can't import load_tm\n"); return -1; } /* let the auto-loading function load all TM stuff */ if (load_tm( &tmb )==-1) return -1; if (verify_fmt(log_fmt)==-1) return -1; /* register callbacks */ /* report on completed transactions */ if (tmb.register_tmcb( TMCB_RESPONSE_OUT, acc_onreply, 0 /* empty param */ ) <= 0) return -1; /* account e2e acks if configured to do so */ if (tmb.register_tmcb( TMCB_E2EACK_IN, acc_onack, 0 /* empty param */ ) <=0 ) return -1; /* disable silent c-timer for registered calls */ if (tmb.register_tmcb( TMCB_REQUEST_IN, acc_onreq, 0 /* empty param */ ) <=0 ) return -1; /* report on missed calls */ if (tmb.register_tmcb( TMCB_ON_FAILURE, on_missed, 0 /* empty param */ ) <=0 ) return -1; /* get incoming replies ready for processing */ if (tmb.register_tmcb( TMCB_RESPONSE_IN, acc_onreply_in, 0 /* empty param */)<=0) return -1; #ifdef SQL_ACC if (bind_dbmod()) { LOG(L_ERR, "ERROR: acc: init_child bind_db failed..." "did you load a database module?\n"); return -1; } #endif #ifdef RAD_ACC /* open log */ rc_openlog("ser"); /* read config */ if (rc_read_config(radius_config)!=0) { LOG(L_ERR, "ERROR: acc: error opening radius config file: %s\n", radius_config ); return -1; } /* read dictionary */ if (rc_read_dictionary(rc_conf_str("dictionary"))!=0) { LOG(L_ERR, "ERROR: acc: error reading radius dictionary\n"); return -1; } #endif return 0; }