Index: asterisk/channels/chan_sip.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v retrieving revision 1.483 diff -u -r1.483 chan_sip.c --- asterisk/channels/chan_sip.c 30 Aug 2004 05:21:34 -0000 1.483 +++ asterisk/channels/chan_sip.c 30 Aug 2004 22:44:54 -0000 @@ -59,9 +59,25 @@ #ifdef SIP_MYSQL_FRIENDS #define MYSQL_FRIENDS +#define SQL_FRIENDS #include #endif +#ifdef SIP_POSTGRES_FRIENDS +#define POSTGRES_FRIENDS +#define SQL_FRIENDS +/* + * PostgreSQL routines written by Otmar Lendl + */ +#include +#endif + +#ifdef MYSQL_FRIENDS +#ifdef POSTGRES_FRIENDS +#error Both MYSQL_FRIENDS and POSTGRES_FRIENDS cannot be defined at the same time +#endif +#endif + #ifndef DEFAULT_USERAGENT #define DEFAULT_USERAGENT "Asterisk PBX" #endif @@ -118,6 +134,19 @@ static char mydbname[80]; #endif +#ifdef POSTGRES_FRIENDS +AST_MUTEX_DEFINE_STATIC(postgreslock); +PGconn *dbhandler; +char dboption[512]; +#endif + +#ifdef SQL_FRIENDS + +char db_select_peer_bysin_query[1024] = "SELECT name,secret,context,username,ipaddr,port,regseconds FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\""; +char db_select_peer_byname_query[1024] = "SELECT name,secret,context,username,ipaddr,port,regseconds FROM sipfriends WHERE name=\"%s\""; +char db_update_peer_query[1024] = "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\", username=\"%s\" WHERE name=\"%s\""; + +#endif /* SIP Debug */ #define DEBUG_READ 0 /* Recieved data */ #define DEBUG_SEND 1 /* Transmit data */ @@ -410,7 +439,7 @@ struct ast_ha *ha; #ifdef MYSQL_USERS int temponly; -#endif /* MYSQL_FRIENDS */ +#endif /* MYSQL_USERS */ struct sip_user *next; }; @@ -994,6 +1023,221 @@ return 0; } +static int set_sip_peer_property(struct sip_peer *peer, char *propName, char *propValue, int *maskfound, int *found ) +{ + int format; + + if (!strcasecmp(propName, "name")) { + strncpy(peer->name, propValue, sizeof(peer->name)-1); + return 1; + } + if (!strcasecmp(propName, "secret")) { + strncpy(peer->secret, propValue, sizeof(peer->secret)-1); + return 1; + } + if (!strcasecmp(propName, "md5secret")) { + strncpy(peer->md5secret, propValue, sizeof(peer->md5secret)-1); + return 1; + } + if (!strcasecmp(propName, "canreinvite")) { + if (!strcasecmp(propValue, "update")) + peer->canreinvite = REINVITE_UPDATE; + else + peer->canreinvite = ast_true(propValue); + return 1; + } + if (!strcasecmp(propName, "nat")) { + if (!strcasecmp(propValue, "rfc3581")) + peer->nat = SIP_NAT_RFC3581; + else if (!strcasecmp(v->value, "route")) + peer->nat = SIP_NAT_ROUTE; + else if (ast_true(propValue)) + peer->nat = SIP_NAT_ALWAYS; + else + peer->nat = SIP_NAT_NEVER; + return 1; + } + if (!strcasecmp(propName, "context")) { + strncpy(peer->context, propValue, sizeof(peer->context)-1); + return 1; + } + if (!strcasecmp(propName, "fromdomain")) { + strncpy(peer->fromdomain, propValue, sizeof(peer->fromdomain)-1); + return 1; + } + if (!strcasecmp(propName, "promiscredir")) { + peer->promiscredir = ast_true(propValue); + return 1; + } + if (!strcasecmp(propName, "fromuser")) { + strncpy(peer->fromuser, propValue, sizeof(peer->fromuser)-1); + return 1; + } + if (!strcasecmp(propName, "dtmfmode")) { + if (!strcasecmp(propValue, "inband")) + peer->dtmfmode=SIP_DTMF_INBAND; + else if (!strcasecmp(propValue, "rfc2833")) + peer->dtmfmode = SIP_DTMF_RFC2833; + else if (!strcasecmp(propValue, "info")) + peer->dtmfmode = SIP_DTMF_INFO; + else { + ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n", propValue); + peer->dtmfmode = SIP_DTMF_RFC2833; + } + return 1; + } + if (!strcasecmp(propName, "host")) { + if (!strcasecmp(propValue, "dynamic")) { + /* They'll register with us */ + peer->dynamic = 1; + if (!found) { + /* Initialize stuff iff we're not found, otherwise + we keep going with what we had */ + memset(&peer->addr.sin_addr, 0, 4); + if (peer->addr.sin_port) { + /* If we've already got a port, make it the default rather than absolute */ + peer->defaddr.sin_port = peer->addr.sin_port; + peer->addr.sin_port = 0; + } + } + } else { + /* Non-dynamic. Make sure we become that way if we're not */ + if (peer->expire > -1) + ast_sched_del(sched, peer->expire); + peer->expire = -1; + peer->dynamic = 0; + if (ast_get_ip(&peer->addr, propValue)) + return -1; + strncpy(peer->tohost, propValue, sizeof(peer->tohost) - 1); + } + if (maskfound && !maskfound[0]) + inet_aton("255.255.255.255", &peer->mask); + return 1; + } + if (!strcasecmp(propName, "ipaddr")) { + if (ast_get_ip(&peer->addr, propValue)) { + return -1; + } + return 1; + } + if (!strcasecmp(propName, "defaultip")) { + if (ast_get_ip(&peer->defaddr, propValue)) { + return -1; + } + return 1; + } + if (!strcasecmp(propName, "permit") || !strcasecmp(propName, "deny")) { + peer->ha = ast_append_ha(propName, propValue, peer->ha); + return 1; + } + if (!strcasecmp(propName, "mask")) { + if( maskfound ) maskfound[0]++; + inet_aton(propValue, &peer->mask); + return 1; + } + if (!strcasecmp(propName, "port")) { + if (peer->dynamic) + peer->defaddr.sin_port = htons(atoi(propValue)); + else + peer->addr.sin_port = htons(atoi(propValue)); + return 1; + } + if (!strcasecmp(propName, "username")) { + strncpy(peer->username, propValue, sizeof(peer->username)-1); + return 1; + } + if (!strcasecmp(propName, "language")) { + strncpy(peer->language, propValue, sizeof(peer->language)-1); + return 1; + } + if (!strcasecmp(propName, "musiconhold")) { + strncpy(peer->musicclass, propValue, sizeof(peer->musicclass)-1); + return 1; + } + if (!strcasecmp(propName, "mailbox")) { + strncpy(peer->mailbox, propValue, sizeof(peer->mailbox)-1); + return 1; + } + if (!strcasecmp(propName, "callgroup")) { + peer->callgroup = ast_get_group(propValue); + return 1; + } + if (!strcasecmp(propName, "pickupgroup")) { + peer->pickupgroup = ast_get_group(propValue); + return 1; + } + if (!strcasecmp(propName, "allow")) { + format = ast_getformatbyname(propValue); + if (format < 1) + ast_log(LOG_WARNING, "Cannot allow unknown format '%s'\n", propValue); + else + peer->capability |= format; + return 1; + } + if (!strcasecmp(propName, "disallow")) { + format = ast_getformatbyname(propValue); + if (format < 1) + ast_log(LOG_WARNING, "Cannot disallow unknown format '%s'\n", propValue); + else + peer->capability &= ~format; + return 1; + } + if (!strcasecmp(propName, "insecure")) { + if (!strcasecmp(propValue, "very")) { + peer->insecure = 2; + } else if (ast_true(propValue)) + peer->insecure = 1; + else + peer->insecure = 0; + return 1; + } + if (!strcasecmp(propName, "rtptimeout")) { + if ((sscanf(propValue, "%d", &peer->rtptimeout) != 1) || (peer->rtptimeout < 0)) { + ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time. Using default.\n", propValue); + peer->rtptimeout = global_rtptimeout; + } + return 1; + } + if (!strcasecmp(propName, "rtpholdtimeout")) { + if ((sscanf(propValue, "%d", &peer->rtpholdtimeout) != 1) || (peer->rtpholdtimeout < 0)) { + ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time. Using default.\n", propValue); + peer->rtpholdtimeout = global_rtpholdtimeout; + } + return 1; + } + if (!strcasecmp(propName, "qualify")) { + if (!strcasecmp(propValue, "no")) { + peer->maxms = 0; + } else if (!strcasecmp(propValue, "yes")) { + peer->maxms = DEFAULT_MAXMS; + } else if (sscanf(propValue, "%d", &peer->maxms) != 1) { + ast_log(LOG_WARNING, "Qualification of peer '%s' should be 'yes', 'no', or a number of milliseconds of sip.conf\n", peer->name); + peer->maxms = 0; + } + return 1; + } + if (!strcasecmp(propName, "trustrpid")) { + peer->trustrpid = ast_true(propValue); + return 1; + } + if (!strcasecmp(propName, "progressinband")) { + peer->progressinband = ast_true(propValue); + return 1; + } +#ifdef OSP_SUPPORT + if (!strcasecmp(propName, "ospauth")) { + if (!strcasecmp(propValue, "exclusive")) { + peer->ospauth = 2; + } else if (ast_true(propValue)) { + peer->ospauth = 1; + } else + peer->ospauth = 0; + return 1; + } +#endif + return 0; +} + #ifdef MYSQL_USERS /* Ehud Gavron 08-Jun-2004: */ @@ -1074,12 +1318,68 @@ } #endif /* MYSQL_USERS */ +#ifdef SQL_FRIENDS + #ifdef MYSQL_FRIENDS -/*--- mysql_update_peer: Update peer from database ---*/ +static int sql_is_good() +{ + return mysql!=0; +} +static unsigned int sql_escape_string(char* to, const char* from, unsigned int length) +{ + return mysql_real_escape_string(mysql,to,from,length); +} +static int sql_real_query(const char* query) +{ + return mysql_real_query(mysql,query,strlen(length)); +} +static void sql_lock() +{ + ast_mutex_lock(&mysqllock); +} +static void sql_unlock() +{ + ast_mutex_unlock(&mysqllock); +} +#endif /* MYSQL_FRIENDS */ + +#ifdef POSTGRES_FRIENDS +static int sql_is_good(void) +{ + return dbhandler!=0; +} +static unsigned int sql_escape_string(char* to, const char* from, unsigned int length) +{ + unsigned int k = 0; + unsigned int n = 0; + for(n=0;nsin_addr), ntohs(sin->sin_port), nowtime + expiry, uname, name); - ast_mutex_lock(&mysqllock); - if (mysql_real_query(mysql, query, strlen(query))) + sql_escape_string(name, peer, strlen(peer)); + sql_escape_string(uname, username, strlen(username)); + snprintf(query, sizeof(query), db_update_peer_query, + ast_inet_ntoa(iabuf,sizeof(iabuf),sin->sin_addr), + ntohs(sin->sin_port), + nowtime + expiry, + uname, + name); + sql_lock(); + if (sql_real_query(query)) ast_log(LOG_WARNING, "Unable to update database\n"); - - ast_mutex_unlock(&mysqllock); + sql_unlock(); } } -/*--- mysql_peer: Get peer from database ---*/ -static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin) +/*--- sql_find_peer: Get peer from database ---*/ +static struct sip_peer *sql_find_peer(char *peer, struct sockaddr_in *sin) { struct sip_peer *p; int success = 0; + time_t regseconds, nowtime; p = malloc(sizeof(struct sip_peer)); memset(p, 0, sizeof(struct sip_peer)); - if (mysql && (!peer || (strlen(peer) < 128))) { + if (sql_is_good() && (!peer || (strlen(peer) < 128))) { char query[512]; char *name = NULL; int numfields, x; - int port; char iabuf[INET_ADDRSTRLEN]; - time_t regseconds, nowtime; +#ifdef MYSQL_FRIENDS MYSQL_RES *result; MYSQL_FIELD *fields; MYSQL_ROW rowval; +#endif +#ifdef POSTGRES_FRIENDS + PGresult *result; +#endif if (peer) { name = alloca(strlen(peer) * 2 + 1); - mysql_real_escape_string(mysql, name, peer, strlen(peer)); + sql_escape_string(name, peer, strlen(peer)); } if (sin) - snprintf(query, sizeof(query), "SELECT name, secret, context, username, ipaddr, port, regseconds FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\"", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port)); + snprintf(query, sizeof(query), db_select_peer_bysin_query, + ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port)); else - snprintf(query, sizeof(query), "SELECT name, secret, context, username, ipaddr, port, regseconds FROM sipfriends WHERE name=\"%s\"", name); - ast_mutex_lock(&mysqllock); + snprintf(query, sizeof(query), db_select_peer_byname_query, + name); + sql_lock(); +#ifdef MYSQL_FRIENDS mysql_query(mysql, query); if ((result = mysql_store_result(mysql))) { if ((rowval = mysql_fetch_row(result))) { @@ -1136,39 +1446,61 @@ p->addr.sin_family = AF_INET; for (x=0;xsecret, rowval[x], sizeof(p->secret) - 1); - } else if (!strcasecmp(fields[x].name, "name")) { - strncpy(p->name, rowval[x], sizeof(p->name) - 1); - } else if (!strcasecmp(fields[x].name, "context")) { - strncpy(p->context, rowval[x], sizeof(p->context) - 1); - } else if (!strcasecmp(fields[x].name, "username")) { - strncpy(p->username, rowval[x], sizeof(p->username) - 1); - } else if (!strcasecmp(fields[x].name, "ipaddr")) { - inet_aton(rowval[x], &p->addr.sin_addr); - } else if (!strcasecmp(fields[x].name, "port")) { - if (sscanf(rowval[x], "%i", &port) != 1) - port = 0; - p->addr.sin_port = htons(port); - } else if (!strcasecmp(fields[x].name, "regseconds")) { - if (sscanf(rowval[x], "%li", ®seconds) != 1) - regseconds = 0; + if (set_sip_peer_property(p,fields[x].name,rowval[x],NULL,NULL) == 0) { + if (!strcasecmp(propName, "regseconds")) { + if (sscanf(propValue, "%li", ®seconds) != 1) + regseconds = 0; + } } } } - time(&nowtime); - if (nowtime > regseconds) - memset(&p->addr, 0, sizeof(p->addr)); } mysql_free_result(result); - result = NULL; } - ast_mutex_unlock(&mysqllock); +#endif +#ifdef POSTGRES_FRIENDS + if ((result = PQexec(dbhandler,query))) { + if( (PQresultStatus(result) != PGRES_BAD_RESPONSE) && + (PQresultStatus(result) != PGRES_NONFATAL_ERROR) && + (PQresultStatus(result) != PGRES_FATAL_ERROR) ) { + if (PQntuples(result)>0) { + numfields = PQnfields(result); + success = 1; + p->addr.sin_family = AF_INET; + for (x=0;x regseconds) { + memset(&p->addr, 0, sizeof(p->addr)); + } p->dynamic = 1; p->capability = global_capability; p->nat = global_nat; @@ -1177,18 +1509,17 @@ p->insecure = 1; p->expire = -1; p->temponly = 1; - } return p; } -#endif /* MYSQL_FRIENDS */ +#endif /* SQL_FRIENDS */ /*--- update_peer: Update peer data in database (if used) ---*/ static void update_peer(struct sip_peer *p, int expiry) { -#ifdef MYSQL_FRIENDS +#ifdef SQL_FRIENDS if (p->temponly) - mysql_update_peer(p->name, &p->addr, p->username, expiry); + sql_update_peer(p->name, &p->addr, p->username, expiry); #endif return; } @@ -1220,9 +1551,9 @@ } } -#ifdef MYSQL_FRIENDS +#ifdef SQL_FRIENDS if (!p) { - p = mysql_peer(peer, sin); + p = sql_find_peer(peer, sin); } #endif @@ -6057,9 +6388,9 @@ if (!strcmp(peer->name, argv[3])) break; ast_mutex_unlock(&peerl.lock); -#ifdef MYSQL_FRIENDS +#ifdef SQL_FRIENDS if (!peer) - peer = mysql_peer(argv[3], NULL); + peer = sql_find_peer(argv[3], NULL); #endif if (peer) { if (peer->addr.sin_addr.s_addr) { @@ -8166,154 +8497,17 @@ peer->ospauth = global_ospauth; #endif while(v) { - if (!strcasecmp(v->name, "secret")) - strncpy(peer->secret, v->value, sizeof(peer->secret)-1); - else if (!strcasecmp(v->name, "md5secret")) - strncpy(peer->md5secret, v->value, sizeof(peer->md5secret)-1); - else if (!strcasecmp(v->name, "canreinvite")) { - if (!strcasecmp(v->value, "update")) - peer->canreinvite = REINVITE_UPDATE; - else - peer->canreinvite = ast_true(v->value); - } else if (!strcasecmp(v->name, "nat")) { - if (!strcasecmp(v->value, "rfc3581")) - peer->nat = SIP_NAT_RFC3581; - else if (!strcasecmp(v->value, "route")) - peer->nat = SIP_NAT_ROUTE; - else if (ast_true(v->value)) - peer->nat = SIP_NAT_ALWAYS; - else - peer->nat = SIP_NAT_NEVER; - } else if (!strcasecmp(v->name, "context")) - strncpy(peer->context, v->value, sizeof(peer->context)-1); - else if (!strcasecmp(v->name, "fromdomain")) - strncpy(peer->fromdomain, v->value, sizeof(peer->fromdomain)-1); - else if (!strcasecmp(v->name, "promiscredir")) - peer->promiscredir = ast_true(v->value); - else if (!strcasecmp(v->name, "fromuser")) - strncpy(peer->fromuser, v->value, sizeof(peer->fromuser)-1); - else if (!strcasecmp(v->name, "dtmfmode")) { - if (!strcasecmp(v->value, "inband")) - peer->dtmfmode=SIP_DTMF_INBAND; - else if (!strcasecmp(v->value, "rfc2833")) - peer->dtmfmode = SIP_DTMF_RFC2833; - else if (!strcasecmp(v->value, "info")) - peer->dtmfmode = SIP_DTMF_INFO; - else { - ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n", v->value); - peer->dtmfmode = SIP_DTMF_RFC2833; - } - } else if (!strcasecmp(v->name, "host")) { - if (!strcasecmp(v->value, "dynamic")) { - /* They'll register with us */ - peer->dynamic = 1; - if (!found) { - /* Initialize stuff iff we're not found, otherwise - we keep going with what we had */ - memset(&peer->addr.sin_addr, 0, 4); - if (peer->addr.sin_port) { - /* If we've already got a port, make it the default rather than absolute */ - peer->defaddr.sin_port = peer->addr.sin_port; - peer->addr.sin_port = 0; - } - } - } else { - /* Non-dynamic. Make sure we become that way if we're not */ - if (peer->expire > -1) - ast_sched_del(sched, peer->expire); - peer->expire = -1; - peer->dynamic = 0; - if (ast_get_ip(&peer->addr, v->value)) { - free(peer); - return NULL; - } - strncpy(peer->tohost, v->value, sizeof(peer->tohost) - 1); - } - if (!maskfound) - inet_aton("255.255.255.255", &peer->mask); - } else if (!strcasecmp(v->name, "defaultip")) { - if (ast_get_ip(&peer->defaddr, v->value)) { - free(peer); - return NULL; - } - } else if (!strcasecmp(v->name, "permit") || - !strcasecmp(v->name, "deny")) { - peer->ha = ast_append_ha(v->name, v->value, peer->ha); - } else if (!strcasecmp(v->name, "mask")) { - maskfound++; - inet_aton(v->value, &peer->mask); - } else if (!strcasecmp(v->name, "port")) { - if (peer->dynamic) - peer->defaddr.sin_port = htons(atoi(v->value)); - else - peer->addr.sin_port = htons(atoi(v->value)); - } else if (!strcasecmp(v->name, "username")) { - strncpy(peer->username, v->value, sizeof(peer->username)-1); - } else if (!strcasecmp(v->name, "language")) { - strncpy(peer->language, v->value, sizeof(peer->language)-1); - } else if (!strcasecmp(v->name, "musiconhold")) { - strncpy(peer->musicclass, v->value, sizeof(peer->musicclass)-1); - } else if (!strcasecmp(v->name, "mailbox")) { - strncpy(peer->mailbox, v->value, sizeof(peer->mailbox)-1); - } else if (!strcasecmp(v->name, "callgroup")) { - peer->callgroup = ast_get_group(v->value); - } else if (!strcasecmp(v->name, "pickupgroup")) { - peer->pickupgroup = ast_get_group(v->value); - } else if (!strcasecmp(v->name, "allow")) { - format = ast_getformatbyname(v->value); - if (format < 1) - ast_log(LOG_WARNING, "Cannot allow unknown format '%s'\n", v->value); - else - peer->capability |= format; - } else if (!strcasecmp(v->name, "disallow")) { - format = ast_getformatbyname(v->value); - if (format < 1) - ast_log(LOG_WARNING, "Cannot disallow unknown format '%s'\n", v->value); - else - peer->capability &= ~format; - } else if (!strcasecmp(v->name, "insecure")) { - if (!strcasecmp(v->value, "very")) { - peer->insecure = 2; - } else if (ast_true(v->value)) - peer->insecure = 1; - else - peer->insecure = 0; - } else if (!strcasecmp(v->name, "rtptimeout")) { - if ((sscanf(v->value, "%d", &peer->rtptimeout) != 1) || (peer->rtptimeout < 0)) { - ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time at line %d. Using default.\n", v->value, v->lineno); - peer->rtptimeout = global_rtptimeout; - } - } else if (!strcasecmp(v->name, "rtpholdtimeout")) { - if ((sscanf(v->value, "%d", &peer->rtpholdtimeout) != 1) || (peer->rtpholdtimeout < 0)) { - ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time at line %d. Using default.\n", v->value, v->lineno); - peer->rtpholdtimeout = global_rtpholdtimeout; - } - } else if (!strcasecmp(v->name, "qualify")) { - if (!strcasecmp(v->value, "no")) { - peer->maxms = 0; - } else if (!strcasecmp(v->value, "yes")) { - peer->maxms = DEFAULT_MAXMS; - } else if (sscanf(v->value, "%d", &peer->maxms) != 1) { - ast_log(LOG_WARNING, "Qualification of peer '%s' should be 'yes', 'no', or a number of milliseconds at line %d of sip.conf\n", peer->name, v->lineno); - peer->maxms = 0; - } - } else if (!strcasecmp(v->name, "trustrpid")) { - peer->trustrpid = ast_true(v->value); - } else if (!strcasecmp(v->name, "progressinband")) { - peer->progressinband = ast_true(v->value); -#ifdef OSP_SUPPORT - } else if (!strcasecmp(v->name, "ospauth")) { - if (!strcasecmp(v->value, "exclusive")) { - peer->ospauth = 2; - } else if (ast_true(v->value)) { - peer->ospauth = 1; - } else - peer->ospauth = 0; -#endif - } - /* else if (strcasecmp(v->name,"type")) - * ast_log(LOG_WARNING, "Ignoring %s\n", v->name); - */ + int n = set_sip_peer_property(peer,v->name,v->value,&maskfound,&found); + if( n<0 ) { + free(peer); + return NULL; + } + else if( n==0 ) { + /* ast_log(LOG_WARNING, "Ignoring %s\n", v->name); */ + } + else { + /* the property was found */ + } v=v->next; } if (!found && peer->dynamic) @@ -8537,6 +8731,19 @@ } else if (!strcasecmp(v->name, "dbname")) { strncpy(mydbname, v->value, sizeof(mydbname) - 1); #endif +#ifdef POSTGRES_FRIENDS + } else if (!strcasecmp(v->name, "dboption")) { + strncpy(dboption, v->value, sizeof(dboption) - 1); +#endif +#ifdef SQL_FRIENDS + } + else if (!strcasecmp(v->name, "db_select_peer_byname_query")) { + strncpy(db_select_peer_byname_query, v->value, sizeof(db_select_peer_byname_query) - 1); + } else if (!strcasecmp(v->name, "db_select_peer_bysin_query")) { + strncpy(db_select_peer_bysin_query, v->value, sizeof(db_select_peer_bysin_query) - 1); + } else if (!strcasecmp(v->name, "db_update_peer_query")) { + strncpy(db_update_peer_query, v->value, sizeof(db_update_peer_query) - 1); +#endif } /* else if (strcasecmp(v->name,"type")) * ast_log(LOG_WARNING, "Ignoring %s\n", v->name); @@ -8640,6 +8847,16 @@ } else ast_verbose(VERBOSE_PREFIX_1 "Connected to database '%s' on '%s' as '%s'\n", mydbname, mydbhost, mydbuser); + } +#endif +#ifdef POSTGRES_FRIENDS + if (!dbhandler && !ast_strlen_zero(dboption)) { + dbhandler=PQconnectdb(dboption); + if (PQstatus(dbhandler) == CONNECTION_BAD) { + ast_log(LOG_WARNING, "Error Logging into database %s: %s\n",dboption,PQerrorMessage(dbhandler)); + dbhandler = NULL; + } else + ast_verbose(VERBOSE_PREFIX_1 "Connected to postgres database\n"); } #endif return 0;