-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathcmsg.c
More file actions
79 lines (60 loc) · 1.23 KB
/
cmsg.c
File metadata and controls
79 lines (60 loc) · 1.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <cmsg.h>
#include <string.h>
ulong cmsg_align(ulong len)
{
int mask = sizeof(long) - 1;
return ((len + mask) & ~mask);
}
struct cmsg* cmsg_first(void* p, void* e)
{
struct cmsg* cm = p;
ulong len = e - p;
if(len < sizeof(cm))
return NULL;
if(len < cmsg_align(cm->len))
return NULL;
return cm;
}
struct cmsg* cmsg_next(void* p, void* e)
{
struct cmsg* cm;
if(!(cm = cmsg_first(p, e)))
return NULL;
p += cmsg_align(cm->len);
return cmsg_first(p, e);
}
void* cmsg_put(void* p, void* e, int lvl, int type, void* data, ulong dlen)
{
if(!p) return p;
int msglen = sizeof(struct cmsg) + dlen;
long need = cmsg_align(msglen);
long have = e - p;
if(have < need)
return NULL;
struct cmsg* cm = p;
cm->len = msglen;
cm->level = lvl;
cm->type = type;
memcpy(cm->data, data, dlen);
return p + need;
}
int cmsg_paylen(struct cmsg* cm)
{
return cm->len - sizeof(*cm);
}
void* cmsg_payload(struct cmsg* cm)
{
return cm->data;
}
void* cmsg_paylend(struct cmsg* cm)
{
return cm->data + (cm->len - sizeof(*cm));
}
struct cmsg* cmsg_get(void* p, void* e, int lvl, int type)
{
struct cmsg* cm;
for(cm = cmsg_first(p, e); cm; cm = cmsg_next(cm, e))
if(cm->level == lvl && cm->type == type)
return cm;
return NULL;
}