mirror of
https://git.sr.ht/~sircmpwn/gmnisrv
synced 2024-12-04 14:46:42 -05:00
config: parse listen directives
This commit is contained in:
parent
58500c8e53
commit
9adc6f34c7
@ -15,7 +15,7 @@ struct gmnisrv_host {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct gmnisrv_bind {
|
struct gmnisrv_bind {
|
||||||
int family;
|
int family, port;
|
||||||
char addr[sizeof(struct in6_addr)];
|
char addr[sizeof(struct in6_addr)];
|
||||||
struct gmnisrv_bind *next;
|
struct gmnisrv_bind *next;
|
||||||
};
|
};
|
||||||
|
61
src/config.c
61
src/config.c
@ -1,3 +1,4 @@
|
|||||||
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -21,9 +22,63 @@ gmnisrv_config_get_host(struct gmnisrv_config *conf, const char *hostname)
|
|||||||
static int
|
static int
|
||||||
parse_listen(struct gmnisrv_config *conf, const char *value)
|
parse_listen(struct gmnisrv_config *conf, const char *value)
|
||||||
{
|
{
|
||||||
// TODO
|
char listen[4096];
|
||||||
(void)conf;
|
assert(strlen(value) < sizeof(listen) - 1);
|
||||||
(void)value;
|
strcpy(listen, value);
|
||||||
|
|
||||||
|
char *tok = strtok(listen, " ");
|
||||||
|
while (tok) {
|
||||||
|
char *port = tok;
|
||||||
|
struct gmnisrv_bind *bind =
|
||||||
|
calloc(1, sizeof(struct gmnisrv_bind));
|
||||||
|
bind->port = 1965;
|
||||||
|
|
||||||
|
if (tok[0] == '[') {
|
||||||
|
bind->family = AF_INET6;
|
||||||
|
char *e = strchr(tok, ']');
|
||||||
|
if (!e) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error: invalid address specification %s\n",
|
||||||
|
tok);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*e = '\0';
|
||||||
|
port = e + 1;
|
||||||
|
++tok;
|
||||||
|
} else {
|
||||||
|
bind->family = AF_INET;
|
||||||
|
}
|
||||||
|
|
||||||
|
port = strchr(port, ':');
|
||||||
|
if (port) {
|
||||||
|
*port = '\0';
|
||||||
|
++port;
|
||||||
|
|
||||||
|
char *endptr;
|
||||||
|
bind->port = strtoul(port, &endptr, 10);
|
||||||
|
if (*endptr) {
|
||||||
|
fprintf(stderr, "Error: invalid port %s\n", port);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (bind->port == 0 || bind->port > 65535) {
|
||||||
|
fprintf(stderr, "Error: invalid port %s\n", port);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int r = inet_pton(bind->family, tok, bind->addr);
|
||||||
|
if (r != 1) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error: invalid address specification %s\n",
|
||||||
|
tok);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bind->next = conf->binds;
|
||||||
|
conf->binds = bind;
|
||||||
|
tok = strtok(NULL, " ");
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user