#include #include #include #include "../server/tcp.h" #include #include #include #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)}; return sendtoserv(commsock, CMD_REGISTER, (struct commd *)&r, &cerr); if (cerr != ERR_SUCCESS) LDEBUGF("Server returned error %i: %s. errno: %s\n", cerr, kv_strerror(cerr), strerror(errno)); } 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) LDEBUGF("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) LDEBUGF("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; } #ifndef n # define n 3 #endif int main(int argc, char *argv[]) { (void)argc; (void)argv; pthread_t ts[n]; for (int i = 0; i < n; ++i) { pthread_create(ts + i, NULL, thr, NULL); } for (int i = 0; i < n; ++i) pthread_join(ts[i], NULL); sleep(1); return 0; } /* vim: set ts=8 noet: */