masqmail-0.2

diff src/get.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/get.c	Mon Oct 27 16:21:27 2008 +0100
     1.2 +++ b/src/get.c	Mon Oct 27 16:23:10 2008 +0100
     1.3 @@ -27,384 +27,368 @@
     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 -static
    1.51 -int get_lock(get_conf *gc)
    1.52 +static int
    1.53 +get_lock(get_conf * gc)
    1.54  {
    1.55  #ifdef USE_DOTLOCK
    1.56 -  gboolean ok = FALSE;
    1.57 -  gchar *hitch_name;
    1.58 -  gchar *lock_name;
    1.59 +	gboolean ok = FALSE;
    1.60 +	gchar *hitch_name;
    1.61 +	gchar *lock_name;
    1.62  
    1.63 -  /* the name of the lock is constructed from the user
    1.64 -     and the server name, to prevent more than one connection at the same time
    1.65 -     to the same server and the same user. This way concurrent connections
    1.66 -     are possible to different servers or different users */
    1.67 -  hitch_name = g_strdup_printf("%s/masqmail-get-%s@%s-%d.lock",
    1.68 -			       conf.lock_dir, gc->login_user,
    1.69 -			       gc->server_name, getpid());
    1.70 -  lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock",
    1.71 -			      conf.lock_dir, gc->login_user, gc->server_name);
    1.72 -  
    1.73 -  ok = dot_lock(lock_name, hitch_name);
    1.74 -  if(!ok) logwrite(LOG_WARNING,
    1.75 -		   "getting mail for %s@%s is locked\n",
    1.76 -		   gc->login_user, gc->server_name);
    1.77 +	/* the name of the lock is constructed from the user
    1.78 +	   and the server name, to prevent more than one connection at the same time
    1.79 +	   to the same server and the same user. This way concurrent connections
    1.80 +	   are possible to different servers or different users */
    1.81 +	hitch_name = g_strdup_printf("%s/masqmail-get-%s@%s-%d.lock", conf.lock_dir, gc->login_user, gc->server_name, getpid());
    1.82 +	lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name);
    1.83  
    1.84 -  g_free(lock_name);
    1.85 -  g_free(hitch_name);
    1.86 +	ok = dot_lock(lock_name, hitch_name);
    1.87 +	if (!ok)
    1.88 +		logwrite(LOG_WARNING, "getting mail for %s@%s is locked\n", gc->login_user, gc->server_name);
    1.89  
    1.90 -  return ok;
    1.91 +	g_free(lock_name);
    1.92 +	g_free(hitch_name);
    1.93 +
    1.94 +	return ok;
    1.95  #else
    1.96 -  gchar *lock_name;
    1.97 -  int fd;
    1.98 +	gchar *lock_name;
    1.99 +	int fd;
   1.100  
   1.101 -  lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock",
   1.102 -			      conf.lock_dir, gc->login_user, gc->server_name);
   1.103 +	lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name);
   1.104  
   1.105 -  if((fd = open(lock_name, O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600)) >= 0){
   1.106 -    if(flock(fd, LOCK_EX|LOCK_NB) != 0){
   1.107 -      close(fd);
   1.108 -      logwrite(LOG_WARNING,
   1.109 -	       "getting mail for %s@%s is locked\n",
   1.110 -	       gc->login_user, gc->server_name);
   1.111 -      fd = -1;
   1.112 -    }
   1.113 -  }else
   1.114 -    logwrite(LOG_WARNING,
   1.115 -	     "could not open lock %s: %s\n", lock_name, strerror(errno));
   1.116 +	if ((fd = open(lock_name, O_WRONLY | O_NDELAY | O_APPEND | O_CREAT, 0600)) >= 0) {
   1.117 +		if (flock(fd, LOCK_EX | LOCK_NB) != 0) {
   1.118 +			close(fd);
   1.119 +			logwrite(LOG_WARNING, "getting mail for %s@%s is locked\n", gc->login_user, gc->server_name);
   1.120 +			fd = -1;
   1.121 +		}
   1.122 +	} else
   1.123 +		logwrite(LOG_WARNING, "could not open lock %s: %s\n", lock_name, strerror(errno));
   1.124  
   1.125 -  g_free(lock_name);
   1.126 +	g_free(lock_name);
   1.127  
   1.128 -  return fd;
   1.129 +	return fd;
   1.130  #endif
   1.131  }
   1.132  
   1.133  #ifdef USE_DOTLOCK
   1.134 -static
   1.135 -gboolean get_unlock(get_conf *gc)
   1.136 +static gboolean
   1.137 +get_unlock(get_conf * gc)
   1.138  {
   1.139 -  gchar *lock_name lock_name =
   1.140 -    g_strdup_printf("%s/masqmail-get-%s@%s.lock",
   1.141 -		    conf.lock_dir, gc->login_user, gc->server_name);
   1.142 -  
   1.143 -  dot_unlock(lock_name);
   1.144 +	gchar *lock_name lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name);
   1.145  
   1.146 -  g_free(lock_name);
   1.147 +	dot_unlock(lock_name);
   1.148 +	g_free(lock_name);
   1.149  
   1.150 -  return TRUE;
   1.151 +	return TRUE;
   1.152  }
   1.153  #else
   1.154 -static void get_unlock(get_conf *gc, int fd)
   1.155 +static void
   1.156 +get_unlock(get_conf * gc, int fd)
   1.157  {
   1.158 -  gchar *lock_name =
   1.159 -    g_strdup_printf("%s/masqmail-get-%s@%s.lock",
   1.160 -		    conf.lock_dir, gc->login_user, gc->server_name);
   1.161 +	gchar *lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name);
   1.162  
   1.163 -  flock(fd, LOCK_UN);
   1.164 -  close(fd);
   1.165 +	flock(fd, LOCK_UN);
   1.166 +	close(fd);
   1.167  
   1.168 -  unlink(lock_name);
   1.169 -  g_free(lock_name);
   1.170 +	unlink(lock_name);
   1.171 +	g_free(lock_name);
   1.172  }
   1.173  #endif
   1.174  
   1.175 -gboolean get_from_file(gchar *fname)
   1.176 +gboolean
   1.177 +get_from_file(gchar * fname)
   1.178  {
   1.179 -  guint flags = 0;
   1.180 -  get_conf *gc = read_get_conf(fname);
   1.181 -  gboolean ok = TRUE;
   1.182 -  int lock;
   1.183 +	guint flags = 0;
   1.184 +	get_conf *gc = read_get_conf(fname);
   1.185 +	gboolean ok = TRUE;
   1.186 +	int lock;
   1.187  
   1.188 -  if(gc){
   1.189 -    if(!gc->do_keep) flags |= POP3_FLAG_DELETE;
   1.190 -    if(gc->do_uidl) flags |= POP3_FLAG_UIDL;
   1.191 -    if(gc->do_uidl_dele) flags |= POP3_FLAG_UIDL_DELE;
   1.192 -    
   1.193 -    if(!(gc->server_name)){
   1.194 -      logwrite(LOG_ALERT, "no server name given in %s\n", fname); return FALSE;
   1.195 -    }
   1.196 -    if(!(gc->address)){
   1.197 -      logwrite(LOG_ALERT, "no address given in %s\n", fname); return FALSE;
   1.198 -    }
   1.199 -    if(!(gc->login_user)){
   1.200 -      logwrite(LOG_ALERT, "no user name given in %s\n", fname); return FALSE;
   1.201 -    }
   1.202 -    if(!(gc->login_pass)){
   1.203 -      logwrite(LOG_ALERT, "no password given in %s\n", fname); return FALSE;
   1.204 -    }
   1.205 +	if (gc) {
   1.206 +		if (!gc->do_keep)
   1.207 +			flags |= POP3_FLAG_DELETE;
   1.208 +		if (gc->do_uidl)
   1.209 +			flags |= POP3_FLAG_UIDL;
   1.210 +		if (gc->do_uidl_dele)
   1.211 +			flags |= POP3_FLAG_UIDL_DELE;
   1.212  
   1.213 -    DEBUG(3) debugf("flags = %d\n", flags);
   1.214 -    
   1.215 -    if((strcmp(gc->protocol, "pop3") == 0) || (strcmp(gc->protocol, "apop") == 0)){
   1.216 -      pop3_base *popb = NULL;
   1.217 +		if (!(gc->server_name)) {
   1.218 +			logwrite(LOG_ALERT, "no server name given in %s\n", fname);
   1.219 +			return FALSE;
   1.220 +		}
   1.221 +		if (!(gc->address)) {
   1.222 +			logwrite(LOG_ALERT, "no address given in %s\n", fname);
   1.223 +			return FALSE;
   1.224 +		}
   1.225 +		if (!(gc->login_user)) {
   1.226 +			logwrite(LOG_ALERT, "no user name given in %s\n", fname);
   1.227 +			return FALSE;
   1.228 +		}
   1.229 +		if (!(gc->login_pass)) {
   1.230 +			logwrite(LOG_ALERT, "no password given in %s\n", fname);
   1.231 +			return FALSE;
   1.232 +		}
   1.233  
   1.234 -      if(strcmp(gc->protocol, "apop") == 0){
   1.235 -	flags |= POP3_FLAG_APOP;
   1.236 -	DEBUG(3) debugf("attempting to get mail for user %s at host %s"
   1.237 -			" for %s@%s with apop\n",
   1.238 -			gc->login_user, gc->server_name,
   1.239 -			gc->address->local_part, gc->address->domain);
   1.240 -      }else{
   1.241 -	DEBUG(3) debugf("attempting to get mail for user %s at host %s"
   1.242 -			" for %s@%s with pop3\n",
   1.243 -			gc->login_user, gc->server_name,
   1.244 -			gc->address->local_part, gc->address->domain);
   1.245 -      }
   1.246 +		DEBUG(3) debugf("flags = %d\n", flags);
   1.247 +
   1.248 +		if ((strcmp(gc->protocol, "pop3") == 0) || (strcmp(gc->protocol, "apop") == 0)) {
   1.249 +			pop3_base *popb = NULL;
   1.250 +
   1.251 +			if (strcmp(gc->protocol, "apop") == 0) {
   1.252 +				flags |= POP3_FLAG_APOP;
   1.253 +				DEBUG(3) debugf("attempting to get mail for user %s at host %s for %s@%s with apop\n",
   1.254 +				                gc->login_user, gc->server_name, gc->address->local_part, gc->address->domain);
   1.255 +			} else {
   1.256 +				DEBUG(3) debugf("attempting to get mail for user %s at host %s for %s@%s with pop3\n",
   1.257 +				                gc->login_user, gc->server_name, gc->address->local_part, gc->address->domain);
   1.258 +			}
   1.259  #ifdef USE_DOTLOCK
   1.260 -      if((lock = get_lock(gc))){
   1.261 +			if ((lock = get_lock(gc))) {
   1.262  #else
   1.263 -      if((lock = get_lock(gc)) >= 0){
   1.264 +			if ((lock = get_lock(gc)) >= 0) {
   1.265  #endif
   1.266 -	if(gc->wrapper){
   1.267 -	  popb = pop3_in_open_child(gc->wrapper, flags);
   1.268 -	  /* quick hack */
   1.269 -	  popb->remote_host = gc->server_name;
   1.270 -	}else{
   1.271 -	  popb = pop3_in_open(gc->server_name, gc->server_port,
   1.272 -			      gc->resolve_list, flags);
   1.273 +				if (gc->wrapper) {
   1.274 +					popb = pop3_in_open_child(gc->wrapper, flags);
   1.275 +					/* quick hack */
   1.276 +					popb->remote_host = gc->server_name;
   1.277 +				} else {
   1.278 +					popb = pop3_in_open(gc->server_name, gc->server_port, gc->resolve_list, flags);
   1.279 +				}
   1.280 +				if (popb) {
   1.281 +					ok = pop3_get(popb, gc->login_user, gc->login_pass, gc->address, gc->return_path,
   1.282 +					              gc->max_count, gc->max_size, gc->max_size_delete);
   1.283 +					pop3_in_close(popb);
   1.284 +				} else {
   1.285 +					ok = FALSE;
   1.286 +					logwrite(LOG_ALERT, "failed to connect to host %s\n", gc->server_name);
   1.287 +				}
   1.288 +#ifdef USE_DOTLOCK
   1.289 +				get_unlock(gc);
   1.290 +#else
   1.291 +				get_unlock(gc, lock);
   1.292 +#endif
   1.293 +			}
   1.294 +		} else {
   1.295 +			logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol);
   1.296 +			ok = FALSE;
   1.297 +		}
   1.298 +
   1.299 +		destroy_get_conf(gc);
   1.300  	}
   1.301 -	if(popb){
   1.302 -	  ok = pop3_get(popb, gc->login_user, gc->login_pass,
   1.303 -			gc->address, gc->return_path,
   1.304 -			gc->max_count, gc->max_size, gc->max_size_delete);
   1.305 -	  pop3_in_close(popb);
   1.306 -	}else{
   1.307 -	  ok = FALSE;
   1.308 -	  logwrite(LOG_ALERT, "failed to connect to host %s\n", gc->server_name);
   1.309 -	}
   1.310 -#ifdef USE_DOTLOCK
   1.311 -	get_unlock(gc);
   1.312 -#else
   1.313 -	get_unlock(gc, lock);
   1.314 -#endif
   1.315 -      }
   1.316 -    }else{
   1.317 -      logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol);
   1.318 -      ok = FALSE;
   1.319 -    }
   1.320 -
   1.321 -    destroy_get_conf(gc);
   1.322 -  }
   1.323 -  return ok;
   1.324 +	return ok;
   1.325  }
   1.326  
   1.327 -gboolean get_from_name(gchar *name)
   1.328 +gboolean
   1.329 +get_from_name(gchar * name)
   1.330  {
   1.331 -  gchar *fname = (gchar *)table_find(conf.get_names, name);
   1.332 -  if(fname)
   1.333 -    return get_from_file(fname);
   1.334 -  return FALSE;
   1.335 +	gchar *fname = (gchar *) table_find(conf.get_names, name);
   1.336 +	if (fname)
   1.337 +		return get_from_file(fname);
   1.338 +	return FALSE;
   1.339  }
   1.340  
   1.341 -gboolean get_all()
   1.342 +gboolean
   1.343 +get_all()
   1.344  {
   1.345 -  GList *get_table = conf.get_names;
   1.346 -  GList *get_node;
   1.347 -  void (*old_signal)(int);
   1.348 +	GList *get_table = conf.get_names;
   1.349 +	GList *get_node;
   1.350 +	void (*old_signal) (int);
   1.351  
   1.352 -  old_signal = signal(SIGCHLD, SIG_DFL);
   1.353 +	old_signal = signal(SIGCHLD, SIG_DFL);
   1.354  
   1.355 -  foreach(get_table, get_node){
   1.356 -    table_pair *pair = (table_pair *)(get_node->data);
   1.357 -    gchar *fname = (gchar *)pair->value;
   1.358 -    pid_t pid;
   1.359 +	foreach(get_table, get_node) {
   1.360 +		table_pair *pair = (table_pair *) (get_node->data);
   1.361 +		gchar *fname = (gchar *) pair->value;
   1.362 +		pid_t pid;
   1.363  
   1.364 -    pid = fork();
   1.365 -    if(pid == 0){
   1.366 -      signal(SIGCHLD, old_signal);    
   1.367 -      exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE);
   1.368 -    }else if(pid > 0){
   1.369 -      int status;
   1.370 -      waitpid(pid, &status, 0);
   1.371 -      if(WEXITSTATUS(status) != EXIT_SUCCESS)
   1.372 -	logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status));
   1.373 -      if(WIFSIGNALED(status))
   1.374 -	logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status));
   1.375 -    }else
   1.376 -      logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno));
   1.377 -  }
   1.378 -    
   1.379 -  signal(SIGCHLD, old_signal);    
   1.380 +		pid = fork();
   1.381 +		if (pid == 0) {
   1.382 +			signal(SIGCHLD, old_signal);
   1.383 +			exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE);
   1.384 +		} else if (pid > 0) {
   1.385 +			int status;
   1.386 +			waitpid(pid, &status, 0);
   1.387 +			if (WEXITSTATUS(status) != EXIT_SUCCESS)
   1.388 +				logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status));
   1.389 +			if (WIFSIGNALED(status))
   1.390 +				logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status));
   1.391 +		} else
   1.392 +			logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno));
   1.393 +	}
   1.394  
   1.395 -  return TRUE;
   1.396 +	signal(SIGCHLD, old_signal);
   1.397 +
   1.398 +	return TRUE;
   1.399  }
   1.400  
   1.401 -void get_online()
   1.402 +void
   1.403 +get_online()
   1.404  {
   1.405 -  GList *gf_list = NULL;
   1.406 -  gchar *connect_name = detect_online();
   1.407 +	GList *gf_list = NULL;
   1.408 +	gchar *connect_name = detect_online();
   1.409  
   1.410 -  if(connect_name != NULL){
   1.411 -    void (*old_signal)(int);
   1.412 +	if (connect_name != NULL) {
   1.413 +		void (*old_signal) (int);
   1.414  
   1.415 -    old_signal = signal(SIGCHLD, SIG_DFL);
   1.416 +		old_signal = signal(SIGCHLD, SIG_DFL);
   1.417  
   1.418 -    logwrite(LOG_NOTICE, "detected online configuration %s\n", connect_name);
   1.419 -    /* we are online! */
   1.420 -    gf_list = (GList *)table_find(conf.online_gets, connect_name);
   1.421 -    if(gf_list != NULL){
   1.422 -      GList *node;
   1.423 -      foreach(gf_list, node){
   1.424 -	gchar *fname = (gchar *)(node->data);
   1.425 -	pid_t pid;
   1.426 +		logwrite(LOG_NOTICE, "detected online configuration %s\n", connect_name);
   1.427 +		/* we are online! */
   1.428 +		gf_list = (GList *) table_find(conf.online_gets, connect_name);
   1.429 +		if (gf_list != NULL) {
   1.430 +			GList *node;
   1.431 +			foreach(gf_list, node) {
   1.432 +				gchar *fname = (gchar *) (node->data);
   1.433 +				pid_t pid;
   1.434  
   1.435 -	if(fname[0] != '/')
   1.436 -	  fname = (gchar *)table_find(conf.get_names, fname);
   1.437 +				if (fname[0] != '/')
   1.438 +					fname = (gchar *) table_find(conf.get_names, fname);
   1.439  
   1.440 -	if(fname != NULL){
   1.441 -	  pid = fork();
   1.442 -	  if(pid == 0){
   1.443 -	    signal(SIGCHLD, old_signal);    
   1.444 -	    exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE);
   1.445 -	  }else if(pid > 0){
   1.446 -	    int status;
   1.447 -	    waitpid(pid, &status, 0);
   1.448 -	    if(WEXITSTATUS(status) != EXIT_SUCCESS)
   1.449 -	      logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status));
   1.450 -	    if(WIFSIGNALED(status))
   1.451 -	      logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status));
   1.452 -	  }else
   1.453 -	    logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno));
   1.454 +				if (fname != NULL) {
   1.455 +					pid = fork();
   1.456 +					if (pid == 0) {
   1.457 +						signal(SIGCHLD, old_signal);
   1.458 +						exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE);
   1.459 +					} else if (pid > 0) {
   1.460 +						int status;
   1.461 +						waitpid(pid, &status, 0);
   1.462 +						if (WEXITSTATUS(status) != EXIT_SUCCESS)
   1.463 +							logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status));
   1.464 +						if (WIFSIGNALED(status))
   1.465 +							logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status));
   1.466 +					} else
   1.467 +						logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno));
   1.468 +				}
   1.469 +			}
   1.470 +		}
   1.471 +		signal(SIGCHLD, old_signal);
   1.472  	}
   1.473 -      }
   1.474 -    }
   1.475 -    signal(SIGCHLD, old_signal);    
   1.476 -  }
   1.477  }
   1.478  
   1.479 -void get_daemon(gint gival, char *argv[])
   1.480 +void
   1.481 +get_daemon(gint gival, char *argv[])
   1.482  {
   1.483 -  struct timeval tm;
   1.484 -  time_t time_before, time_now;
   1.485 -  int sel_ret;
   1.486 +	struct timeval tm;
   1.487 +	time_t time_before, time_now;
   1.488 +	int sel_ret;
   1.489  
   1.490 -  /* setup handler for HUP signal: */
   1.491 -  signal(SIGHUP, sighup_handler);
   1.492 +	/* setup handler for HUP signal: */
   1.493 +	signal(SIGHUP, sighup_handler);
   1.494  
   1.495 -  /* we can give up root privileges */
   1.496 -  if(!conf.run_as_user){
   1.497 -    if(setegid(conf.mail_gid) != 0){
   1.498 -      logwrite(LOG_ALERT, "could not change gid to %d: %s\n",
   1.499 -	       conf.mail_gid, strerror(errno));
   1.500 -      exit(EXIT_FAILURE);
   1.501 -    }
   1.502 -    if(seteuid(conf.mail_uid) != 0){
   1.503 -      logwrite(LOG_ALERT, "could not change uid to %d: %s\n",
   1.504 -	       conf.mail_uid, strerror(errno));
   1.505 -      exit(EXIT_FAILURE);
   1.506 -    }
   1.507 -  }
   1.508 +	/* we can give up root privileges */
   1.509 +	if (!conf.run_as_user) {
   1.510 +		if (setegid(conf.mail_gid) != 0) {
   1.511 +			logwrite(LOG_ALERT, "could not change gid to %d: %s\n", conf.mail_gid, strerror(errno));
   1.512 +			exit(EXIT_FAILURE);
   1.513 +		}
   1.514 +		if (seteuid(conf.mail_uid) != 0) {
   1.515 +			logwrite(LOG_ALERT, "could not change uid to %d: %s\n", conf.mail_uid, strerror(errno));
   1.516 +			exit(EXIT_FAILURE);
   1.517 +		}
   1.518 +	}
   1.519  
   1.520 -  /*  sel_ret = 0;*/
   1.521 -  time(&time_before);
   1.522 -  time_before -= gival;
   1.523 -  sel_ret = -1;
   1.524 +	/*  sel_ret = 0; */
   1.525 +	time(&time_before);
   1.526 +	time_before -= gival;
   1.527 +	sel_ret = -1;
   1.528  
   1.529 -  while (1){
   1.530 -    /* see listen_port() in listen.c */
   1.531 -    if(gival > 0){
   1.532 -      time(&time_now);
   1.533 -      if(sel_ret == 0){ /* we are either just starting or did a queue run */
   1.534 -	tm.tv_sec = gival;
   1.535 -	tm.tv_usec = 0;
   1.536 -	time_before = time_now;
   1.537 -      }else{
   1.538 -	tm.tv_sec = gival - (time_now - time_before);
   1.539 -	tm.tv_usec = 0;
   1.540 +	while (1) {
   1.541 +		/* see listen_port() in listen.c */
   1.542 +		if (gival > 0) {
   1.543 +			time(&time_now);
   1.544 +			if (sel_ret == 0) {	/* we are either just starting or did a queue run */
   1.545 +				tm.tv_sec = gival;
   1.546 +				tm.tv_usec = 0;
   1.547 +				time_before = time_now;
   1.548 +			} else {
   1.549 +				tm.tv_sec = gival - (time_now - time_before);
   1.550 +				tm.tv_usec = 0;
   1.551  
   1.552 -	/* race condition, very unlikely (but possible): */
   1.553 -	if(tm.tv_sec < 0)
   1.554 -	  tm.tv_sec = 0;
   1.555 -      }
   1.556 -    }
   1.557 +				/* race condition, very unlikely (but possible): */
   1.558 +				if (tm.tv_sec < 0)
   1.559 +					tm.tv_sec = 0;
   1.560 +			}
   1.561 +		}
   1.562  
   1.563 -    if ((sel_ret = select(0, NULL, NULL, NULL, &tm)) < 0){
   1.564 -      if(errno != EINTR){
   1.565 -	logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno));
   1.566 -	exit (EXIT_FAILURE);
   1.567 -      }else{
   1.568 -	if(sighup_seen){
   1.569 -	  logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n");
   1.570 +		if ((sel_ret = select(0, NULL, NULL, NULL, &tm)) < 0) {
   1.571 +			if (errno != EINTR) {
   1.572 +				logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno));
   1.573 +				exit(EXIT_FAILURE);
   1.574 +			} else {
   1.575 +				if (sighup_seen) {
   1.576 +					logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n");
   1.577  
   1.578 -	  if(argv == NULL) exit(EXIT_SUCCESS);
   1.579 +					if (argv == NULL)
   1.580 +						exit(EXIT_SUCCESS);
   1.581  
   1.582 -	  execv(argv[0], &(argv[0]));
   1.583 -	  logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno));
   1.584 -	  exit(EXIT_FAILURE);
   1.585 +					execv(argv[0], &(argv[0]));
   1.586 +					logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno));
   1.587 +					exit(EXIT_FAILURE);
   1.588  
   1.589 +				}
   1.590 +			}
   1.591 +		} else {
   1.592 +			/* If select returns 0, the interval time has elapsed.
   1.593 +			   We start a new get process */
   1.594 +			int pid;
   1.595 +			signal(SIGCHLD, sigchld_handler);
   1.596 +			if ((pid = fork()) == 0) {
   1.597 +				get_online();
   1.598 +
   1.599 +				_exit(EXIT_SUCCESS);
   1.600 +			} else if (pid < 0) {
   1.601 +				logwrite(LOG_ALERT, "could not fork for get run");
   1.602 +			}
   1.603 +		}
   1.604  	}
   1.605 -      }
   1.606 -    }else{
   1.607 -      /* If select returns 0, the interval time has elapsed.
   1.608 -	 We start a new get process */
   1.609 -      int pid;
   1.610 -      signal(SIGCHLD, sigchld_handler);
   1.611 -      if((pid = fork()) == 0){
   1.612 -	get_online();
   1.613 -
   1.614 -	_exit(EXIT_SUCCESS);
   1.615 -      }
   1.616 -      else if(pid < 0){
   1.617 -	logwrite(LOG_ALERT, "could not fork for get run");
   1.618 -      }
   1.619 -    }
   1.620 -  }
   1.621  }
   1.622  
   1.623 -gboolean pop_before_smtp(gchar *fname)
   1.624 +gboolean
   1.625 +pop_before_smtp(gchar * fname)
   1.626  {
   1.627 -  gboolean ok = FALSE;
   1.628 -  GList *resolve_list = NULL;
   1.629 -  get_conf *gc = read_get_conf(fname);
   1.630 -  guint flags = 0;
   1.631 +	gboolean ok = FALSE;
   1.632 +	GList *resolve_list = NULL;
   1.633 +	get_conf *gc = read_get_conf(fname);
   1.634 +	guint flags = 0;
   1.635  
   1.636  #ifdef ENABLE_RESOLVER
   1.637 -  resolve_list = g_list_append(resolve_list, resolve_dns_a);
   1.638 +	resolve_list = g_list_append(resolve_list, resolve_dns_a);
   1.639  #endif
   1.640 -  resolve_list = g_list_append(resolve_list, resolve_byname);
   1.641 +	resolve_list = g_list_append(resolve_list, resolve_byname);
   1.642  
   1.643 -  if(strcmp(gc->protocol, "pop3") == 0){
   1.644 -    DEBUG(3) debugf("attempting to login for user %s, host = %s with pop3\n",
   1.645 -		    gc->login_user, gc->server_name);
   1.646 -    ok = pop3_login(gc->server_name, gc->server_port, resolve_list,
   1.647 -		    gc->login_user, gc->login_pass,
   1.648 -		    flags);
   1.649 -  }else if(strcmp(gc->protocol, "apop") == 0){
   1.650 -    DEBUG(3) debugf("attempting to login for user %s, host = %s with apop\n",
   1.651 -		    gc->login_user, gc->server_name);
   1.652 -    ok = pop3_login(gc->server_name, gc->server_port, resolve_list,
   1.653 -		    gc->login_user, gc->login_pass,
   1.654 -		    flags | POP3_FLAG_APOP);
   1.655 -  }else{
   1.656 -    logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol);
   1.657 -  }
   1.658 -  return ok;
   1.659 +	if (strcmp(gc->protocol, "pop3") == 0) {
   1.660 +		DEBUG(3) debugf("attempting to login for user %s, host = %s with pop3\n", gc->login_user, gc->server_name);
   1.661 +		ok = pop3_login(gc->server_name, gc->server_port, resolve_list, gc->login_user, gc->login_pass, flags);
   1.662 +	} else if (strcmp(gc->protocol, "apop") == 0) {
   1.663 +		DEBUG(3) debugf ("attempting to login for user %s, host = %s with apop\n", gc->login_user, gc->server_name);
   1.664 +		ok = pop3_login(gc->server_name, gc->server_port, resolve_list, gc->login_user, gc->login_pass, flags | POP3_FLAG_APOP);
   1.665 +	} else {
   1.666 +		logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol);
   1.667 +	}
   1.668 +	return ok;
   1.669  }
   1.670  
   1.671  #endif