dhcp_settag.c

来自「minix操作系统最新版本(3.1.1)的源代码」· C语言 代码 · 共 58 行

C
58
字号
/*	dhcp_init(), dhcp_settag()			Author: Kees J. Bot *								1 Dec 2000 */#define nil ((void*)0)#include <stddef.h>#include <string.h>#include <sys/types.h>#include <net/hton.h>#include <net/gen/in.h>#include <net/gen/dhcp.h>#define arraysize(a)	(sizeof(a) / sizeof((a)[0]))#define arraylimit(a)	((a) + arraysize(a))void dhcp_init(dhcp_t *dp){    /* Initialize a DHCP packet. */    memset(dp, 0, offsetof(dhcp_t, magic));    dp->magic= DHCP_MAGIC;    memset(dp->options, 255, sizeof(dp->options));}int dhcp_settag(dhcp_t *dp, int tag, void *data, size_t len){    /* Add a tag to a DHCP packet.  No padding.  Only do the options field.     * (This is Minix, we don't need megabytes of silly bits of data.)     * The length may be zero to delete a tag.     */    u8_t *p;    int n;    if (tag <= 0 || tag >= 255) return 0;    for (p= dp->options; p < arraylimit(dp->options) && *p != 255; p += n) {	n= 1 + 1 + p[1];	if (*p == tag) {	    /* The tag is already there, remove it so it gets replaced. */	    memmove(p, p + n, arraylimit(dp->options) - (p + n));	    memset(arraylimit(dp->options) - n, 255, n);	    n= 0;	}    }    /* Add tag. */    if (len == 0) {	/* We're merely deleting a tag. */    } else    if (p + 1 + 1 + len <= arraylimit(dp->options)) {	*p++ = tag;	*p++ = len;	memcpy(p, data, len);    } else {	/* Oops, it didn't fit?  Is this really Minix??? */	return 0;    }    return 1;}

⌨️ 快捷键说明

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