/* Interface structure allocation by proc filesystem. */ int interface_list_proc () { FILE *fp; char buf[PROCBUFSIZ]; struct interface *ifp; char *name; /* Open /proc/net/dev. */ fp = fopen (_PATH_PROC_NET_DEV, "r"); if (fp == NULL) { zlog_warn ("Can't open proc file %s: %s", _PATH_PROC_NET_DEV, strerror (errno)); return -1; } /* Drop header lines. */ fgets (buf, PROCBUFSIZ, fp); fgets (buf, PROCBUFSIZ, fp); /* Only allocate interface structure. Other jobs will be done in if_ioctl.c. */ while (fgets (buf, PROCBUFSIZ, fp) != NULL) { interface_name_cut (buf, &name); ifp = if_get_by_name (name); if_add_update (ifp); } return 0; }
/* Update interface's statistics. */ int ifstat_update_proc () { FILE *fp; char buf[PROCBUFSIZ]; int version; struct interface *ifp; char *stat; char *name; char *retval; /* Open /proc/net/dev. */ fp = fopen (_PATH_PROC_NET_DEV, "r"); if (fp == NULL) { zlog_warn ("Can't open proc file %s: %s", _PATH_PROC_NET_DEV, strerror (errno)); return -1; } /* Drop header lines. */ retval = fgets (buf, PROCBUFSIZ, fp); retval = fgets (buf, PROCBUFSIZ, fp); /* To detect proc format veresion, parse second line. */ if (strstr (buf, "compressed")) version = 3; else if (strstr (buf, "bytes")) version = 2; else version = 1; /* Update each interface's statistics. */ while (fgets (buf, PROCBUFSIZ, fp) != NULL) { stat = interface_name_cut (buf, &name); ifp = if_get_by_name (name); ifstat_dev_fields (version, stat, ifp); } fclose(fp); return 0; }