static pcp_errno psd_fill_pcp_server_src(pcp_server_t *s) { struct in6_addr src_ip; const char *err=NULL; PCP_LOG_BEGIN(PCP_LOGLVL_DEBUG); if (!s) { PCP_LOG_END(PCP_LOGLVL_DEBUG); return PCP_ERR_BAD_ARGS; } memset(&s->pcp_server_saddr, 0, sizeof(s->pcp_server_saddr)); memset(&src_ip, 0, sizeof(src_ip)); #ifndef PCP_USE_IPV6_SOCKET s->pcp_server_saddr.ss_family=AF_INET; if (s->af == AF_INET) { ((struct sockaddr_in *)&s->pcp_server_saddr)->sin_addr.s_addr= s->pcp_ip[3]; ((struct sockaddr_in *)&s->pcp_server_saddr)->sin_port=s->pcp_port; SET_SA_LEN(&s->pcp_server_saddr, sizeof(struct sockaddr_in)); inet_ntop(AF_INET, (void *)&((struct sockaddr_in *)&s->pcp_server_saddr)->sin_addr, s->pcp_server_paddr, sizeof(s->pcp_server_paddr)); err=findsaddr((struct sockaddr_in *)&s->pcp_server_saddr, &src_ip); if (err) { PCP_LOG(PCP_LOGLVL_WARN, "Error (%s) occurred while registering a new " "PCP server %s", err, s->pcp_server_paddr); PCP_LOG_END(PCP_LOGLVL_DEBUG); return PCP_ERR_UNKNOWN; } s->src_ip[0]=0; s->src_ip[1]=0; s->src_ip[2]=htonl(0xFFFF); s->src_ip[3]=S6_ADDR32(&src_ip)[3]; } else { PCP_LOG(PCP_LOGLVL_WARN, "%s", "IPv6 is disabled and IPv6 address of PCP server occurred"); PCP_LOG_END(PCP_LOGLVL_DEBUG); return PCP_ERR_BAD_AFINET; } #else //PCP_USE_IPV6_SOCKET s->pcp_server_saddr.ss_family=AF_INET6; if (s->af == AF_INET) { return PCP_ERR_BAD_AFINET; //should never happen } pcp_fill_sockaddr((struct sockaddr *)&s->pcp_server_saddr, (struct in6_addr *)&s->pcp_ip, s->pcp_port, 1, s->pcp_scope_id); inet_ntop(AF_INET6, (void *)&((struct sockaddr_in6*) &s->pcp_server_saddr)->sin6_addr, s->pcp_server_paddr, sizeof(s->pcp_server_paddr)); err=findsaddr6((struct sockaddr_in6*)&s->pcp_server_saddr, &src_ip); if (err) { PCP_LOG(PCP_LOGLVL_WARN, "Error (%s) occurred while registering a new " "PCP server %s", err, s->pcp_server_paddr); PCP_LOG_END(PCP_LOGLVL_DEBUG); return PCP_ERR_UNKNOWN; } s->src_ip[0]=S6_ADDR32(&src_ip)[0]; s->src_ip[1]=S6_ADDR32(&src_ip)[1]; s->src_ip[2]=S6_ADDR32(&src_ip)[2]; s->src_ip[3]=S6_ADDR32(&src_ip)[3]; #endif //PCP_USE_IPV6_SOCKET s->server_state=pss_ping; s->next_timeout.tv_sec=0; s->next_timeout.tv_usec=0; PCP_LOG_END(PCP_LOGLVL_DEBUG); return PCP_ERR_SUCCESS; }
int init(void) { struct sockaddr_in from, to; const char *msg; int i, idx; FILE *in; if (!HAVE_OPT(OUTPUT)) { LOG(LOG_ERR, "missing output option"); return 0; } if (OPT_VALUE_SERVERID == 0) { fprintf(stderr, "Please set serverid first\n"); return 0; } if (HAVE_OPT(ERRLOG)) { int ct = STACKCT_OPT(ERRLOG); char **errlog = (char **) &STACKLST_OPT(ERRLOG); for (idx=0, i=0; i < ct && idx < 255; i++) { char *start, *end; start = end = errlog[i]; while (*end && !isspace(*end)) { end++; } if (!*end) { LOG(LOG_WARNING, "Illegal format: %s", errlog[i]); continue; } *end++ = 0; errlogspec[idx].style = start; while (*end && isspace(*end)) { end++; } if (!*end) { LOG(LOG_WARNING, "Illegal format: %s", errlog[i]); continue; } start = end; while (*end && !isspace(*end)) { end++; } *end = 0; errlogspec[idx++].path = start; } #if HAVE_LIBPCRE in = fopen(STATFILE, "r"); if (in) { while (!feof(in)) { char path[PATH_MAX]; long long offset; int i; if (fscanf(in, "%s %Ld", path, &offset) != 2) continue; for (i=0; errlogspec[i].path; i++) { if (strcmp(errlogspec[i].path, path)) continue; errlogspec[i].offset = offset; break; } } fclose(in); } #endif } #if USE_XMBMON if (OPT_VALUE_HWSTATS) { if (OPT_VALUE_TYAN_TIGER_MP) { TyanTigerMP_flag = 1; } if ((i = InitMBInfo(' ')) != 0) { LOG(LOG_ERR, "InitMBInfo: %m"); if (i < 0) { LOG(LOG_ERR,"This program needs setuid root"); } } } else { LOG(LOG_INFO,"Hardware stats will not be generated"); } #endif // determine ip address for default gateway interface setsin(&to, inet_addr("1.1.1.1")); msg = findsaddr(&to, &from); if (msg) { LOG(LOG_INFO, (char *)msg); strcpy(ipaddress, OPT_ARG(IPADDRESS)); } else { strcpy(ipaddress, inet_ntoa(from.sin_addr)); } LOG(LOG_INFO, "using ipaddress %s", ipaddress); daemonize = TRUE; every = EVERY_SECOND; xmlSetGenericErrorFunc(NULL, UpwatchXmlGenericErrorFunc); sleep(2); // ensure we wait until the next minute setpriority(PRIO_PROCESS, 0, 5); // we are not very important - be nice to other processes return 1; }