masqmail

diff src/listen.c @ 10:26e34ae9a3e3

changed indention and line wrapping to a more consistent style
author meillo@marmaro.de
date Mon, 27 Oct 2008 16:23:10 +0100
parents 08114f7dcc23
children f671821d8222
line diff
     1.1 --- a/src/listen.c	Mon Oct 27 16:21:27 2008 +0100
     1.2 +++ b/src/listen.c	Mon Oct 27 16:23:10 2008 +0100
     1.3 @@ -22,222 +22,205 @@
     1.4  
     1.5  static int volatile sighup_seen = 0;
     1.6  
     1.7 -static
     1.8 -void sighup_handler(int sig)
     1.9 +static void
    1.10 +sighup_handler(int sig)
    1.11  {
    1.12 -  sighup_seen = 1;
    1.13 -  signal(SIGHUP, sighup_handler);
    1.14 +	sighup_seen = 1;
    1.15 +	signal(SIGHUP, sighup_handler);
    1.16  }
    1.17  
    1.18 -static
    1.19 -void sigchld_handler(int sig)
    1.20 +static void
    1.21 +sigchld_handler(int sig)
    1.22  {
    1.23 -  pid_t pid;
    1.24 -  int status;
    1.25 -  
    1.26 -  pid = waitpid(0, &status, 0);
    1.27 -  if(pid > 0){
    1.28 -    if(WEXITSTATUS(status) != EXIT_SUCCESS)
    1.29 -      logwrite(LOG_WARNING, "process %d exited with %d\n",
    1.30 -	       pid, WEXITSTATUS(status));
    1.31 -    if(WIFSIGNALED(status))
    1.32 -      logwrite(LOG_WARNING,
    1.33 -	       "process with pid %d got signal: %d\n",
    1.34 -	       pid, WTERMSIG(status));
    1.35 -  }
    1.36 -  signal(SIGCHLD, sigchld_handler);
    1.37 +	pid_t pid;
    1.38 +	int status;
    1.39 +
    1.40 +	pid = waitpid(0, &status, 0);
    1.41 +	if (pid > 0) {
    1.42 +		if (WEXITSTATUS(status) != EXIT_SUCCESS)
    1.43 +			logwrite(LOG_WARNING, "process %d exited with %d\n", pid, WEXITSTATUS(status));
    1.44 +		if (WIFSIGNALED(status))
    1.45 +			logwrite(LOG_WARNING, "process with pid %d got signal: %d\n", pid, WTERMSIG(status));
    1.46 +	}
    1.47 +	signal(SIGCHLD, sigchld_handler);
    1.48  }
    1.49  
    1.50  #ifdef ENABLE_SMTP_SERVER
    1.51 -void accept_connect(int listen_sock, int sock, struct sockaddr_in* sock_addr)
    1.52 +void
    1.53 +accept_connect(int listen_sock, int sock, struct sockaddr_in *sock_addr)
    1.54  {
    1.55 -  pid_t pid;
    1.56 -  int dup_sock = dup(sock);
    1.57 -  FILE *out, *in;
    1.58 -  gchar *rem_host;
    1.59 -  gchar *ident = NULL;
    1.60 +	pid_t pid;
    1.61 +	int dup_sock = dup(sock);
    1.62 +	FILE *out, *in;
    1.63 +	gchar *rem_host;
    1.64 +	gchar *ident = NULL;
    1.65  
    1.66 -  rem_host = g_strdup(inet_ntoa(sock_addr->sin_addr));
    1.67 +	rem_host = g_strdup(inet_ntoa(sock_addr->sin_addr));
    1.68  #ifdef ENABLE_IDENT
    1.69 -  {
    1.70 -    gchar *id = NULL;
    1.71 -    if((id = (gchar *)ident_id(sock, 60))){
    1.72 -      ident = g_strdup(id);
    1.73 -    }
    1.74 -    logwrite(LOG_NOTICE, "connect from host %s, port %hd ident=%s\n",
    1.75 -	     rem_host,
    1.76 -	     ntohs (sock_addr->sin_port),
    1.77 -	     ident ? ident : "(unknown)");
    1.78 -  }
    1.79 +	{
    1.80 +		gchar *id = NULL;
    1.81 +		if ((id = (gchar *) ident_id(sock, 60))) {
    1.82 +			ident = g_strdup(id);
    1.83 +		}
    1.84 +		logwrite(LOG_NOTICE, "connect from host %s, port %hd ident=%s\n", rem_host,
    1.85 +		         ntohs(sock_addr->sin_port), ident ? ident : "(unknown)");
    1.86 +	}
    1.87  #else
    1.88 -  logwrite(LOG_NOTICE, "connect from host %s, port %hd\n",
    1.89 -	 rem_host,
    1.90 -	 ntohs (sock_addr->sin_port));
    1.91 +	logwrite(LOG_NOTICE, "connect from host %s, port %hd\n", rem_host, ntohs(sock_addr->sin_port));
    1.92  #endif
    1.93  
    1.94 -  // start child for connection:
    1.95 -  signal(SIGCHLD, sigchld_handler);
    1.96 -  pid = fork();
    1.97 -  if(pid == 0){
    1.98 -    close(listen_sock);
    1.99 -    out = fdopen(sock, "w");
   1.100 -    in = fdopen(dup_sock, "r");
   1.101 -    
   1.102 -    smtp_in(in, out, rem_host, ident);
   1.103 +	// start child for connection:
   1.104 +	signal(SIGCHLD, sigchld_handler);
   1.105 +	pid = fork();
   1.106 +	if (pid == 0) {
   1.107 +		close(listen_sock);
   1.108 +		out = fdopen(sock, "w");
   1.109 +		in = fdopen(dup_sock, "r");
   1.110  
   1.111 -    _exit(EXIT_SUCCESS);
   1.112 -  }else if(pid < 0){
   1.113 -    logwrite(LOG_WARNING, "could not fork for incoming smtp connection: %s\n",
   1.114 -	     strerror(errno));
   1.115 -  }
   1.116 +		smtp_in(in, out, rem_host, ident);
   1.117  
   1.118 +		_exit(EXIT_SUCCESS);
   1.119 +	} else if (pid < 0) {
   1.120 +		logwrite(LOG_WARNING, "could not fork for incoming smtp connection: %s\n", strerror(errno));
   1.121 +	}
   1.122  #ifdef ENABLE_IDENT
   1.123 -  if(ident != NULL) g_free(ident);
   1.124 +	if (ident != NULL)
   1.125 +		g_free(ident);
   1.126  #endif
   1.127  
   1.128 -  close(sock);
   1.129 -  close(dup_sock);
   1.130 +	close(sock);
   1.131 +	close(dup_sock);
   1.132  }
   1.133 -#endif /*ifdef ENABLE_SMTP_SERVER*/
   1.134 +#endif  /*ifdef ENABLE_SMTP_SERVER */
   1.135  
   1.136 -void listen_port(GList *iface_list, gint qival, char *argv[])
   1.137 +void
   1.138 +listen_port(GList * iface_list, gint qival, char *argv[])
   1.139  {
   1.140 -  int i;
   1.141 -  fd_set active_fd_set, read_fd_set;
   1.142 -  struct timeval tm;
   1.143 -  time_t time_before, time_now;
   1.144 -  struct sockaddr_in clientname;
   1.145 -  size_t size;
   1.146 -  GList *node, *node_next;
   1.147 -  int sel_ret;
   1.148 +	int i;
   1.149 +	fd_set active_fd_set, read_fd_set;
   1.150 +	struct timeval tm;
   1.151 +	time_t time_before, time_now;
   1.152 +	struct sockaddr_in clientname;
   1.153 +	size_t size;
   1.154 +	GList *node, *node_next;
   1.155 +	int sel_ret;
   1.156  
   1.157 -  /* Create the sockets and set them up to accept connections. */
   1.158 -  FD_ZERO (&active_fd_set);
   1.159 +	/* Create the sockets and set them up to accept connections. */
   1.160 +	FD_ZERO(&active_fd_set);
   1.161  #ifdef ENABLE_SMTP_SERVER
   1.162 -  for(node = g_list_first(iface_list);
   1.163 -      node;
   1.164 -      node = node_next){
   1.165 -    interface *iface = (interface *)(node->data);
   1.166 -    int sock;
   1.167 +	for (node = g_list_first(iface_list); node; node = node_next) {
   1.168 +		interface *iface = (interface *) (node->data);
   1.169 +		int sock;
   1.170  
   1.171 -    node_next=g_list_next(node);
   1.172 -    if ((sock = make_server_socket (iface))<0){
   1.173 -      iface_list= g_list_remove_link(iface_list, node);
   1.174 -      g_list_free_1(node);
   1.175 -      continue;
   1.176 -    }
   1.177 -    if (listen (sock, 1) < 0){
   1.178 -      logwrite(LOG_ALERT, "listen: (terminating): %s\n", strerror(errno));
   1.179 -      exit (EXIT_FAILURE);
   1.180 -    }
   1.181 -    logwrite(LOG_NOTICE, "listening on interface %s:%d\n",
   1.182 -	     iface->address, iface->port);
   1.183 -    DEBUG(5) debugf("sock = %d\n", sock);
   1.184 -    FD_SET (sock, &active_fd_set);
   1.185 -  }
   1.186 +		node_next = g_list_next(node);
   1.187 +		if ((sock = make_server_socket(iface)) < 0) {
   1.188 +			iface_list = g_list_remove_link(iface_list, node);
   1.189 +			g_list_free_1(node);
   1.190 +			continue;
   1.191 +		}
   1.192 +		if (listen(sock, 1) < 0) {
   1.193 +			logwrite(LOG_ALERT, "listen: (terminating): %s\n", strerror(errno));
   1.194 +			exit(EXIT_FAILURE);
   1.195 +		}
   1.196 +		logwrite(LOG_NOTICE, "listening on interface %s:%d\n", iface->address, iface->port);
   1.197 +		DEBUG(5) debugf("sock = %d\n", sock);
   1.198 +		FD_SET(sock, &active_fd_set);
   1.199 +	}
   1.200  #endif
   1.201  
   1.202 -  /* setup handler for HUP signal: */
   1.203 -  signal(SIGHUP, sighup_handler);
   1.204 -  signal(SIGCHLD, sigchld_handler);
   1.205 +	/* setup handler for HUP signal: */
   1.206 +	signal(SIGHUP, sighup_handler);
   1.207 +	signal(SIGCHLD, sigchld_handler);
   1.208  
   1.209 -  /* now that we have our socket(s),
   1.210 -     we can give up root privileges */
   1.211 -  if(!conf.run_as_user){
   1.212 -    if(setegid(conf.mail_gid) != 0){
   1.213 -      logwrite(LOG_ALERT, "could not change gid to %d: %s\n",
   1.214 -	       conf.mail_gid, strerror(errno));
   1.215 -      exit(EXIT_FAILURE);
   1.216 -    }
   1.217 -    if(seteuid(conf.mail_uid) != 0){
   1.218 -      logwrite(LOG_ALERT, "could not change uid to %d: %s\n",
   1.219 -	       conf.mail_uid, strerror(errno));
   1.220 -      exit(EXIT_FAILURE);
   1.221 -    }
   1.222 -  }
   1.223 +	/* now that we have our socket(s),
   1.224 +	   we can give up root privileges */
   1.225 +	if (!conf.run_as_user) {
   1.226 +		if (setegid(conf.mail_gid) != 0) {
   1.227 +			logwrite(LOG_ALERT, "could not change gid to %d: %s\n", conf.mail_gid, strerror(errno));
   1.228 +			exit(EXIT_FAILURE);
   1.229 +		}
   1.230 +		if (seteuid(conf.mail_uid) != 0) {
   1.231 +			logwrite(LOG_ALERT, "could not change uid to %d: %s\n", conf.mail_uid, strerror(errno));
   1.232 +			exit(EXIT_FAILURE);
   1.233 +		}
   1.234 +	}
   1.235  
   1.236 -  /*  sel_ret = 0;*/
   1.237 -  time(&time_before);
   1.238 -  time_before -= qival;
   1.239 -  sel_ret = -1;
   1.240 +	/*  sel_ret = 0; */
   1.241 +	time(&time_before);
   1.242 +	time_before -= qival;
   1.243 +	sel_ret = -1;
   1.244  
   1.245 -  while (1){
   1.246 +	while (1) {
   1.247  
   1.248 -    /* if we were interrupted by an incoming connection (or a signal)
   1.249 -       we have to recalculate the time until the next queue run should
   1.250 -       occur. select may put a value into tm, but doc for select() says
   1.251 -       we should not use it.*/
   1.252 -    if(qival > 0){
   1.253 -      time(&time_now);
   1.254 -      if(sel_ret == 0){ /* we are either just starting or did a queue run */
   1.255 -	tm.tv_sec = qival;
   1.256 -	tm.tv_usec = 0;
   1.257 -	time_before = time_now;
   1.258 -      }else{
   1.259 -	tm.tv_sec = qival - (time_now - time_before);
   1.260 -	tm.tv_usec = 0;
   1.261 +		/* if we were interrupted by an incoming connection (or a signal)
   1.262 +		   we have to recalculate the time until the next queue run should
   1.263 +		   occur. select may put a value into tm, but doc for select() says
   1.264 +		   we should not use it. */
   1.265 +		if (qival > 0) {
   1.266 +			time(&time_now);
   1.267 +			if (sel_ret == 0) {  /* we are either just starting or did a queue run */
   1.268 +				tm.tv_sec = qival;
   1.269 +				tm.tv_usec = 0;
   1.270 +				time_before = time_now;
   1.271 +			} else {
   1.272 +				tm.tv_sec = qival - (time_now - time_before);
   1.273 +				tm.tv_usec = 0;
   1.274  
   1.275 -	/* race condition, very unlikely (but possible): */
   1.276 -	if(tm.tv_sec < 0)
   1.277 -	  tm.tv_sec = 0;
   1.278 -      }
   1.279 -    }
   1.280 -    /* Block until input arrives on one or more active sockets,
   1.281 -       or signal arrives,
   1.282 -       or queuing interval time elapsed (if qival > 0) */
   1.283 -    read_fd_set = active_fd_set;
   1.284 -    if ((sel_ret = select(FD_SETSIZE, &read_fd_set, NULL, NULL,
   1.285 -			  qival > 0 ? &tm : NULL)) < 0){
   1.286 -      if(errno != EINTR){
   1.287 -	logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno));
   1.288 -	exit (EXIT_FAILURE);
   1.289 -      }else{
   1.290 -	if(sighup_seen){
   1.291 -	  logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n");
   1.292 +				/* race condition, very unlikely (but possible): */
   1.293 +				if (tm.tv_sec < 0)
   1.294 +					tm.tv_sec = 0;
   1.295 +			}
   1.296 +		}
   1.297 +		/* Block until input arrives on one or more active sockets,
   1.298 +		   or signal arrives,
   1.299 +		   or queuing interval time elapsed (if qival > 0) */
   1.300 +		read_fd_set = active_fd_set;
   1.301 +		if ((sel_ret = select(FD_SETSIZE, &read_fd_set, NULL, NULL, qival > 0 ? &tm : NULL)) < 0) {
   1.302 +			if (errno != EINTR) {
   1.303 +				logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno));
   1.304 +				exit(EXIT_FAILURE);
   1.305 +			} else {
   1.306 +				if (sighup_seen) {
   1.307 +					logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n");
   1.308  
   1.309 -	  for(i = 0; i < FD_SETSIZE; i++)
   1.310 -	    if(FD_ISSET(i, &active_fd_set))
   1.311 -	      close(i);
   1.312 +					for (i = 0; i < FD_SETSIZE; i++)
   1.313 +						if (FD_ISSET(i, &active_fd_set))
   1.314 +							close(i);
   1.315  
   1.316 -	  execv(argv[0], &(argv[0]));
   1.317 -	  logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno));
   1.318 -	  exit(EXIT_FAILURE);
   1.319 +					execv(argv[0], &(argv[0]));
   1.320 +					logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno));
   1.321 +					exit(EXIT_FAILURE);
   1.322 +				}
   1.323 +			}
   1.324 +		} else if (sel_ret > 0) {
   1.325 +#ifdef ENABLE_SMTP_SERVER
   1.326 +			for (i = 0; i < FD_SETSIZE; i++) {
   1.327 +				if (FD_ISSET(i, &read_fd_set)) {
   1.328 +					int sock = i;
   1.329 +					int new;
   1.330 +					size = sizeof(clientname);
   1.331 +					new = accept(sock, (struct sockaddr *) &clientname, &size);
   1.332 +					if (new < 0) {
   1.333 +						logwrite(LOG_ALERT, "accept: (ignoring): %s\n", strerror(errno));
   1.334 +					} else
   1.335 +						accept_connect(sock, new, &clientname);
   1.336 +				}
   1.337 +			}
   1.338 +#else
   1.339 +			;
   1.340 +#endif
   1.341 +		} else {
   1.342 +			/* If select returns 0, the interval time has elapsed.
   1.343 +			   We start a new queue runner process */
   1.344 +			int pid;
   1.345 +			signal(SIGCHLD, sigchld_handler);
   1.346 +			if ((pid = fork()) == 0) {
   1.347 +				queue_run();
   1.348 +
   1.349 +				_exit(EXIT_SUCCESS);
   1.350 +			} else if (pid < 0) {
   1.351 +				logwrite(LOG_ALERT, "could not fork for queue run");
   1.352 +			}
   1.353 +		}
   1.354  	}
   1.355 -      }
   1.356 -    }
   1.357 -    else if(sel_ret > 0){
   1.358 -#ifdef ENABLE_SMTP_SERVER
   1.359 -      for(i = 0; i < FD_SETSIZE; i++){
   1.360 -	if (FD_ISSET (i, &read_fd_set)){
   1.361 -	  int sock = i;
   1.362 -	  int new;
   1.363 -	  size = sizeof (clientname);
   1.364 -	  new = accept (sock,
   1.365 -			(struct sockaddr *) &clientname,
   1.366 -			&size);
   1.367 -	  if (new < 0){
   1.368 -	    logwrite(LOG_ALERT, "accept: (ignoring): %s\n",
   1.369 -		     strerror(errno));
   1.370 -	  }else
   1.371 -	    accept_connect(sock, new, &clientname);
   1.372 -	}
   1.373 -      }
   1.374 -#else
   1.375 -      ;
   1.376 -#endif
   1.377 -    }else{
   1.378 -      /* If select returns 0, the interval time has elapsed.
   1.379 -	 We start a new queue runner process */
   1.380 -      int pid;
   1.381 -      signal(SIGCHLD, sigchld_handler);
   1.382 -      if((pid = fork()) == 0){
   1.383 -	queue_run();
   1.384 -
   1.385 -	_exit(EXIT_SUCCESS);
   1.386 -      }
   1.387 -      else if(pid < 0){
   1.388 -	logwrite(LOG_ALERT, "could not fork for queue run");
   1.389 -      }
   1.390 -    }
   1.391 -  }
   1.392  }