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 }