2008-01-14 10:35:22 +05:30
|
|
|
/*
|
2008-02-22 17:37:34 +05:30
|
|
|
* Copyright 2007-2008 Roy Marples
|
2007-11-14 20:52:04 +05:30
|
|
|
* All rights reserved
|
|
|
|
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
2007-09-25 21:08:21 +05:30
|
|
|
*/
|
2007-04-05 16:48:42 +05:30
|
|
|
|
|
|
|
#ifndef __RC_H__
|
|
|
|
#define __RC_H__
|
|
|
|
|
2007-04-05 20:31:09 +05:30
|
|
|
#ifdef __GNUC__
|
2007-09-25 21:08:21 +05:30
|
|
|
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC__MINOR)
|
2007-07-10 17:12:56 +05:30
|
|
|
# if (GCC_VERSION >= 3005)
|
|
|
|
# define SENTINEL __attribute__ ((__sentinel__))
|
|
|
|
# endif
|
2007-04-05 20:31:09 +05:30
|
|
|
#endif
|
2007-09-25 21:08:21 +05:30
|
|
|
#ifndef SENTINEL
|
|
|
|
# define SENTINEL
|
|
|
|
#endif
|
2007-04-05 20:31:09 +05:30
|
|
|
|
2007-04-05 16:48:42 +05:30
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stdbool.h>
|
2008-01-07 17:59:30 +05:30
|
|
|
#include <stdio.h>
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! @name Reserved runlevel names */
|
2007-04-12 18:48:52 +05:30
|
|
|
#define RC_LEVEL_SYSINIT "sysinit"
|
|
|
|
#define RC_LEVEL_SINGLE "single"
|
|
|
|
#define RC_LEVEL_SHUTDOWN "shutdown"
|
|
|
|
#define RC_LEVEL_REBOOT "reboot"
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2007-10-03 20:13:05 +05:30
|
|
|
/*! Return the current runlevel.
|
|
|
|
* @return the current runlevel */
|
|
|
|
char *rc_runlevel_get (void);
|
|
|
|
|
|
|
|
/*! Checks if the runlevel exists or not
|
|
|
|
* @param runlevel to check
|
|
|
|
* @return true if the runlevel exists, otherwise false */
|
|
|
|
bool rc_runlevel_exists (const char *runlevel);
|
|
|
|
|
|
|
|
/*! Return a NULL terminated list of runlevels
|
|
|
|
* @return a NULL terminated list of runlevels */
|
|
|
|
char **rc_runlevel_list (void);
|
|
|
|
|
|
|
|
/*! Set the runlevel.
|
2008-01-14 13:42:37 +05:30
|
|
|
* This just changes the stored runlevel and does not start or stop any
|
|
|
|
* services.
|
2007-10-03 20:13:05 +05:30
|
|
|
* @param runlevel to store */
|
|
|
|
bool rc_runlevel_set (const char *runlevel);
|
|
|
|
|
|
|
|
/*! Is the runlevel starting?
|
|
|
|
* @return true if yes, otherwise false */
|
|
|
|
bool rc_runlevel_starting (void);
|
|
|
|
|
|
|
|
/*! Is the runlevel stopping?
|
|
|
|
* @return true if yes, otherwise false */
|
|
|
|
bool rc_runlevel_stopping (void);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
|
|
|
/*! @name RC
|
|
|
|
* A service can be given as a full path or just its name.
|
|
|
|
* If its just a name then we try to resolve the service to a full path.
|
|
|
|
* This should allow the use if local init.d directories in the future. */
|
|
|
|
|
|
|
|
/*! @brief States a service can be in */
|
2007-04-05 16:48:42 +05:30
|
|
|
typedef enum
|
|
|
|
{
|
2007-09-28 17:59:23 +05:30
|
|
|
/* These are actual states
|
|
|
|
* The service has to be in one only at all times */
|
2007-09-28 20:23:38 +05:30
|
|
|
RC_SERVICE_STOPPED = 0x0001,
|
|
|
|
RC_SERVICE_STARTED = 0x0002,
|
2007-09-28 17:59:23 +05:30
|
|
|
RC_SERVICE_STOPPING = 0x0004,
|
2007-09-28 20:23:38 +05:30
|
|
|
RC_SERVICE_STARTING = 0x0008,
|
|
|
|
RC_SERVICE_INACTIVE = 0x0010,
|
2007-09-28 17:59:23 +05:30
|
|
|
|
|
|
|
/* Service may or may not have been coldplugged */
|
2007-09-28 20:23:38 +05:30
|
|
|
RC_SERVICE_COLDPLUGGED = 0x0100,
|
2007-09-28 17:59:23 +05:30
|
|
|
|
|
|
|
/* Optional states service could also be in */
|
2007-09-28 20:23:38 +05:30
|
|
|
RC_SERVICE_FAILED = 0x0200,
|
|
|
|
RC_SERVICE_SCHEDULED = 0x0400,
|
2007-10-11 19:30:56 +05:30
|
|
|
RC_SERVICE_WASINACTIVE = 0x0800
|
2007-04-05 16:48:42 +05:30
|
|
|
} rc_service_state_t;
|
|
|
|
|
2007-10-03 20:13:05 +05:30
|
|
|
/*! Add the service to the runlevel
|
|
|
|
* @param runlevel to add to
|
|
|
|
* @param service to add
|
|
|
|
* @return true if successful, otherwise false */
|
|
|
|
bool rc_service_add (const char *runlevel, const char *service);
|
|
|
|
|
|
|
|
/*! Remove the service from the runlevel
|
|
|
|
* @param runlevel to remove from
|
|
|
|
* @param service to remove
|
|
|
|
* @return true if sucessful, otherwise false */
|
|
|
|
bool rc_service_delete (const char *runlevel, const char *service);
|
|
|
|
|
2007-10-04 19:41:45 +05:30
|
|
|
/*! Save the arguments to find a running daemon
|
|
|
|
* @param service to save arguments for
|
|
|
|
* @param exec that we started
|
|
|
|
* @param name of the process (optional)
|
|
|
|
* @param pidfile of the process (optional)
|
|
|
|
* @param started if true, add the arguments otherwise remove existing matching arguments */
|
2008-02-17 20:42:00 +05:30
|
|
|
bool rc_service_daemon_set (const char *service, const char *const *argv,
|
2008-01-14 13:42:37 +05:30
|
|
|
const char *name, const char *pidfile,
|
|
|
|
bool started);
|
2007-10-04 19:41:45 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Returns a description of what the service and/or option does.
|
|
|
|
* @param service to check
|
|
|
|
* @param option to check (if NULL, service description)
|
|
|
|
* @return a newly allocated pointer to the description */
|
2007-07-11 00:44:37 +05:30
|
|
|
char *rc_service_description (const char *service, const char *option);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
2007-10-03 19:44:44 +05:30
|
|
|
/*! Checks if a service exists or not.
|
|
|
|
* @param service to check
|
|
|
|
* @return true if service exists, otherwise false */
|
|
|
|
bool rc_service_exists (const char *service);
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Checks if a service is in a runlevel
|
|
|
|
* @param service to check
|
|
|
|
* @param runlevel it should be in
|
2007-09-25 23:00:07 +05:30
|
|
|
* @return true if service is in the runlevel, otherwise false */
|
|
|
|
bool rc_service_in_runlevel (const char *service, const char *runlevel);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
|
|
|
/*! Marks the service state
|
|
|
|
* @param service to mark
|
|
|
|
* @param state service should be in
|
2007-09-25 23:00:07 +05:30
|
|
|
* @return true if service state change was successful, otherwise false */
|
2007-09-29 22:24:58 +05:30
|
|
|
bool rc_service_mark (const char *service, rc_service_state_t state);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
2007-11-20 23:49:48 +05:30
|
|
|
/*! Lists the extra commands a service has
|
|
|
|
* @param service to load the commands from
|
|
|
|
* @return NULL terminated string list of commands */
|
|
|
|
char **rc_service_extra_commands (const char *service);
|
2007-10-03 19:44:44 +05:30
|
|
|
|
|
|
|
/*! Resolves a service name to its full path.
|
|
|
|
* @param service to check
|
|
|
|
* @return pointer to full path of service */
|
|
|
|
char *rc_service_resolve (const char *service);
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Schedule a service to be started when another service starts
|
|
|
|
* @param service that starts the scheduled service when started
|
|
|
|
* @param service_to_start service that will be started */
|
2007-10-03 19:48:52 +05:30
|
|
|
bool rc_service_schedule_start (const char *service,
|
2008-01-14 13:42:37 +05:30
|
|
|
const char *service_to_start);
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Return a NULL terminated list of services that are scheduled to start
|
|
|
|
* when the given service has started
|
|
|
|
* @param service to check
|
|
|
|
* @return NULL terminated list of services scheduled to start */
|
2007-04-05 16:48:42 +05:30
|
|
|
char **rc_services_scheduled_by (const char *service);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
|
|
|
/*! Clear the list of services scheduled to be started by this service
|
2007-10-05 01:13:01 +05:30
|
|
|
* @param service to clear
|
2008-01-14 10:35:22 +05:30
|
|
|
* @return true if no errors, otherwise false */
|
2007-10-05 01:13:01 +05:30
|
|
|
bool rc_service_schedule_clear (const char *service);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
2007-10-03 19:52:45 +05:30
|
|
|
/*! Checks if a service in in a state
|
|
|
|
* @param service to check
|
|
|
|
* @return state of the service */
|
|
|
|
rc_service_state_t rc_service_state (const char *service);
|
|
|
|
|
|
|
|
/*! Start a service
|
|
|
|
* @param service to start
|
|
|
|
* @return pid of the service starting process */
|
|
|
|
pid_t rc_service_start (const char *service);
|
|
|
|
|
|
|
|
/*! Stop a service
|
|
|
|
* @param service to stop
|
|
|
|
* @return pid of service stopping process */
|
|
|
|
pid_t rc_service_stop (const char *service);
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Check if the service started the daemon
|
|
|
|
* @param service to check
|
|
|
|
* @param exec to check
|
|
|
|
* @param indx of the daemon (optional - 1st daemon, 2nd daemon, etc)
|
2007-09-25 23:00:07 +05:30
|
|
|
* @return true if started by this service, otherwise false */
|
2008-02-23 05:56:11 +05:30
|
|
|
bool rc_service_started_daemon (const char *service, const char *const *argv,
|
2008-01-14 13:42:37 +05:30
|
|
|
int indx);
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2007-10-03 20:13:05 +05:30
|
|
|
/*! Return a saved value for a service
|
2007-09-25 21:08:21 +05:30
|
|
|
* @param service to check
|
2007-10-03 20:13:05 +05:30
|
|
|
* @param option to load
|
|
|
|
* @return saved value */
|
|
|
|
char *rc_service_value_get (const char *service, const char *option);
|
2007-09-25 21:08:21 +05:30
|
|
|
|
2007-10-03 20:13:05 +05:30
|
|
|
/*! Save a persistent value for a service
|
|
|
|
* @param service to save for
|
|
|
|
* @param option to save
|
|
|
|
* @param value of the option
|
|
|
|
* @return true if saved, otherwise false */
|
|
|
|
bool rc_service_value_set (const char *service, const char *option,
|
2008-01-14 13:42:37 +05:30
|
|
|
const char *value);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! List the services in a runlevel
|
|
|
|
* @param runlevel to list
|
|
|
|
* @return NULL terminated list of services */
|
2007-04-05 16:48:42 +05:30
|
|
|
char **rc_services_in_runlevel (const char *runlevel);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! List the services in a state
|
|
|
|
* @param state to list
|
|
|
|
* @return NULL terminated list of services */
|
2007-04-05 16:48:42 +05:30
|
|
|
char **rc_services_in_state (rc_service_state_t state);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! List the services shceduled to start when this one does
|
|
|
|
* @param service to check
|
|
|
|
* @return NULL terminated list of services */
|
2007-04-05 16:48:42 +05:30
|
|
|
char **rc_services_scheduled (const char *service);
|
|
|
|
|
2007-10-03 19:44:44 +05:30
|
|
|
/*! Checks that all daemons started with start-stop-daemon by the service
|
|
|
|
* are still running.
|
|
|
|
* @param service to check
|
|
|
|
* @return true if all daemons started are still running, otherwise false */
|
|
|
|
bool rc_service_daemons_crashed (const char *service);
|
|
|
|
|
2008-02-19 19:45:53 +05:30
|
|
|
/*! @name System types
|
|
|
|
* OpenRC can support some special sub system types, normally virtualization.
|
|
|
|
* Some services cannot work in these systems, or we do something else. */
|
|
|
|
#define RC_SYS_JAIL "JAIL"
|
2008-03-03 22:49:56 +05:30
|
|
|
#define RC_SYS_OPENVZ "OPENVZ"
|
2008-03-02 16:10:08 +05:30
|
|
|
#define RC_SYS_PREFIX "PREFIX"
|
2008-02-19 19:45:53 +05:30
|
|
|
#define RC_SYS_UML "UML"
|
2008-03-03 22:49:56 +05:30
|
|
|
#define RC_SYS_VSERVER "VSERVER"
|
2008-02-19 19:45:53 +05:30
|
|
|
#define RC_SYS_XEN0 "XEN0"
|
|
|
|
#define RC_SYS_XENU "XENU"
|
|
|
|
const char *rc_sys (void);
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! @name Dependency options
|
|
|
|
* These options can change the services found by the rc_get_depinfo and
|
|
|
|
* rc_get_depends functions. */
|
|
|
|
/*! Trace provided services */
|
|
|
|
#define RC_DEP_TRACE 0x01
|
|
|
|
/*! Only use services added to runlevels */
|
|
|
|
#define RC_DEP_STRICT 0x02
|
|
|
|
/*! Runlevel is starting */
|
|
|
|
#define RC_DEP_START 0x04
|
|
|
|
/*! Runlevel is stopping */
|
|
|
|
#define RC_DEP_STOP 0x08
|
|
|
|
|
|
|
|
/*! @name Dependencies
|
|
|
|
* We analyse each init script and cache the resultant dependency tree.
|
2008-01-14 10:35:22 +05:30
|
|
|
* This tree can be accessed using the below functions. */
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2007-09-28 04:46:40 +05:30
|
|
|
#ifndef _IN_LIBRC
|
|
|
|
/* Handles to internal structures */
|
|
|
|
typedef void *rc_depinfo_t;
|
|
|
|
#endif
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2008-01-14 13:42:37 +05:30
|
|
|
/*! 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);
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! 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.
|
2007-10-04 19:08:47 +05:30
|
|
|
* @return true if successful, otherwise false */
|
|
|
|
bool rc_deptree_update (void);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-29 22:12:08 +05:30
|
|
|
/*! Check if the cached dependency tree is older than any init script,
|
|
|
|
* its configuration file or an external configuration file the init script
|
|
|
|
* has specified.
|
|
|
|
* @return true if it needs updating, otherwise false */
|
|
|
|
bool rc_deptree_update_needed (void);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Load the cached dependency tree and return a pointer to it.
|
2007-09-29 22:12:08 +05:30
|
|
|
* This pointer should be freed with rc_deptree_free when done.
|
2007-09-25 21:08:21 +05:30
|
|
|
* @return pointer to the dependency tree */
|
2007-09-29 22:12:08 +05:30
|
|
|
rc_depinfo_t *rc_deptree_load (void);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-12-05 23:18:07 +05:30
|
|
|
/*! List the depend for the type of service
|
|
|
|
* @param deptree to search
|
|
|
|
* @param type to use (keywords, etc)
|
|
|
|
* @param service to check
|
|
|
|
* @return NULL terminated list of services in order */
|
2007-12-20 20:32:04 +05:30
|
|
|
char **rc_deptree_depend (const rc_depinfo_t *deptree,
|
2008-01-14 13:42:37 +05:30
|
|
|
const char *type, const char *service);
|
2007-12-05 23:18:07 +05:30
|
|
|
|
2007-10-04 19:45:49 +05:30
|
|
|
/*! List all the services in order that the given services have
|
|
|
|
* for the given types and options.
|
|
|
|
* @param deptree to search
|
2008-01-14 10:35:22 +05:30
|
|
|
* @param types to use (ineed, iuse, etc)
|
2007-10-04 19:45:49 +05:30
|
|
|
* @param services to check
|
|
|
|
* @param options to pass
|
|
|
|
* @return NULL terminated list of services in order */
|
2007-12-20 20:32:04 +05:30
|
|
|
char **rc_deptree_depends (const rc_depinfo_t *deptree,
|
2008-01-14 13:42:37 +05:30
|
|
|
const char *const *types,
|
|
|
|
const char *const *services, const char *runlevel,
|
|
|
|
int options);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! List all the services that should be stoppned and then started, in order,
|
|
|
|
* for the given runlevel, including sysinit and boot services where
|
|
|
|
* approriate.
|
|
|
|
* @param deptree to search
|
|
|
|
* @param runlevel to change into
|
|
|
|
* @param options to pass
|
|
|
|
* @return NULL terminated list of services in order */
|
2007-12-20 20:32:04 +05:30
|
|
|
char **rc_deptree_order (const rc_depinfo_t *deptree, const char *runlevel,
|
2008-01-14 13:42:37 +05:30
|
|
|
int options);
|
2007-10-04 19:45:49 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Free a deptree and its information
|
|
|
|
* @param deptree to free */
|
2007-09-29 22:12:08 +05:30
|
|
|
void rc_deptree_free (rc_depinfo_t *deptree);
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! @name Plugins
|
|
|
|
* For each plugin loaded we will call rc_plugin_hook with the below
|
|
|
|
* enum and either the runlevel name or service name.
|
|
|
|
*
|
|
|
|
* Plugins are called when rc does something. This does not indicate an
|
|
|
|
* end result and the plugin should use the above functions to query things
|
|
|
|
* like service status.
|
|
|
|
*
|
|
|
|
* The service hooks have extra ones - now and done. This is because after
|
|
|
|
* start_in we may start other services before we start the service in
|
|
|
|
* question. now shows we really will start the service now and done shows
|
|
|
|
* when we have done it as may start scheduled services at this point. */
|
|
|
|
/*! Points at which a plugin can hook into RC */
|
2007-04-05 16:48:42 +05:30
|
|
|
typedef enum
|
|
|
|
{
|
2007-09-28 17:59:23 +05:30
|
|
|
RC_HOOK_RUNLEVEL_STOP_IN = 1,
|
|
|
|
RC_HOOK_RUNLEVEL_STOP_OUT = 4,
|
|
|
|
RC_HOOK_RUNLEVEL_START_IN = 5,
|
|
|
|
RC_HOOK_RUNLEVEL_START_OUT = 8,
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! We send the abort if an init script requests we abort and drop
|
2007-04-20 20:32:13 +05:30
|
|
|
* into single user mode if system not fully booted */
|
2007-09-28 17:59:23 +05:30
|
|
|
RC_HOOK_ABORT = 99,
|
|
|
|
RC_HOOK_SERVICE_STOP_IN = 101,
|
|
|
|
RC_HOOK_SERVICE_STOP_NOW = 102,
|
|
|
|
RC_HOOK_SERVICE_STOP_DONE = 103,
|
|
|
|
RC_HOOK_SERVICE_STOP_OUT = 104,
|
|
|
|
RC_HOOK_SERVICE_START_IN = 105,
|
|
|
|
RC_HOOK_SERVICE_START_NOW = 106,
|
|
|
|
RC_HOOK_SERVICE_START_DONE = 107,
|
|
|
|
RC_HOOK_SERVICE_START_OUT = 108
|
2007-04-05 16:48:42 +05:30
|
|
|
} rc_hook_t;
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Plugin entry point
|
|
|
|
* @param hook point
|
|
|
|
* @param name of runlevel or service
|
|
|
|
* @return 0 for success otherwise -1 */
|
|
|
|
int rc_plugin_hook (rc_hook_t hook, const char *name);
|
|
|
|
|
|
|
|
/*! Plugins should write FOO=BAR to this fd to set any environment
|
|
|
|
* variables they wish. Variables should be separated by NULLs. */
|
2007-04-20 15:09:47 +05:30
|
|
|
extern FILE *rc_environ_fd;
|
|
|
|
|
2007-10-09 14:55:32 +05:30
|
|
|
/*! @name Configuration
|
|
|
|
* These functions help to deal with shell based configuration files */
|
2008-01-07 17:59:30 +05:30
|
|
|
/*! Return a line from a file, stripping the trailing newline. */
|
|
|
|
char *rc_getline (FILE *fp);
|
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Return a NULL terminated list of non comment lines from a file. */
|
2007-10-03 20:13:05 +05:30
|
|
|
char **rc_config_list (const char *file);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Return a NULL terminated list of key=value lines from a file. */
|
2007-10-03 20:13:05 +05:30
|
|
|
char **rc_config_load (const char *file);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Return the value of the entry from a key=value list. */
|
2008-01-18 19:31:48 +05:30
|
|
|
char *rc_config_value (const char *const *list, const char *entry);
|
2007-08-03 15:44:38 +05:30
|
|
|
|
2007-11-23 17:34:11 +05:30
|
|
|
/*! Check if a variable is a boolean and return it's value.
|
2007-10-05 16:34:49 +05:30
|
|
|
* If variable is not a boolean then we set errno to be ENOENT when it does
|
|
|
|
* not exist or EINVAL if it's not a boolean.
|
|
|
|
* @param variable to check
|
|
|
|
* @return true if it matches true, yes or 1, false if otherwise. */
|
2007-11-23 17:34:11 +05:30
|
|
|
bool rc_yesno (const char *variable);
|
2007-10-05 16:34:49 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! @name String List functions
|
|
|
|
* Handy functions for dealing with string arrays of char **.
|
|
|
|
* It's safe to assume that any function here that uses char ** is a string
|
|
|
|
* list that can be manipulated with the below functions. Every string list
|
2007-10-09 14:55:32 +05:30
|
|
|
* should be released with a call to rc_strlist_free. */
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Duplicate the item, add it to end of the list and return a pointer to it.
|
|
|
|
* @param list to add the item too
|
|
|
|
* @param item to add.
|
|
|
|
* @return pointer to newly added item */
|
2007-09-18 17:06:55 +05:30
|
|
|
char *rc_strlist_add (char ***list, const char *item);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! If the item does not exist in the list, duplicate it, add it to the
|
|
|
|
* list and then return a pointer to it.
|
|
|
|
* @param list to add the item too
|
|
|
|
* @param item to add.
|
|
|
|
* @return pointer to newly added item */
|
2007-09-18 17:06:55 +05:30
|
|
|
char *rc_strlist_addu (char ***list, const char *item);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Duplicate the item, add it to the list at the point based on locale and
|
|
|
|
* then return a pointer to it.
|
|
|
|
* @param list to add the item too
|
|
|
|
* @param item to add.
|
|
|
|
* @return pointer to newly added item */
|
2007-09-18 17:06:55 +05:30
|
|
|
char *rc_strlist_addsort (char ***list, const char *item);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Duplicate the item, add it to the list at the point based on C locale and
|
|
|
|
* then return a pointer to it.
|
|
|
|
* @param list to add the item too
|
|
|
|
* @param item to add.
|
|
|
|
* @return pointer to newly added item */
|
2007-09-18 17:06:55 +05:30
|
|
|
char *rc_strlist_addsortc (char ***list, const char *item);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! If the item does not exist in the list, duplicate it, add it to the
|
|
|
|
* list based on locale and then return a pointer to it.
|
|
|
|
* @param list to add the item too
|
|
|
|
* @param item to add.
|
|
|
|
* @return pointer to newly added item */
|
2007-09-18 17:06:55 +05:30
|
|
|
char *rc_strlist_addsortu (char ***list, const char *item);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Free the item and remove it from the list. Return 0 on success otherwise -1.
|
|
|
|
* @param list to add the item too
|
|
|
|
* @param item to add.
|
2007-09-25 23:02:12 +05:30
|
|
|
* @return true on success, otherwise false */
|
|
|
|
bool rc_strlist_delete (char ***list, const char *item);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Moves the contents of list2 onto list1, so list2 is effectively emptied.
|
|
|
|
* Returns a pointer to the last item on the new list.
|
|
|
|
* @param list1 to append to
|
|
|
|
* @param list2 to move from
|
|
|
|
* @return pointer to the last item on the list */
|
|
|
|
char *rc_strlist_join (char ***list1, char **list2);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Reverses the contents of the list.
|
|
|
|
* @param list to reverse */
|
2007-08-03 15:44:38 +05:30
|
|
|
void rc_strlist_reverse (char **list);
|
2007-10-03 20:01:16 +05:30
|
|
|
|
2007-09-25 21:08:21 +05:30
|
|
|
/*! Frees each item on the list and the list itself.
|
|
|
|
* @param list to free */
|
2007-08-03 15:44:38 +05:30
|
|
|
void rc_strlist_free (char **list);
|
2007-04-05 16:48:42 +05:30
|
|
|
|
2007-10-03 20:13:05 +05:30
|
|
|
/*! Concatenate paths adding '/' if needed. The resultant pointer should be
|
|
|
|
* freed when finished with.
|
|
|
|
* @param path1 starting path
|
|
|
|
* @param paths NULL terminated list of paths to add
|
|
|
|
* @return pointer to the new path */
|
|
|
|
char *rc_strcatpaths (const char *path1, const char *paths, ...) SENTINEL;
|
|
|
|
|
2007-10-05 16:34:49 +05:30
|
|
|
/*! Find processes based on criteria.
|
|
|
|
* All of these are optional.
|
|
|
|
* pid overrides anything else.
|
|
|
|
* If both exec and cmd are given then we ignore exec.
|
|
|
|
* @param exec to check for
|
|
|
|
* @param cmd to check for
|
|
|
|
* @param uid to check for
|
|
|
|
* @param pid to check for
|
|
|
|
* @return NULL terminated list of pids */
|
2008-02-17 20:42:00 +05:30
|
|
|
pid_t *rc_find_pids (const char *const *argv, const char *cmd,
|
2008-01-14 13:42:37 +05:30
|
|
|
uid_t uid, pid_t pid);
|
2007-10-05 16:34:49 +05:30
|
|
|
|
2007-04-05 16:48:42 +05:30
|
|
|
#endif
|