Mercurial > masqmail
comparison src/listen.c @ 384:4848c16ed1c1
Beautifying.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Thu, 16 Feb 2012 11:22:31 +0100 |
parents | a2909de1818b |
children | 180a7f6a9383 |
comparison
equal
deleted
inserted
replaced
383:a2909de1818b | 384:4848c16ed1c1 |
---|---|
37 pid_t pid; | 37 pid_t pid; |
38 int status; | 38 int status; |
39 | 39 |
40 pid = waitpid(0, &status, 0); | 40 pid = waitpid(0, &status, 0); |
41 if (pid > 0) { | 41 if (pid > 0) { |
42 if (WEXITSTATUS(status) != 0) | 42 if (WEXITSTATUS(status) != 0) { |
43 logwrite(LOG_WARNING, "process %d exited with %d\n", pid, WEXITSTATUS(status)); | 43 logwrite(LOG_WARNING, "process %d exited with %d\n", |
44 if (WIFSIGNALED(status)) | 44 pid, WEXITSTATUS(status)); |
45 logwrite(LOG_WARNING, "process with pid %d got signal: %d\n", pid, WTERMSIG(status)); | 45 } |
46 if (WIFSIGNALED(status)) { | |
47 logwrite(LOG_WARNING, "process %d got signal: %d\n", | |
48 pid, WTERMSIG(status)); | |
49 } | |
46 } | 50 } |
47 signal(SIGCHLD, sigchld_handler); | 51 signal(SIGCHLD, sigchld_handler); |
48 } | 52 } |
49 | 53 |
50 void | 54 void |
61 rem_host, ntohs(sock_addr->sin_port)); | 65 rem_host, ntohs(sock_addr->sin_port)); |
62 | 66 |
63 /* start child for connection: */ | 67 /* start child for connection: */ |
64 signal(SIGCHLD, sigchld_handler); | 68 signal(SIGCHLD, sigchld_handler); |
65 pid = fork(); | 69 pid = fork(); |
66 if (pid == 0) { | 70 if (pid < 0) { |
71 logwrite(LOG_WARNING, "could not fork for incoming smtp " | |
72 "connection: %s\n", strerror(errno)); | |
73 } else if (pid == 0) { | |
74 /* child */ | |
67 close(listen_sock); | 75 close(listen_sock); |
68 out = fdopen(sock, "w"); | 76 out = fdopen(sock, "w"); |
69 in = fdopen(dup_sock, "r"); | 77 in = fdopen(dup_sock, "r"); |
70 | |
71 smtp_in(in, out, rem_host, ident); | 78 smtp_in(in, out, rem_host, ident); |
72 | |
73 _exit(0); | 79 _exit(0); |
74 } else if (pid < 0) { | |
75 logwrite(LOG_WARNING, "could not fork for incoming smtp connection: %s\n", strerror(errno)); | |
76 } | 80 } |
77 | 81 |
78 close(sock); | 82 close(sock); |
79 close(dup_sock); | 83 close(dup_sock); |
80 } | 84 } |
102 iface_list = g_list_remove_link(iface_list, node); | 106 iface_list = g_list_remove_link(iface_list, node); |
103 g_list_free_1(node); | 107 g_list_free_1(node); |
104 continue; | 108 continue; |
105 } | 109 } |
106 if (listen(sock, 1) < 0) { | 110 if (listen(sock, 1) < 0) { |
107 logwrite(LOG_ALERT, "listen: (terminating): %s\n", strerror(errno)); | 111 logwrite(LOG_ALERT, "listen: (terminating): %s\n", |
112 strerror(errno)); | |
108 exit(1); | 113 exit(1); |
109 } | 114 } |
110 logwrite(LOG_NOTICE, "listening on interface %s:%d\n", iface->address, iface->port); | 115 logwrite(LOG_NOTICE, "listening on interface %s:%d\n", |
116 iface->address, iface->port); | |
111 DEBUG(5) debugf("sock = %d\n", sock); | 117 DEBUG(5) debugf("sock = %d\n", sock); |
112 FD_SET(sock, &active_fd_set); | 118 FD_SET(sock, &active_fd_set); |
113 } | 119 } |
114 | 120 |
115 /* setup handler for HUP signal: */ | 121 /* setup handler for HUP signal: */ |
134 ** queue run should occur. select may put a value into tm, | 140 ** queue run should occur. select may put a value into tm, |
135 ** but doc for select() says we should not use it. | 141 ** but doc for select() says we should not use it. |
136 */ | 142 */ |
137 if (qival > 0) { | 143 if (qival > 0) { |
138 time(&time_now); | 144 time(&time_now); |
139 if (sel_ret == 0) { /* we are either just starting or did a queue run */ | 145 if (!sel_ret) { |
146 /* either just starting or after a queue run */ | |
140 tm.tv_sec = qival; | 147 tm.tv_sec = qival; |
141 tm.tv_usec = 0; | 148 tm.tv_usec = 0; |
142 time_before = time_now; | 149 time_before = time_now; |
143 } else { | 150 } else { |
144 tm.tv_sec = qival - (time_now - time_before); | 151 tm.tv_sec = qival - (time_now - time_before); |
145 tm.tv_usec = 0; | 152 tm.tv_usec = 0; |
146 | 153 |
147 /* race condition, very unlikely (but possible): */ | 154 /* race condition, unlikely (but possible): */ |
148 if (tm.tv_sec < 0) | 155 if (tm.tv_sec < 0) { |
149 tm.tv_sec = 0; | 156 tm.tv_sec = 0; |
157 } | |
150 } | 158 } |
151 } | 159 } |
152 /* | 160 /* |
153 ** Block until input arrives on one or more active sockets, | 161 ** Block until input arrives on one or more active sockets, |
154 ** or signal arrives, or queuing interval time elapsed | 162 ** or signal arrives, or queuing interval time elapsed |
155 ** (if qival > 0) | 163 ** (if qival > 0) |
156 */ | 164 */ |
157 read_fd_set = active_fd_set; | 165 read_fd_set = active_fd_set; |
158 if ((sel_ret = select(FD_SETSIZE, &read_fd_set, NULL, NULL, qival > 0 ? &tm : NULL)) < 0) { | 166 if ((sel_ret = select(FD_SETSIZE, &read_fd_set, NULL, NULL, |
167 qival > 0 ? &tm : NULL)) < 0) { | |
159 if (errno != EINTR) { | 168 if (errno != EINTR) { |
160 logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno)); | 169 logwrite(LOG_ALERT, "select: (terminating): " |
170 "%s\n", strerror(errno)); | |
161 exit(1); | 171 exit(1); |
162 } else { | 172 } else if (sighup_seen) { |
163 if (sighup_seen) { | 173 logwrite(LOG_NOTICE, "HUP signal received. " |
164 logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n"); | 174 "Restarting daemon\n"); |
165 | 175 |
166 for (i = 0; i < FD_SETSIZE; i++) | 176 for (i = 0; i < FD_SETSIZE; i++) |
167 if (FD_ISSET(i, &active_fd_set)) | 177 if (FD_ISSET(i, &active_fd_set)) |
168 close(i); | 178 close(i); |
169 | 179 |
170 execv(argv[0], &(argv[0])); | 180 execv(argv[0], &(argv[0])); |
171 logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno)); | 181 logwrite(LOG_ALERT, "restarting failed: %s\n", |
172 exit(1); | 182 strerror(errno)); |
173 } | 183 exit(1); |
174 } | 184 } |
175 } else if (sel_ret > 0) { | 185 } else if (sel_ret > 0) { |
176 for (i = 0; i < FD_SETSIZE; i++) { | 186 for (i = 0; i < FD_SETSIZE; i++) { |
177 if (FD_ISSET(i, &read_fd_set)) { | 187 int sock = i; |
178 int sock = i; | 188 int new; |
179 int new; | 189 |
180 size = sizeof(clientname); | 190 if (!FD_ISSET(i, &read_fd_set)) { |
181 new = accept(sock, (struct sockaddr *) &clientname, &size); | 191 continue; |
182 if (new < 0) { | 192 } |
183 logwrite(LOG_ALERT, "accept: (ignoring): %s\n", strerror(errno)); | 193 size = sizeof(clientname); |
184 } else | 194 new = accept(sock, (struct sockaddr *) |
185 accept_connect(sock, new, &clientname); | 195 &clientname, &size); |
196 if (new < 0) { | |
197 logwrite(LOG_ALERT, "accept: (ignoring): %s\n", strerror(errno)); | |
198 } else { | |
199 accept_connect(sock, new, | |
200 &clientname); | |
186 } | 201 } |
187 } | 202 } |
188 } else { | 203 } else { |
189 /* | 204 /* |
190 ** If select returns 0, the interval time has elapsed. | 205 ** If select returns 0, the interval time has elapsed. |
195 if ((pid = fork()) == 0) { | 210 if ((pid = fork()) == 0) { |
196 queue_run(); | 211 queue_run(); |
197 | 212 |
198 _exit(0); | 213 _exit(0); |
199 } else if (pid < 0) { | 214 } else if (pid < 0) { |
200 logwrite(LOG_ALERT, "could not fork for queue run"); | 215 logwrite(LOG_ALERT, "could not fork for " |
201 } | 216 "queue run"); |
202 } | 217 } |
203 } | 218 } |
204 } | 219 } |
220 } |