diff options
| author | Přemysl Janouch <p.janouch@gmail.com> | 2015-07-02 01:02:06 +0200 | 
|---|---|---|
| committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-07-02 01:05:56 +0200 | 
| commit | b4869652775416dde95cfc103d4b03b04828bf60 (patch) | |
| tree | 6238e6f01a02a8e649cfaad85e4f9cbc7febe777 /kike.c | |
| parent | 51bf132c6ba429be8778c485076e017d98e2876c (diff) | |
| download | xK-b4869652775416dde95cfc103d4b03b04828bf60.tar.gz xK-b4869652775416dde95cfc103d4b03b04828bf60.tar.xz xK-b4869652775416dde95cfc103d4b03b04828bf60.zip  | |
kike: resolve the path to PID files better
Diffstat (limited to 'kike.c')
| -rw-r--r-- | kike.c | 35 | 
1 files changed, 20 insertions, 15 deletions
@@ -31,15 +31,7 @@  static struct config_item g_config_table[] =  { -	// TODO: use XDG_RUNTIME_DIR if relative.  The last fallback is: -	// -	//   "$XDG_DATA_HOME defines the base directory relative to which user -	//   specific data files should be stored.  If $XDG_DATA_HOME is either not -	//   set or empty, a default equal to $HOME/.local/share should be used." -	// -	//   Note that when using XDG_RUNTIME_DIR, it either needs to have access -	//   time bumped every 6 hours, or have the sticky bit set. -	{ "pid_file",        NULL,              "Full path for the PID file"     }, +	{ "pid_file",        NULL,              "Path or name of the PID file"   },  	{ "server_name",     NULL,              "Server name"                    },  	{ "server_info",     "My server",       "Brief server description"       },  	{ "motd",            NULL,              "MOTD filename"                  }, @@ -3671,14 +3663,12 @@ irc_initialize_server_name (struct server_context *ctx, struct error **e)  }  static bool -irc_lock_pid_file (struct server_context *ctx, struct error **e) +lock_pid_file (const char *path, struct error **e)  { -	const char *path = str_map_find (&ctx->config, "pid_file"); -	if (!path) -		return true; - +	// When using XDG_RUNTIME_DIR, the file needs to either have its +	// access time bumped every 6 hours, or have the sticky bit set  	int fd = open (path, O_RDWR | O_CREAT, -		S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH /* 644 */); +		S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH /* 644 */ | S_ISVTX /* sticky */);  	if (fd < 0)  	{  		error_set (e, "can't open `%s': %s", path, strerror (errno)); @@ -3695,6 +3685,7 @@ irc_lock_pid_file (struct server_context *ctx, struct error **e)  	if (fcntl (fd, F_SETLK, &lock))  	{  		error_set (e, "can't lock `%s': %s", path, strerror (errno)); +		xclose (fd);  		return false;  	} @@ -3706,6 +3697,7 @@ irc_lock_pid_file (struct server_context *ctx, struct error **e)  	 || write (fd, pid.str, pid.len) != (ssize_t) pid.len)  	{  		error_set (e, "can't write to `%s': %s", path, strerror (errno)); +		xclose (fd);  		return false;  	}  	str_free (&pid); @@ -3715,6 +3707,19 @@ irc_lock_pid_file (struct server_context *ctx, struct error **e)  	return true;  } +static bool +irc_lock_pid_file (struct server_context *ctx, struct error **e) +{ +	const char *path = str_map_find (&ctx->config, "pid_file"); +	if (!path) +		return true; + +	char *resolved = resolve_filename (path, resolve_relative_runtime_filename); +	bool result = lock_pid_file (resolved, e); +	free (resolved); +	return result; +} +  static int  irc_listen (struct addrinfo *gai_iter)  {  | 
