878ba523ac
This library includes various random and minix-specific functions included in the Minix libc. Most of them should be part of libsys, and in general it would be nice to extinguish this library over time.
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
/* 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;
|
|
}
|