chiark / gitweb /
Merge branches 'idx/verh' and 'idx/qmqpc'
[qmail] / control.c
1 #include "readwrite.h"
2 #include "open.h"
3 #include "getln.h"
4 #include "stralloc.h"
5 #include "substdio.h"
6 #include "error.h"
7 #include "control.h"
8 #include "alloc.h"
9 #include "scan.h"
10
11 static char inbuf[64];
12 static stralloc line = {0};
13 static stralloc me = {0};
14 static int meok = 0;
15
16 static void striptrailingwhitespace(sa)
17 stralloc *sa;
18 {
19  while (sa->len > 0)
20    switch(sa->s[sa->len - 1])
21     {
22      case '\n': case ' ': case '\t':
23        --sa->len;
24        break;
25      default:
26        return;
27     }
28 }
29
30 int control_init()
31 {
32  int r;
33  r = control_readline(&me,"control/me");
34  if (r == 1) meok = 1;
35  return r;
36 }
37
38 int control_rldef(sa,fn,flagme,def)
39 stralloc *sa;
40 char *fn;
41 int flagme;
42 char *def;
43 {
44  int r;
45  r = control_readline(sa,fn);
46  if (r) return r;
47  if (flagme) if (meok) return stralloc_copy(sa,&me) ? 1 : -1;
48  if (def) return stralloc_copys(sa,def) ? 1 : -1;
49  return r;
50 }
51
52 int control_readline(sa,fn)
53 stralloc *sa;
54 char *fn;
55 {
56  substdio ss;
57  int fd;
58  int match;
59
60  fd = open_read(fn);
61  if (fd == -1) { if (errno == error_noent) return 0; return -1; }
62  
63  substdio_fdbuf(&ss,read,fd,inbuf,sizeof(inbuf));
64
65  if (getln(&ss,sa,&match,'\n') == -1) { close(fd); return -1; }
66
67  striptrailingwhitespace(sa);
68  close(fd);
69  return 1;
70 }
71
72 int control_readint(i,fn)
73 int *i;
74 char *fn;
75 {
76  unsigned long u;
77  switch(control_readline(&line,fn))
78   {
79    case 0: return 0;
80    case -1: return -1;
81   }
82  if (!stralloc_0(&line)) return -1;
83  if (!scan_ulong(line.s,&u)) return 0;
84  *i = u;
85  return 1;
86 }
87
88 int control_readfile(sa,fn,flagme)
89 stralloc *sa;
90 char *fn;
91 int flagme;
92 {
93  substdio ss;
94  int fd;
95  int match;
96
97  if (!stralloc_copys(sa,"")) return -1;
98
99  fd = open_read(fn);
100  if (fd == -1) 
101   {
102    if (errno == error_noent)
103     {
104      if (flagme && meok)
105       {
106        if (!stralloc_copy(sa,&me)) return -1;
107        if (!stralloc_0(sa)) return -1;
108        return 1;
109       }
110      return 0;
111     }
112    return -1;
113   }
114
115  substdio_fdbuf(&ss,read,fd,inbuf,sizeof(inbuf));
116
117  for (;;)
118   {
119    if (getln(&ss,&line,&match,'\n') == -1) break;
120    if (!match && !line.len) { close(fd); return 1; }
121    striptrailingwhitespace(&line);
122    if (!stralloc_0(&line)) break;
123    if (line.s[0])
124      if (line.s[0] != '#')
125        if (!stralloc_cat(sa,&line)) break;
126    if (!match) { close(fd); return 1; }
127   }
128  close(fd);
129  return -1;
130 }