aboutsummaryrefslogtreecommitdiffstats
path: root/test/general.c
blob: d7673a3f631bee8540cf78dfc3beaf26be0d138b (plain)
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;
}