-
Notifications
You must be signed in to change notification settings - Fork 0
/
nobody_netbsd.c
42 lines (36 loc) · 1.08 KB
/
nobody_netbsd.c
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
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
#include <netinet/in.h>
#include <netinet/ip_var.h>
#include <netinet/tcp.h>
#include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h>
#include <string.h>
#include "config.h"
#include "privatetcp.h"
void
privatetcp_nobody_helper_client(struct privatetcp_client *client)
{
static const int mib[] = {CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_IDENT};
static struct sockaddr_storage ss[2];
struct sockaddr_in *ssin = (struct sockaddr_in *)&ss[0];
struct sockaddr_in *csin = (struct sockaddr_in *)&ss[1];
size_t uidlen;
uid_t uid;
uidlen = sizeof(uid);
uid = 0;
memset(ss, 0, sizeof(ss));
ssin->sin_len = csin->sin_len = sizeof(struct sockaddr_in);
ssin->sin_family = csin->sin_family = AF_INET;
ssin->sin_addr.s_addr = csin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
ssin->sin_port = htons(client->sport);
csin->sin_port = htons(client->cport);
if (sysctl(mib, sizeof(mib) / sizeof(*mib), &uid, &uidlen, ss,
sizeof(ss)) == -1) {
warnsys("sysctl");
return;
}
client->uid = uid;
}