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 <netinet/in.h>
#include <stdio.h>
#include <pthread.h>
#include "../server/tcp.h"
#include <errno.h>
#include <packet.h>
#define W printf("LINE %i\n", __LINE__)
int commsock;
enum commd_error cerr;
void setup_globals(void) { commsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); }
u64 sendtoserv(int sock, enum commd_type t, struct commd *cmd, enum commd_error * NULLABLE e) {
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in serv = {
.sin_family = AF_INET, .sin_port = htons(TCP_PORT), .sin_addr = {htonl(INADDR_LOOPBACK)}};
while (connect(sock, (struct sockaddr *)&serv, sizeof(serv)) != 0) sleep(1);
t = htonl(t);
if (send(sock, &t, sizeof(t), 0) <= 0) { *e = ERR_SERV; return 0; }
if (send(sock, cmd, sizeof(*cmd), 0) <= 0) { *e = ERR_SERV; return 0; }
u64 resp;
if (recv(sock, &resp, sizeof(resp), 0) <= 0) {*e = ERR_SERV; return 0; }
resp = ntoh64(resp);
if (resp == 0 && e != NULL) {
read(sock, e, sizeof(*e));
*e = ntohl(*e);
}
shutdown(sock, SHUT_RDWR);
close(sock);
return resp;
}
u64 register_user(i32 perm) {
struct commd_register r = {.auid = hton64(0), .perm = hton64(perm)};
if (cerr != ERR_SUCCESS) DEBUGF("Server returned error %i: %s. errno: %s\n", cerr, kv_strerror(cerr), strerror(errno));
return sendtoserv(commsock, CMD_REGISTER, (struct commd *)&r, &cerr);
}
void unreg_user(u64 u) {
struct commd_unregister unreg = {.auid = hton64(u), .uid = hton64(u)};
u64 resp = sendtoserv(commsock, CMD_UNREGISTER, (struct commd *)&unreg, &cerr);
if (cerr != ERR_SUCCESS) DEBUGF("Server returned error %i: %s. errno: %s\n", cerr, kv_strerror(cerr), strerror(errno));
printf("sendtoserv returned %zu\n", resp);
}
u64 create_channel(u64 u) {
struct commd_create c = {.uid = hton64(u)};
u64 resp = sendtoserv(commsock, CMD_CREATE, (struct commd *)&c, &cerr);
if (cerr != ERR_SUCCESS) DEBUGF("Server returned error %i: %s\n", cerr, kv_strerror(cerr));
return resp;
}
void* thr(void* a) {
(void)a;
u64 uid = register_user(perm_none);
printf("uid: %zu\n", uid);
unreg_user(uid);
uid = register_user(perm_admin);
printf("uid: %zu\n", uid);
u64 chid = create_channel(uid);
printf("chid: %zu\n", chid);
return NULL;
}
int main(int argc, char *argv[]) {
(void)argc;
(void)argv;
for (int i = 0; i < 1; ++i) {
pthread_t t;
pthread_create(&t, NULL, thr, NULL);
}
sleep(1);
return 0;
}
|