s/qmail 4.3.20
Next generation secure email transport
Loading...
Searching...
No Matches
control.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "open.h"
3#include "getln.h"
4#include "stralloc.h"
5#include "buffer.h"
6#include "logmsg.h"
7#include "control.h"
8#include "alloc.h"
9#include "scan.h"
10#include "error.h"
11#include "qmail.h"
12
13static char inbuf[BUFSIZE_MESS];
14static stralloc line = {0};
15static stralloc me = {0};
16static int meok = 0;
17
21static void striptrailingwhitespace(stralloc *sa)
22{
23 while (sa->len > 0)
24 switch (sa->s[sa->len - 1]) {
25 case '\n': case ' ': case '\t':
26 --sa->len;
27 break;
28 default:
29 return;
30 }
31}
32
33int control_init(void)
34{
35 int r;
36
37 r = control_readline(&me,"control/me");
38 if (r == 1) meok = 1;
39 return r;
40}
41
42int control_rldef(stralloc *sa,char *fn,int flagme,char *def)
43{
44 int r;
45
47 if (r) return r;
48 if (flagme) if (meok) return stralloc_copy(sa,&me) ? 1 : -1;
49 if (def) return stralloc_copys(sa,def) ? 1 : -1;
50 return r;
51}
52
53int control_readline(stralloc *sa,char *fn)
54{
55 buffer b;
56 int fd;
57 int match;
58
59 fd = open_read(fn);
60 if (fd == -1) { if (errno == ENOENT) return 0; return -1; }
61
62 buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
63
64 if (getln(&b,sa,&match,'\n') == -1) { close(fd); return -1; }
65
66 striptrailingwhitespace(sa);
67
68 close(fd);
69 return 1;
70}
71
72int control_readint(unsigned long *i,char *fn)
73{
74 unsigned long u;
75
76 switch (control_readline(&line,fn)) {
77 case 0: return 0;
78 case -1: return -1;
79 }
80 if (!stralloc_0(&line)) return -1;
81 if (!scan_ulong(line.s,&u)) return 0;
82 *i = u;
83
84 return 1;
85}
86
87int control_readfile(stralloc *sa,char *fn,int flagme)
88{
89 buffer b;
90 int fd;
91 int match;
92
93 if (!stralloc_copys(sa,"")) return -1;
94
95 fd = open_read(fn);
96 if (fd == -1) {
97 if (errno == ENOENT) {
98 if (flagme && meok) {
99 if (!stralloc_copy(sa,&me)) return -1;
100 if (!stralloc_0(sa)) return -1;
101 return 1;
102 }
103 return 0;
104 }
105 return -1;
106 }
107
108 buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
109
110 for (;;) {
111 if (getln(&b,&line,&match,'\n') == -1) break;
112 if (!match && !line.len) { close(fd); return 1; }
113 striptrailingwhitespace(&line);
114 if (!stralloc_0(&line)) break;
115 if (line.s[0])
116 if (line.s[0] != '#')
117 if (!stralloc_cat(sa,&line)) break;
118 if (!match) { close(fd); return 1; }
119 }
120
121 close(fd);
122 return -1;
123}
buffer b
Definition: auto-gid.c:10
char inbuf[BUFFER_SMALL]
Definition: auto-gid.c:9
int control_readint(unsigned long *i, char *fn)
Definition: control.c:72
int control_readline(stralloc *sa, char *fn)
Definition: control.c:53
int control_rldef(stralloc *sa, char *fn, int flagme, char *def)
Definition: control.c:42
int control_readfile(stralloc *sa, char *fn, int flagme)
Definition: control.c:87
int control_init(void)
Definition: control.c:33
int stralloc_copys(stralloc *, char const *)
stralloc sa
Definition: dnscname.c:11
int match
Definition: matchup.c:196
int fd
stralloc fn
Definition: qmail-qmaint.c:551
#define BUFSIZE_MESS
Definition: qmail.h:7