⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.c

📁 这是一个C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
         DEBUGC(DBCLASS_CONFIG,"changing uid/gid to %s",                configuration.user);         sts = setgid(passwd->pw_gid);         DEBUGC(DBCLASS_CONFIG,"changed gid to %i - %s",	        (int)passwd->pw_gid, (sts==0)?"Ok":"Failed");         sts = setegid(passwd->pw_gid);         DEBUGC(DBCLASS_CONFIG,"changed egid to %i - %s",	        (int)passwd->pw_gid, (sts==0)?"Ok":"Failed");         sts = seteuid(passwd->pw_uid);         DEBUGC(DBCLASS_CONFIG,"changed euid to %i - %s",	        (int)passwd->pw_uid, (sts==0)?"Ok":"Failed");      }   }}/* * get_interface_ip: * fetches own IP address by interface INBOUND/OUTBOUND * takes into account a possible outbound_host setting. * * STS_SUCCESS on returning a valid IP and interface is UP * STS_FAILURE if interface is DOWN or other problem */int  get_interface_ip(int interface, struct in_addr *retaddr) {   int sts=STS_FAILURE;   if ((interface == IF_OUTBOUND) &&               (configuration.outbound_host) &&              (strcmp(configuration.outbound_host, "")!=0)) {      DEBUGC(DBCLASS_DNS, "fetching outbound IP by HOSTNAME");      if (retaddr) {         sts = get_ip_by_host(configuration.outbound_host, retaddr);      } else {         sts = STS_SUCCESS;      }   } else  {      sts = get_interface_real_ip(interface, retaddr);   }   return sts;}/* * get_interface_real_ip: * fetches the real IP address of my interface INBOUND/OUTBOUND * * STS_SUCCESS on returning a valid IP and interface is UP * STS_FAILURE if interface is DOWN or other problem */int  get_interface_real_ip(int interface, struct in_addr *retaddr) {   int sts=STS_FAILURE;   char *tmp=NULL;      if (interface == IF_INBOUND) {         tmp = configuration.inbound_if;      } else if (interface == IF_OUTBOUND) {         tmp = configuration.outbound_if;      }   if (tmp && (strcmp(tmp, "")!=0)) {      DEBUGC(DBCLASS_DNS, "fetching interface IP by INTERFACE [%i]", interface);      sts = get_ip_by_ifname(tmp, retaddr);      if (sts != STS_SUCCESS) {         ERROR("can't find interface %s - configuration error?", tmp);      }   } else {      ERROR("Don't know what interface to look for - configuration error?");   }   return sts;}/* * get_ip_by_ifname: * fetches own IP address by its interface name * * STS_SUCCESS on returning a valid IP and interface is UP * STS_FAILURE if interface is DOWN or other problem */int get_ip_by_ifname(char *ifname, struct in_addr *retaddr) {   struct ifreq ifr;   struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;   int sockfd;   int i, j;   int ifflags, isup;   time_t t;   static struct {      time_t timestamp;      struct in_addr ifaddr;	/* IP */      int isup;			/* interface is UP */      char ifname[IFNAME_SIZE+1];   } ifaddr_cache[IFADR_CACHE_SIZE];   static int cache_initialized=0;   if (ifname == NULL) {      WARN("get_ip_by_ifname: got NULL ifname passed - please check config"           "file ('if_inbound' and 'if_outbound')");      return STS_FAILURE;   }   /* first time: initialize ifaddr cache */   if (cache_initialized == 0) {      DEBUGC(DBCLASS_DNS, "initializing ifaddr cache (%i entries)",              IFADR_CACHE_SIZE);      memset(ifaddr_cache, 0, sizeof(ifaddr_cache));      cache_initialized=1;   }   if (retaddr) memset(retaddr, 0, sizeof(struct in_addr));   time(&t);   /* clean expired entries */   for (i=0; i<IFADR_CACHE_SIZE; i++) {      if (ifaddr_cache[i].ifname[0]=='\0') continue;      if ( (ifaddr_cache[i].timestamp+IFADR_MAX_AGE) < t ) {         DEBUGC(DBCLASS_DNS, "cleaning ifaddr cache (entry %i)", i);         memset (&ifaddr_cache[i], 0, sizeof(ifaddr_cache[0]));      }   }   /*    * search requested entry in cache    */   for (i=0; i<IFADR_CACHE_SIZE; i++) {      if (ifaddr_cache[i].ifname[0]=='\0') continue;      if (strcmp(ifname, ifaddr_cache[i].ifname) == 0) { /* match */         if (retaddr) memcpy(retaddr, &ifaddr_cache[i].ifaddr,                             sizeof(struct in_addr));         DEBUGC(DBCLASS_DNS, "ifaddr lookup - from cache: %s -> %s %s",	        ifname, utils_inet_ntoa(ifaddr_cache[i].ifaddr),                (ifaddr_cache[i].isup)? "UP":"DOWN");         return (ifaddr_cache[i].isup)? STS_SUCCESS: STS_FAILURE;      } /* if */   } /* for i */   /* not found in cache, go and get it */   memset(&ifr, 0, sizeof(ifr));   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {      ERROR("Error in socket: %s\n",strerror(errno));      return STS_FAILURE;   }   strcpy(ifr.ifr_name, ifname);   sin->sin_family = AF_INET;   /* get interface flags */   if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) != 0) {      ERROR("Error in ioctl SIOCGIFFLAGS: %s [%s]\n",            strerror(errno), ifname);      close(sockfd);      return STS_FAILURE;   }    ifflags=ifr.ifr_flags;   /* get address */   if(ioctl(sockfd, SIOCGIFADDR, &ifr) != 0) {      ERROR("Error in ioctl SIOCGIFADDR: %s (interface %s)\n",      strerror(errno), ifname);      close(sockfd);      return STS_FAILURE;   }    if (ifflags & IFF_UP) isup=1;   else isup=0;   DEBUGC(DBCLASS_DNS, "get_ip_by_ifname: if %s has IP:%s (flags=%x) %s",          ifname, utils_inet_ntoa(sin->sin_addr), ifflags,          (isup)? "UP":"DOWN");   /*    *find an empty slot in the cache    */   j=0;   for (i=0; i<IFADR_CACHE_SIZE; i++) {      if (ifaddr_cache[i].ifname[0]=='\0') break;      if (ifaddr_cache[i].timestamp < t) {         /* remember oldest entry */         t=ifaddr_cache[i].timestamp;	 j=i;      }   }   /* if no empty slot found, take oldest one */   if (i >= IFADR_CACHE_SIZE) i=j;   /*    * store the result in the cache    */   DEBUGC(DBCLASS_DNS, "ifname lookup - store into cache, entry %i)", i);   memset(&ifaddr_cache[i], 0, sizeof(ifaddr_cache[0]));   strncpy(ifaddr_cache[i].ifname, ifname, IFNAME_SIZE);   ifaddr_cache[i].timestamp=t;   memcpy(&ifaddr_cache[i].ifaddr, &sin->sin_addr, sizeof(sin->sin_addr));   ifaddr_cache[i].isup=isup;   if (retaddr) memcpy(retaddr, &sin->sin_addr, sizeof(sin->sin_addr));   close(sockfd);   return (isup)? STS_SUCCESS : STS_FAILURE;}/* * utils_inet_ntoa: * implements an inet_ntoa() * * Returns pointer to a STATIC character string. * NOte: BE AWARE OF THE STATIC NATURE of the string! Never pass it as * calling argument to a function and use it immediately or strcpy() * it into a buffer. * !! Any subsequent call to this function will DESTROY the previous * !! value - and may result in very strange effects like magically * !! changing variable value (that has been passed to a function) * Been there, seen that, so TAKE CARE! */char *utils_inet_ntoa(struct in_addr in) {#if defined(HAVE_INET_NTOP)   static char string[INET_ADDRSTRLEN];   if ((inet_ntop(AF_INET, &in, string, INET_ADDRSTRLEN)) == NULL) {      ERROR("inet_ntop() failed: %s\n",strerror(errno));      string[0]='\0';   }   return string;#elif defined(HAVE_INET_NTOA)   return inet_ntoa(in);#else#error "need inet_ntop() or inet_ntoa()"#endif}/* * utils_inet_aton: * implements an inet_aton() * * converts the string in *cp and stores it into inp * Returns != 0 on success */int  utils_inet_aton(const char *cp, struct in_addr *inp) {#if defined(HAVE_INET_PTON)   return inet_pton (AF_INET, cp, inp);#elif defined(HAVE_INET_ATON)   return inet_aton(cp, inp);#else#error "need inet_pton() or inet_aton()"#endif}/* * Create the PID file */int createpidfile(char *pidfilename) {   FILE *f = NULL;   int sts;   DEBUGC(DBCLASS_CONFIG,"creating PID file [%s]", pidfilename);   sts=unlink(pidfilename);   if ((sts==0) || (errno == ENOENT)) {      if ((f=fopen(pidfilename, "w"))) {         fprintf(f,"%i\n",(int)getpid());         fclose(f);      } else {         WARN("couldn't create new PID file: %s", strerror(errno));         return STS_FAILURE;      }   } else {      WARN("couldn't delete old PID file: %s", strerror(errno));      return STS_FAILURE;   }   return STS_SUCCESS;}/* * compare_client_id: * Compares two client_id_t structures. If both have the Contact item * defined (not NULL), then compare it and return. * If one (or both) do NOT have the contact item defined, then * fall back on comparing the from_ip (IP address). * * returns: * STS_SUCCESS on match * STS_FAILURE on no match */int  compare_client_id(client_id_t cid1, client_id_t cid2) {   /* Prio 1: Contact - if present in both structures */   if ((cid1.contact[0] != '\0') && (cid2.contact[0] != '\0')) {      if (strncmp(cid1.contact, cid2.contact, CLIENT_ID_SIZE) == 0) {         DEBUGC(DBCLASS_BABBLE, "compare_client_id: contact match [%s]",                cid1.contact);         return STS_SUCCESS;      }      DEBUGC(DBCLASS_BABBLE, "compare_client_id: contact NO match [%s<->%s]",             cid1.contact, cid2.contact);      return STS_FAILURE;   }   /* Prio 2: IP (always present) */   if (memcmp(&cid1.from_ip, &cid2.from_ip, sizeof(struct in_addr)) == 0) {      DEBUGC(DBCLASS_BABBLE, "compare_client_id: IP match [%s]",             utils_inet_ntoa(cid1.from_ip));      return STS_SUCCESS;   }   DEBUGC(DBCLASS_BABBLE, "compare_client_id: no match");   return STS_FAILURE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -