diff options
Diffstat (limited to 'src/shared')
| -rw-r--r-- | src/shared/_usage.h | 9 | ||||
| -rw-r--r-- | src/shared/misc.c | 44 | ||||
| -rw-r--r-- | src/shared/misc.h | 13 | 
3 files changed, 41 insertions, 25 deletions
| diff --git a/src/shared/_usage.h b/src/shared/_usage.h index 91b956e0..eb80bb3c 100644 --- a/src/shared/_usage.h +++ b/src/shared/_usage.h @@ -12,8 +12,9 @@  #include <getopt.h>  #include <stdlib.h> +#include <librc.h> -#define getoptstring_COMMON "ChqVv" +#define getoptstring_COMMON "ChqVvU"  #define longopts_COMMON							      \  	{ "help",           0, NULL, 'h'},				      \ @@ -21,6 +22,7 @@  	{ "version",        0, NULL, 'V'},				      \  	{ "verbose",        0, NULL, 'v'},				      \  	{ "quiet",          0, NULL, 'q'},				      \ +	{ "user",           0, NULL, 'U'},				      \  	{ NULL,             0, NULL,  0 }  #define longopts_help_COMMON						      \ @@ -28,13 +30,15 @@  	"Disable color output",						      \  	"Display software version",			              \  	"Run verbosely",						      \ -	"Run quietly (repeat to suppress errors)" +	"Run quietly (repeat to suppress errors)",        \ +	"Run in user mode"  #define case_RC_COMMON_getopt_case_C  setenv ("EINFO_COLOR", "NO", 1);  #define case_RC_COMMON_getopt_case_h  usage (EXIT_SUCCESS);  #define case_RC_COMMON_getopt_case_V  if (argc == 2) show_version();  #define case_RC_COMMON_getopt_case_v  setenv ("EINFO_VERBOSE", "YES", 1);  #define case_RC_COMMON_getopt_case_q  set_quiet_options(); +#define case_RC_COMMON_getopt_case_U  rc_set_user();  #define case_RC_COMMON_getopt_default usage (EXIT_FAILURE);  #define case_RC_COMMON_GETOPT						      \ @@ -43,6 +47,7 @@  	case 'V': case_RC_COMMON_getopt_case_V; break;			      \  	case 'v': case_RC_COMMON_getopt_case_v; break;			      \  	case 'q': case_RC_COMMON_getopt_case_q; break;			      \ +	case 'U': case_RC_COMMON_getopt_case_U; break;			      \  	default:  case_RC_COMMON_getopt_default; break;  extern const char *applet; diff --git a/src/shared/misc.c b/src/shared/misc.c index 28f4e235..e946c911 100644 --- a/src/shared/misc.c +++ b/src/shared/misc.c @@ -64,6 +64,8 @@ static const char *const env_whitelist[] = {  	"RC_DEBUG", "RC_NODEPS",  	"LANG", "LC_MESSAGES", "TERM",  	"EINFO_COLOR", "EINFO_VERBOSE", +	"RC_USER_SERVICES", "HOME", +	"XDG_RUNTIME_DIR", "XDG_CONFIG_HOME",  	NULL  }; @@ -142,9 +144,11 @@ env_config(void)  	char *np;  	char *npp;  	char *tok; +	char *dir;  	const char *sys = rc_sys();  	char *buffer = NULL;  	size_t size = 0; +	const char *svc_dir = rc_service_dir();  	/* Ensure our PATH is prefixed with the system locations first  	   for a little extra security */ @@ -175,8 +179,10 @@ env_config(void)  	setenv("RC_VERSION", VERSION, 1);  	setenv("RC_LIBEXECDIR", RC_LIBEXECDIR, 1); -	setenv("RC_SVCDIR", RC_SVCDIR, 1); -	setenv("RC_TMPDIR", RC_SVCDIR "/tmp", 1); +	setenv("RC_SVCDIR", svc_dir, 1); +	xasprintf(&dir, "%s/tmp", svc_dir); +	setenv("RC_TMPDIR", dir, 1); +	free(dir);  	setenv("RC_BOOTLEVEL", RC_LEVEL_BOOT, 1);  	e = rc_runlevel_get();  	setenv("RC_RUNLEVEL", e, 1); @@ -248,7 +254,7 @@ svc_lock(const char *applet, bool ignore_lock_failure)  	char *file = NULL;  	int fd; -	xasprintf(&file, RC_SVCDIR "/exclusive/%s", applet); +	xasprintf(&file, "%s/exclusive/%s", rc_service_dir(), applet);  	fd = open(file, O_WRONLY | O_CREAT | O_NONBLOCK, 0664);  	free(file);  	if (fd == -1) @@ -274,10 +280,11 @@ svc_unlock(const char *applet, int fd)  {  	char *file = NULL; -	xasprintf(&file, RC_SVCDIR "/exclusive/%s", applet); +	xasprintf(&file, "%s/exclusive/%s", rc_service_dir(), applet);  	close(fd);  	unlink(file);  	free(file); +  	return -1;  } @@ -388,12 +395,16 @@ RC_DEPTREE * _rc_deptree_load(int force, int *regen)  	t = 0;  	if (rc_deptree_update_needed(&t, file) || force != 0) { +		char *deptree_cache; +		xasprintf(&deptree_cache, "%s/%s", rc_service_dir(), RC_DEPTREE_CACHE);  		/* Test if we have permission to update the deptree */ -		fd = open(RC_DEPTREE_CACHE, O_WRONLY); +		fd = open(deptree_cache, O_WRONLY);  		merrno = errno;  		errno = serrno; -		if (fd == -1 && merrno == EACCES) +		if (fd == -1 && merrno == EACCES) { +			free(deptree_cache);  			return rc_deptree_load(); +		}  		close(fd);  		if (regen) @@ -403,29 +414,34 @@ RC_DEPTREE * _rc_deptree_load(int force, int *regen)  		eend (retval, "Failed to update the dependency tree");  		if (retval == 0) { -			if (stat(RC_DEPTREE_CACHE, &st) != 0) { -				eerror("stat(%s): %s", RC_DEPTREE_CACHE, strerror(errno)); +			char *deptree_skewed; +			if (stat(deptree_cache, &st) != 0) { +				eerror("stat(%s): %s", deptree_cache, strerror(errno)); +				free(deptree_cache);  				return NULL;  			} + +			xasprintf(&deptree_skewed, "%s/%s", rc_service_dir(), RC_DEPTREE_SKEWED);  			if (st.st_mtime < t) {  				eerror("Clock skew detected with `%s'", file); -				eerrorn("Adjusting mtime of `" RC_DEPTREE_CACHE -				    "' to %s", ctime(&t)); -				fp = fopen(RC_DEPTREE_SKEWED, "w"); +				eerrorn("Adjusting mtime of %s to %s", deptree_cache, ctime(&t)); +				fp = fopen(deptree_skewed, "w");  				if (fp != NULL) {  					fprintf(fp, "%s\n", file);  					fclose(fp);  				}  				ut.actime = t;  				ut.modtime = t; -				utime(RC_DEPTREE_CACHE, &ut); +				utime(deptree_cache, &ut);  			} else { -				if (exists(RC_DEPTREE_SKEWED)) -					unlink(RC_DEPTREE_SKEWED); +				if (exists(deptree_skewed)) +					unlink(deptree_skewed);  			} +			free(deptree_skewed);  		}  		if (force == -1 && regen != NULL)  			*regen = retval; +		free(deptree_cache);  	}  	return rc_deptree_load();  } diff --git a/src/shared/misc.h b/src/shared/misc.h index b158a786..9171a881 100644 --- a/src/shared/misc.h +++ b/src/shared/misc.h @@ -33,16 +33,11 @@  #define RC_LEVEL_BOOT           "boot"  #define RC_LEVEL_DEFAULT        "default" -#define RC_DEPTREE_CACHE        RC_SVCDIR "/deptree" -#define RC_DEPTREE_SKEWED	RC_SVCDIR "/clock-skewed" +#define RC_DEPTREE_CACHE        "deptree" +#define RC_DEPTREE_SKEWED       "clock-skewed"  #define RC_KRUNLEVEL            RC_SVCDIR "/krunlevel" -#define RC_STARTING             RC_SVCDIR "/rc.starting" -#define RC_STOPPING             RC_SVCDIR "/rc.stopping" - -#define RC_SVCDIR_STARTING      RC_SVCDIR "/starting" -#define RC_SVCDIR_INACTIVE      RC_SVCDIR "/inactive" -#define RC_SVCDIR_STARTED       RC_SVCDIR "/started" -#define RC_SVCDIR_COLDPLUGGED	RC_SVCDIR "/coldplugged" +#define RC_STARTING             "rc.starting" +#define RC_STOPPING             "rc.stopping"  char *rc_conf_value(const char *var);  bool rc_conf_yesno(const char *var); | 
