当前位置: 技术问答>linux和unix
公司的防火墙源代码.一个注册proc文件的读函数看不懂
来源: 互联网 发布时间:2016-12-17
本文导语: static ssize_t read_ipmac_bind(char *buffer, char **start, off_t offset, int length, int *eof, void *data) { int len = 0, i; char ip[16]; off_t pos = 0, begin = 0; struct ipmac_item *bp; len += sprintf(buffer + len, "%-16s%-20sn", "IPAddr", "MAC"); if ((i...
static ssize_t read_ipmac_bind(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
{
int len = 0, i;
char ip[16];
off_t pos = 0, begin = 0;
struct ipmac_item *bp;
len += sprintf(buffer + len, "%-16s%-20sn", "IPAddr", "MAC");
if ((i = get_index()) == -1)
goto done_version_i;
for (; i next) {
sprintf(ip, "%u.%u.%u.%u", ntohl(bp->ip) >> 24 & 0xff, ntohl(bp->ip) >> 16 & 0xff, ntohl(bp->ip) >> 8 & 0xff, ntohl(bp->ip) & 0xff);
len += sprintf(buffer + len, "%st%02x:%02x:%02x:%02x:%02x:%02xn", ip, bp->mac[0], bp->mac[1], bp->mac[2], bp->mac[3], bp->mac[4], bp->mac[5]);
pos = begin + len;
if (pos offset + length) {
goto done_version_i;
}
}
}
}
done_version_i:
*start = buffer + (offset - begin); /* Start of wanted data */
len -= (offset - begin); /* Start slop */
if (len > length)
len = length;
return len;
}
|
这个代码很容易理解啊,不过有个bug,如果调用者传入比较小的缓存进来 length