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

📄 system.c

📁 eCos/RedBoot for勤研ARM AnywhereII(4510) 含全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

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_GETTIMEOFDAY

int 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_STRDUP
char *
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_SETENV
int 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 */

int
calculate_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)
int
mkdirhier(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 + -