]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - util.c
Cleanup; Fix MapBlock sorting bug; Use address as client id before auth completion
[dragonblocks_alpha.git] / util.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <limits.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include "util.h"
7
8 const char *program_name;
9
10 void syscall_error(const char *err)
11 {
12         perror(err);
13         exit(EXIT_FAILURE);
14 }
15
16 void internal_error(const char *err)
17 {
18         fprintf(stderr, "%s: %s\n", program_name, err);
19         exit(EXIT_FAILURE);
20 }
21
22
23 unsigned short get_port_from_args(int argc, char **argv, int index)
24 {
25         if (argc <= index)
26                 internal_error("missing port");
27
28         unsigned int port = atoi(argv[index]);
29
30         if (port == 0 || port > USHRT_MAX)
31                 internal_error("invalid port");
32
33         return htons(port);
34 }
35
36 char *read_string(int fd, size_t bufsiz)
37 {
38         char buf[bufsiz + 1];
39         buf[bufsiz] = 0;
40         for (size_t i = 0;; i++) {
41                 char c;
42                 if (read(fd, &c, 1) == -1) {
43                         perror("read");
44                         return NULL;
45                 }
46                 if (i < bufsiz)
47                         buf[i] = c;
48                 if (c == EOF || c == 0)
49                         break;
50         }
51         return strdup(buf);
52 }
53
54 char *address_string(struct sockaddr_in *addr)
55 {
56         char *str_addr = inet_ntoa(addr->sin_addr);
57         char str_port[5];
58         sprintf(str_port, "%d", ntohs(addr->sin_port));
59         char *address = malloc(strlen(str_addr) + 1 + strlen(str_port) + 1);
60         sprintf(address, "%s:%s", str_addr, str_port);
61         return address;
62 }