📄 system.c
字号:
long get_uptime (void){ return (0); /* not implemented */}char *winsock_startup (void){ WORD VersionRequested; WSADATA stWSAData; int i; static char errmsg[100]; VersionRequested = MAKEWORD(1,1); i = WSAStartup(VersionRequested, &stWSAData); if (i != 0) { if (i == WSAVERNOTSUPPORTED) sprintf(errmsg,"Unable to init. socket lib, does not support 1.1"); else { sprintf(errmsg,"Socket Startup error %d", i); } return(errmsg); } return(NULL);}void winsock_cleanup (void){ WSACleanup();}#else /* ! WIN32 *//*******************************************************************//* * XXX What if we have multiple addresses? * XXX Could it be computed once then cached? */in_addr_t get_myaddr (void){ int sd; struct ifconf ifc; struct ifreq *ifrp, ifreq; struct sockaddr *sa; struct sockaddr_in *in_addr; char conf[1024]; if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return 0; ifc.ifc_len = sizeof(conf); ifc.ifc_buf = (caddr_t)conf; memset(conf,0,sizeof(conf)); if (ioctl(sd, SIOCGIFCONF, (char *)&ifc) < 0){ close(sd); return 0; } ifrp = ifc.ifc_req; while (ifc.ifc_len && ifrp->ifr_name[0]) { ifreq = *ifrp; if (ioctl(sd, SIOCGIFFLAGS, (char *)&ifreq) >= 0) { in_addr = (struct sockaddr_in *)&ifrp->ifr_addr; if ((ifreq.ifr_flags & IFF_UP)#ifdef IFF_RUNNING && (ifreq.ifr_flags & IFF_RUNNING)#endif /* IFF_RUNNING */ && !(ifreq.ifr_flags & IFF_LOOPBACK) && in_addr->sin_addr.s_addr != LOOPBACK){#ifdef SYS_IOCTL_H_HAS_SIOCGIFADDR if (ioctl(sd, SIOCGIFADDR, (char *)&ifreq) >= 0) { in_addr = (struct sockaddr_in *)&(ifreq.ifr_addr);#endif close(sd); return in_addr->sin_addr.s_addr; } } } do { sa = &ifrp->ifr_addr; if (sa->sa_len <= sizeof(*sa)) { ifrp++; } else { ifrp=(struct ifreq *)(sa->sa_len + (char *)sa); ifc.ifc_len -= sa->sa_len - sizeof(*sa); } ifc.ifc_len -= sizeof(*ifrp); } while (!ifrp->ifr_name[0] && ifc.ifc_len); } close(sd); return 0;}#if !defined(solaris2) && !defined(linux) && !defined(cygwin) && !defined(__ECOS)/* * Returns boottime in centiseconds(!). * Caches this for future use. */long get_boottime (void){ static long boottime_csecs = 0; struct timeval boottime;#ifdef CAN_USE_SYSCTL int mib[2]; size_t len;#else int kmem; static struct nlist nl[] = {#if !defined(hpux) { (char*)"_boottime" },#else { (char*)"boottime" },#endif { (char*)"" } };#endif if ( boottime_csecs != 0 ) return( boottime_csecs );#ifdef CAN_USE_SYSCTL mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; len = sizeof(boottime); sysctl(mib, 2, &boottime, &len, NULL, NULL); boottime_csecs = (boottime.tv_sec * 100) + (boottime.tv_usec / 10000);#else /* CAN_USE_SYSCTL */ if ((kmem = open("/dev/kmem", 0)) < 0) return 0; nlist(KERNEL_LOC, nl); if (nl[0].n_type == 0){ close(kmem); return 0; } lseek(kmem, (long)nl[0].n_value, L_SET); read(kmem, &boottime, sizeof(boottime)); close(kmem); boottime_csecs = (boottime.tv_sec * 100) + (boottime.tv_usec / 10000);#endif /* CAN_USE_SYSCTL */ return( boottime_csecs );}#endif/* * Returns uptime in centiseconds(!). */#if !defined(__ECOS)long get_uptime (void){#if !defined(solaris2) && !defined(linux) && !defined(cygwin) struct timeval now; long boottime_csecs, nowtime_csecs; boottime_csecs = get_boottime(); if (boottime_csecs == 0) return 0; gettimeofday(&now,(struct timezone *)0); nowtime_csecs = (now.tv_sec * 100) + (now.tv_usec / 10000); return (nowtime_csecs - boottime_csecs);#endif#ifdef solaris2 kstat_ctl_t *ksc = kstat_open(); kstat_t *ks; kid_t kid; kstat_named_t *named; u_long lbolt = 0; if (ksc) { ks = kstat_lookup (ksc, "unix", -1, "system_misc"); if (ks) { kid = kstat_read (ksc, ks, NULL); if (kid != -1) { named = kstat_data_lookup(ks, "lbolt"); if (named) { lbolt = named->value.ul; } } } kstat_close(ksc); } return lbolt;#endif /* solaris2 */#ifdef linux FILE *in = fopen ("/proc/uptime", "r"); long uptim = 0, a, b; if (in) { if (2 == fscanf (in, "%ld.%ld", &a, &b)) uptim = a * 100 + b; fclose (in); } return uptim;#endif /* linux */ return (0); /* not implemented */}#endif // not __ECOS#ifndef HAVE_GETTIMEOFDAYint gettimeofday(struct timeval *tv, struct timezone *tz){ tv->tv_usec = 0; tv->tv_sec = time(NULL); return(0);}#endif /* !HAVE_GETTIMEOFDAY */#endif /* ! WIN32 *//*******************************************************************/#ifndef HAVE_STRNCASECMP/* test for NULL pointers before and NULL characters after * comparing possibly non-NULL strings. * WARNING: This function does NOT check for array overflow. */int strncasecmp(const char *s1, const char *s2, size_t nch){ size_t ii; int res = -1; if (!s1) { if (!s2) return 0; return (-1); } if (!s2) return (1); for (ii = 0; (ii < nch) && *s1 && *s2; ii++, s1++, s2++) { res = (int) (tolower(*s1) - tolower(*s2)); if (res != 0) break; } if ( ii == nch ) { s1--; s2--; } if (! *s1) { if (! *s2) return 0; return (-1); } if (! *s2) return (1); return (res);}int strcasecmp(const char *s1, const char *s2){ return strncasecmp(s1, s2, 1000000);}#endif /* HAVE_STRNCASECMP */#ifndef HAVE_STRDUPchar *strdup(const char *src){ int len; char *dst; len = strlen(src) + 1; if ((dst = (char *)malloc(len)) == NULL) return(NULL); strcpy(dst, src); return(dst);}#endif /* HAVE_STRDUP */#ifndef HAVE_SETENVint setenv(const char *name, const char *value, int overwrite){ char *cp; int ret; if (overwrite == 0) { if (getenv(name)) return 0; } cp = (char*)malloc(strlen(name)+strlen(value)+2); if (cp == NULL) return -1; sprintf(cp, "%s=%s", name, value); ret = putenv(cp); return ret;}#endif /* HAVE_SETENV */intcalculate_time_diff(struct timeval *now, struct timeval *then){ struct timeval tmp, diff; memcpy(&tmp, now, sizeof(struct timeval)); tmp.tv_sec--; tmp.tv_usec += 1000000L; diff.tv_sec = tmp.tv_sec - then->tv_sec; diff.tv_usec = tmp.tv_usec - then->tv_usec; if (diff.tv_usec > 1000000L){ diff.tv_usec -= 1000000L; diff.tv_sec++; } return ((diff.tv_sec * 100) + (diff.tv_usec / 10000));}#ifndef HAVE_STRCASESTR/* * only glibc2 has this. */char *strcasestr(const char *haystack, const char *needle){ const char *cp1=haystack, *cp2=needle; const char *cx; int tstch1, tstch2; /* printf("looking for '%s' in '%s'\n", needle, haystack); */ if (cp1 && cp2 && *cp1 && *cp2) for (cp1=haystack, cp2=needle; *cp1; ) { cx = cp1; cp2 = needle; do { /* printf("T'%c' ", *cp1); */ if (! *cp2) { /* found the needle */ /* printf("\nfound '%s' in '%s'\n", needle, cx); */ return (char *)cx; } if (! *cp1) break; tstch1 = toupper(*cp1); tstch2 = toupper(*cp2); if (tstch1 != tstch2) break; /* printf("M'%c' ", *cp1); */ cp1++; cp2++; } while (1); if (*cp1) cp1++; } /* printf("\n"); */ if (cp1 && *cp1) return (char *)cp1; return NULL;}#endif#if !defined(__ECOS)intmkdirhier(const char *pathname, mode_t mode, int skiplast) { struct stat sbuf; char *ourcopy = strdup(pathname); char *entry; char buf[SNMP_MAXPATH]; entry = strtok( ourcopy, "/" ); buf[0] = '\0'; /* check to see if filename is a directory */ while ( entry ) { strcat(buf,"/"); strcat(buf, entry); entry = strtok( NULL, "/"); if (entry == NULL && skiplast) break; if (stat(buf, &sbuf) < 0) { /* DNE, make it */ snmp_log(LOG_INFO, "Creating directory: %s\n", buf);#ifdef WIN32 CreateDirectory(buf, NULL);#else mkdir(buf, mode);#endif } else { /* exists, is it a file? */ if ((sbuf.st_mode & S_IFDIR) == 0) { /* ack! can't make a directory on top of a file */ free(ourcopy); return SNMPERR_GENERR; } } } free(ourcopy); return SNMPERR_SUCCESS;}#endif#ifdef __ECOS#include <cyg/kernel/kapi.h>long get_boottime (void){ return 1l;}long get_uptime (void){ return cyg_current_time();}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -