diff options
| author | Roy Marples <roy@marples.name> | 2008-01-14 08:12:37 +0000 | 
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2008-01-14 08:12:37 +0000 | 
| commit | d6954071142c7c16d070621e247d8ef9f20a7c90 (patch) | |
| tree | b1a655319960c4d7ee7b5886c378e97bfcf6fb80 /src/librc | |
| parent | e49e5b147c7a670b9e3df69ef2cfaf787bbbe3ee (diff) | |
| download | openrc-d6954071142c7c16d070621e247d8ef9f20a7c90.tar.xz | |
Add support for is_newer_than and is_older_than. is_older_than currently doesn't work as expected, but is_newer_than works fine.
Diffstat (limited to 'src/librc')
| -rw-r--r-- | src/librc/librc-depend.c | 28 | ||||
| -rw-r--r-- | src/librc/librc.h | 1 | ||||
| -rw-r--r-- | src/librc/rc.h | 30 | ||||
| -rw-r--r-- | src/librc/rc.map | 1 | 
4 files changed, 36 insertions, 24 deletions
| diff --git a/src/librc/librc-depend.c b/src/librc/librc-depend.c index b472c8a1..f52c6de2 100644 --- a/src/librc/librc-depend.c +++ b/src/librc/librc-depend.c @@ -596,7 +596,7 @@ char **rc_deptree_order (const rc_depinfo_t *deptree, const char *runlevel,  }  librc_hidden_def(rc_deptree_order) -static bool is_newer_than (const char *file, const char *target) +bool rc_newer_than (const char *source, const char *target)  {  	struct stat buf;  	time_t mtime; @@ -604,28 +604,31 @@ static bool is_newer_than (const char *file, const char *target)  	DIR *dp;  	struct dirent *d;  	char *path; +	int serrno = errno; -	if (stat (file, &buf) != 0 || buf.st_size == 0) +	if (stat (source, &buf) != 0 || buf.st_size == 0)  		return (false);  	mtime = buf.st_mtime; -	/* Of course we are newever than targets that don't exist -	   Such as broken symlinks */ +	/* Of course we are newer than targets that don't exist +	   such as broken symlinks */  	if (stat (target, &buf) != 0)  		return (true);  	if (mtime < buf.st_mtime)  		return (false); -	if (! (dp = opendir (target))) +	if (! (dp = opendir (target))) { +		errno = serrno;  		return (true); +	}  	while ((d = readdir (dp))) {  		if (d->d_name[0] == '.')  			continue;  		path = rc_strcatpaths (target, d->d_name, (char *) NULL); -		newer = is_newer_than (file, path); +		newer = rc_newer_than (source, path);  		free (path);  		if (! newer)  			break; @@ -634,6 +637,7 @@ static bool is_newer_than (const char *file, const char *target)  	return (newer);  } +librc_hidden_def(rc_newer_than)  typedef struct deppair  { @@ -679,18 +683,18 @@ bool rc_deptree_update_needed (void)  			fprintf (stderr, "mkdir `%s': %s\n", depdirs[i], strerror (errno));  	/* Quick test to see if anything we use has changed */ -	if (! is_newer_than (RC_DEPTREE, RC_INITDIR) || -	    ! is_newer_than (RC_DEPTREE, RC_CONFDIR) || -	    ! is_newer_than (RC_DEPTREE, RC_INITDIR_LOCAL) || -	    ! is_newer_than (RC_DEPTREE, RC_CONFDIR_LOCAL) || -	    ! is_newer_than (RC_DEPTREE, "/etc/rc.conf")) +	if (! rc_newer_than (RC_DEPTREE, RC_INITDIR) || +	    ! rc_newer_than (RC_DEPTREE, RC_CONFDIR) || +	    ! rc_newer_than (RC_DEPTREE, RC_INITDIR_LOCAL) || +	    ! rc_newer_than (RC_DEPTREE, RC_CONFDIR_LOCAL) || +	    ! rc_newer_than (RC_DEPTREE, "/etc/rc.conf"))  		return (true);  	/* Some init scripts dependencies change depending on config files  	 * outside of baselayout, like syslog-ng, so we check those too. */  	config = rc_config_list (RC_DEPCONFIG);  	STRLIST_FOREACH (config, service, i) { -		if (! is_newer_than (RC_DEPTREE, service)) { +		if (! rc_newer_than (RC_DEPTREE, service)) {  			newer = true;  			break;  		} diff --git a/src/librc/librc.h b/src/librc/librc.h index 6b1e0314..0f6212fe 100644 --- a/src/librc/librc.h +++ b/src/librc/librc.h @@ -84,6 +84,7 @@ librc_hidden_proto(rc_deptree_update)  librc_hidden_proto(rc_deptree_update_needed)  librc_hidden_proto(rc_find_pids)  librc_hidden_proto(rc_getline) +librc_hidden_proto(rc_newer_than)  librc_hidden_proto(rc_runlevel_exists)  librc_hidden_proto(rc_runlevel_get)  librc_hidden_proto(rc_runlevel_list) diff --git a/src/librc/rc.h b/src/librc/rc.h index 95247785..516d39f0 100644 --- a/src/librc/rc.h +++ b/src/librc/rc.h @@ -61,7 +61,8 @@ bool rc_runlevel_exists (const char *runlevel);  char **rc_runlevel_list (void);  /*! Set the runlevel. - * This just changes the stored runlevel and does not start or stop any services. + * This just changes the stored runlevel and does not start or stop any + * services.   * @param runlevel to store */  bool rc_runlevel_set (const char *runlevel); @@ -117,8 +118,8 @@ bool rc_service_delete (const char *runlevel, const char *service);   * @param pidfile of the process (optional)   * @param started if true, add the arguments otherwise remove existing matching arguments */  bool rc_service_daemon_set (const char *service, const char *exec, -							const char *name, const char *pidfile, -							bool started); +                            const char *name, const char *pidfile, +                            bool started);  /*! Returns a description of what the service and/or option does.   * @param service to check @@ -157,7 +158,7 @@ char *rc_service_resolve (const char *service);   * @param service that starts the scheduled service when started   * @param service_to_start service that will be started */  bool rc_service_schedule_start (const char *service, -								const char *service_to_start); +                                const char *service_to_start);  /*! Return a NULL terminated list of services that are scheduled to start   * when the given service has started   * @param service to check @@ -190,7 +191,7 @@ pid_t rc_service_stop (const char *service);   * @param indx of the daemon (optional - 1st daemon, 2nd daemon, etc)   * @return true if started by this service, otherwise false */  bool rc_service_started_daemon (const char *service, const char *exec, -								int indx); +                                int indx);  /*! Return a saved value for a service   * @param service to check @@ -204,7 +205,7 @@ char *rc_service_value_get (const char *service, const char *option);   * @param value of the option   * @return true if saved, otherwise false */  bool rc_service_value_set (const char *service, const char *option, -						   const char *value); +                           const char *value);  /*! List the services in a runlevel   * @param runlevel to list @@ -248,6 +249,11 @@ bool rc_service_daemons_crashed (const char *service);  typedef void *rc_depinfo_t;  #endif +/*! Check to see if source is newer than target. + * If target is a directory then we traverse it and it's children. +* @return true if source is newer than target, otherwise false */  +bool rc_newer_than (const char *source, const char *target); +  /*! Update the cached dependency tree if it's older than any init script,   * its configuration file or an external configuration file the init script   * has specified. @@ -271,7 +277,7 @@ rc_depinfo_t *rc_deptree_load (void);   * @param service to check   * @return NULL terminated list of services in order */  char **rc_deptree_depend (const rc_depinfo_t *deptree, -						  const char *type, const char *service); +                          const char *type, const char *service);  /*! List all the services in order that the given services have   * for the given types and options. @@ -281,9 +287,9 @@ char **rc_deptree_depend (const rc_depinfo_t *deptree,   * @param options to pass   * @return NULL terminated list of services in order */  char **rc_deptree_depends (const rc_depinfo_t *deptree, -						   const char *const *types, -						   const char *const *services, const char *runlevel, -						   int options); +                           const char *const *types, +                           const char *const *services, const char *runlevel, +                           int options);  /*! List all the services that should be stoppned and then started, in order,   * for the given runlevel, including sysinit and boot services where @@ -293,7 +299,7 @@ char **rc_deptree_depends (const rc_depinfo_t *deptree,   * @param options to pass   * @return NULL terminated list of services in order */  char **rc_deptree_order (const rc_depinfo_t *deptree, const char *runlevel, -						 int options); +                         int options);  /*! Free a deptree and its information   * @param deptree to free */ @@ -440,6 +446,6 @@ char *rc_strcatpaths (const char *path1, const char *paths, ...) SENTINEL;   * @param pid to check for   * @return NULL terminated list of pids */  pid_t *rc_find_pids (const char *exec, const char *cmd, -					 uid_t uid, pid_t pid); +                     uid_t uid, pid_t pid);  #endif diff --git a/src/librc/rc.map b/src/librc/rc.map index 8de23c41..e60ea183 100644 --- a/src/librc/rc.map +++ b/src/librc/rc.map @@ -13,6 +13,7 @@ global:  	rc_environ_fd;  	rc_find_pids;  	rc_getline; +	rc_newer_than;  	rc_runlevel_exists;  	rc_runlevel_get;  	rc_runlevel_list; | 
