-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathbackend.c
74 lines (58 loc) · 1.87 KB
/
backend.c
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
#include <string.h>
#include <utlist.h>
#include "backend.h"
#include "proxy.h"
#include "utils.h"
backend_context_t *new_backend(struct proxy_context *ctx,
const char *host_port)
{
//DBG("%s(%s)", __func__, host_port);
char addrbuf[128];
strncpy(addrbuf, host_port, sizeof(addrbuf)-1);
char *sep = strrchr(addrbuf, ':');
if (NULL==sep) {
ERR("no specified port");
return NULL;
}
*sep = '\0';
backend_context_t *backend = (backend_context_t *)malloc(sizeof(backend_context_t));
if (NULL==backend) {
ERR("failed to allocate backend_context");
return NULL;
}
memset(backend, 0, sizeof(backend_context_t));
if (resolve_address(addrbuf, sep+1, &backend->address) < 0) {
ERR("cannot resolve backend address");
free(backend);
return NULL;
}
backend->address.ifindex = ctx->backends.count++;
memset(addrbuf, 0, sizeof(addrbuf));
print_address(&backend->address, addrbuf, sizeof(addrbuf)-1);
DBG("backend %u: %s", backend->address.ifindex, addrbuf);
LL_PREPEND(ctx->backends.server, backend);
return backend;
}
void free_backend(struct proxy_context *ctx,
backend_context_t *backend)
{
if (ctx && backend) {
LL_DELETE(ctx->backends.server, backend);
ctx->backends.count--;
free(backend);
}
}
backend_context_t *next_backend(struct proxy_context *ctx)
{
backend_context_t *backend = NULL;
LL_FOREACH(ctx->backends.server, backend) {
if (ctx->backends.current == backend->address.ifindex) {
// next index
if (++ctx->backends.current >= ctx->backends.count ) {
ctx->backends.current = 0;
}
return backend;
}
}
return backend;
}