Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}