]> git.proxmox.com Git - mirror_frr.git/blame - ldpd/accept.c
mgmtd: Add note to SETCFG_REQ and debug logging
[mirror_frr.git] / ldpd / accept.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: ISC
8429abe0
RW
2/* $OpenBSD$ */
3
4/*
5 * Copyright (c) 2012 Claudio Jeker <claudio@openbsd.org>
8429abe0
RW
6 */
7
eac6e3f0 8#include <zebra.h>
8429abe0
RW
9
10#include "ldpd.h"
11#include "ldpe.h"
12#include "log.h"
13
14struct accept_ev {
15 LIST_ENTRY(accept_ev) entry;
e6685141
DS
16 struct event *ev;
17 void (*accept_cb)(struct event *);
8429abe0
RW
18 void *arg;
19 int fd;
20};
21
22struct {
eac6e3f0 23 LIST_HEAD(, accept_ev) queue;
e6685141 24 struct event *evt;
8429abe0
RW
25} accept_queue;
26
27static void accept_arm(void);
28static void accept_unarm(void);
e6685141
DS
29static void accept_cb(struct event *);
30static void accept_timeout(struct event *);
8429abe0
RW
31
32void
33accept_init(void)
34{
35 LIST_INIT(&accept_queue.queue);
8429abe0
RW
36}
37
e6685141 38int accept_add(int fd, void (*cb)(struct event *), void *arg)
8429abe0
RW
39{
40 struct accept_ev *av;
41
42 if ((av = calloc(1, sizeof(*av))) == NULL)
43 return (-1);
44 av->fd = fd;
45 av->accept_cb = cb;
46 av->arg = arg;
47 LIST_INSERT_HEAD(&accept_queue.queue, av, entry);
48
907a2395 49 event_add_read(master, accept_cb, av, av->fd, &av->ev);
8429abe0
RW
50
51 log_debug("%s: accepting on fd %d", __func__, fd);
52
53 return (0);
54}
55
56void
57accept_del(int fd)
58{
59 struct accept_ev *av;
60
61 LIST_FOREACH(av, &accept_queue.queue, entry)
62 if (av->fd == fd) {
63 log_debug("%s: %d removed from queue", __func__, fd);
e16d030c 64 EVENT_OFF(av->ev);
8429abe0
RW
65 LIST_REMOVE(av, entry);
66 free(av);
67 return;
68 }
69}
70
71void
72accept_pause(void)
73{
8429abe0
RW
74 log_debug(__func__);
75 accept_unarm();
907a2395 76 event_add_timer(master, accept_timeout, NULL, 1, &accept_queue.evt);
8429abe0
RW
77}
78
79void
80accept_unpause(void)
81{
eac6e3f0 82 if (accept_queue.evt != NULL) {
8429abe0 83 log_debug(__func__);
e16d030c 84 EVENT_OFF(accept_queue.evt);
8429abe0
RW
85 accept_arm();
86 }
87}
88
89static void
90accept_arm(void)
91{
92 struct accept_ev *av;
66e78ae6 93 LIST_FOREACH(av, &accept_queue.queue, entry) {
907a2395 94 event_add_read(master, accept_cb, av, av->fd, &av->ev);
66e78ae6 95 }
8429abe0
RW
96}
97
98static void
99accept_unarm(void)
100{
101 struct accept_ev *av;
102 LIST_FOREACH(av, &accept_queue.queue, entry)
e16d030c 103 EVENT_OFF(av->ev);
8429abe0
RW
104}
105
e6685141 106static void accept_cb(struct event *thread)
8429abe0 107{
e16d030c 108 struct accept_ev *av = EVENT_ARG(thread);
907a2395 109 event_add_read(master, accept_cb, av, av->fd, &av->ev);
eac6e3f0 110 av->accept_cb(thread);
8429abe0
RW
111}
112
e6685141 113static void accept_timeout(struct event *thread)
8429abe0 114{
eac6e3f0
RW
115 accept_queue.evt = NULL;
116
8429abe0
RW
117 log_debug(__func__);
118 accept_arm();
119}