Release 1.3.9.
[fwd] / source.c
CommitLineData
07d71f34 1/* -*-c-*-
2 *
07d71f34 3 * Standard routines for forwarding sources
4 *
5 * (c) 1999 Straylight/Edgeware
6 */
7
206212ca 8/*----- Licensing notice --------------------------------------------------*
07d71f34 9 *
9155ea97 10 * This file is part of the `fwd' port forwarder.
07d71f34 11 *
9155ea97 12 * `fwd' is free software; you can redistribute it and/or modify
07d71f34 13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
206212ca 16 *
9155ea97 17 * `fwd' is distributed in the hope that it will be useful,
07d71f34 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
206212ca 21 *
07d71f34 22 * You should have received a copy of the GNU General Public License
9155ea97 23 * along with `fwd'; if not, write to the Free Software Foundation,
07d71f34 24 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 */
26
9155ea97 27#include "fwd.h"
07d71f34 28
29/*----- Static variables --------------------------------------------------*/
30
31static source *sources = 0;
32
33/*----- Main code ---------------------------------------------------------*/
34
35/* --- @source_add@ --- *
36 *
37 * Arguments: @source *s@ = pointer to a source
38 *
39 * Returns: ---
40 *
41 * Use: Adds a source to the master list. Only do this for passive
42 * sources (e.g., listening sockets), not active sources (e.g.,
43 * executable programs).
44 */
45
46void source_add(source *s)
47{
57ceb980
MW
48 assert(s->ops->shutdown);
49 assert(!(s->f&SF_ACTIVE));
07d71f34 50 s->next = sources;
51 s->prev = 0;
52 if (sources)
53 sources->prev = s;
54 sources = s;
57ceb980
MW
55 s->f |= SF_ACTIVE;
56 source_inc(s);
07d71f34 57}
58
59/* --- @source_remove@ --- *
60 *
61 * Arguments: @source *s@ = pointer to a source
62 *
63 * Returns: ---
64 *
65 * Use: Removes a source from the master list.
66 */
67
68void source_remove(source *s)
69{
57ceb980 70 assert(s->f&SF_ACTIVE);
07d71f34 71 if (s->next)
72 s->next->prev = s->prev;
73 if (s->prev)
74 s->prev->next = s->next;
75 else
76 sources = s->next;
57ceb980
MW
77 s->f &= ~SF_ACTIVE;
78 source_dec(s);
79}
80
81/* --- @source_inc@ --- *
82 *
83 * Arguments: @source *s@ = pointer to a source
84 *
85 * Returns: ---
86 *
87 * Use: Increments a source's refcount.
88 */
89
90void source_inc(source *s) { s->ref++; }
91
92/* --- @source_dec@ --- *
93 *
94 * Arguments: @source *s@ = pointer to a source
95 *
96 * Returns: ---
97 *
98 * Use: Decrements a source's refcount, destroying it if necessary.
99 */
100
101void source_dec(source *s)
102{
103 assert(s->ref > 0);
104 s->ref--;
105 if (!s->ref) {
106 if (s->f&SF_ACTIVE) s->ops->shutdown(s);
107 s->ops->destroy(s);
108 }
07d71f34 109}
110
111/* --- @source_killall@ --- *
112 *
113 * Arguments: ---
114 *
115 * Returns: ---
116 *
117 * Use: Frees all sources.
118 */
119
120void source_killall(void)
121{
122 source *s = sources;
123 while (s) {
124 source *ss = s;
125 s = s->next;
57ceb980 126 ss->ops->shutdown(ss);
07d71f34 127 }
128 sources = 0;
129}
130
131/*----- That's all, folks -------------------------------------------------*/