aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2016-01-08 11:29:13 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2016-01-08 11:29:13 +0200
commit3325fed2895f079486b88c65409c73153fec306f (patch)
tree65165fde1e48346892cd0c0dfd7f7a4980ba1665
parent46b2745b25176c14c42bcc9612b290c310929aa0 (diff)
downloadpies-3325fed2895f079486b88c65409c73153fec306f.tar.gz
pies-3325fed2895f079486b88c65409c73153fec306f.tar.bz2
Enable control socket when run as init process.
* configure.ac (DEFAULT_CONTROL_URL): Rename to DEFAULT_PIES_CONTROL_URL. Change default value. (DEFAULT_INIT_CONTROL_URL): New subst variable. * lib/libpies.h (pies_basic_url_create): New prototype. * lib/url.c (pies_basic_url_create): New function (renamed from pies_url_create). (pies_url_create): Expand variable references in the input string. * src/Makefile.am (AM_CPPFLAGS): Pass DEFAULT_INIT_CONTROL_URL * src/ctl.c (pies_control_url) (ctl_open): Don't exit on errors, return -1 instead. * src/pies.c (default_control_url): New variable. (config_parse): Create default socket url. (pies_control_url): New macro (main): Set environment variable PIES_INSTANCE. Try to open control socket in init process mode as well. * src/pies.h (default_control_url): New extern. (ctl_open): Change prototype. (pies_control_url): Remove. * src/piesctl-cl.opt (parse_options): Set environment variable PIES_INSTANCE. * src/piesctl.c (parse_config): Use pies_url_create and DEFAULT_PIES_CONTROL_URL when falling back to the default socket.
-rw-r--r--.gitignore1
-rw-r--r--configure.ac7
-rw-r--r--lib/libpies.h1
-rw-r--r--lib/url.c19
-rw-r--r--po/.gitignore1
-rw-r--r--src/Makefile.am3
-rw-r--r--src/ctl.c28
-rw-r--r--src/pies.c28
-rw-r--r--src/pies.h4
-rw-r--r--src/piesctl-cl.opt1
-rw-r--r--src/piesctl.c11
11 files changed, 64 insertions, 40 deletions
diff --git a/.gitignore b/.gitignore
index f7b417d..216d2e5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
+/ABOUT-NLS~
*.a
*.la
*.lo
*.o
*.tar.*
*~
diff --git a/configure.ac b/configure.ac
index 3b34059..d6d4e4f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -126,14 +126,17 @@ AC_ARG_ENABLE([inetd],
AH_BOTTOM([
# ifndef ATTRIBUTE_NORETURN
# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
# endif
])
-AC_SUBST([DEFAULT_CONTROL_URL],[unix:///tmp/%s.ctl])
-AC_ARG_VAR([DEFAULT_CONTROL_URL],
+AC_SUBST([DEFAULT_PIES_CONTROL_URL],['unix:///tmp/$${PIES_INSTANCE}.ctl'])
+AC_ARG_VAR([DEFAULT_PIES_CONTROL_URL],
+ [URL of the default control socket])
+AC_SUBST([DEFAULT_INIT_CONTROL_URL],['unix:///dev/init.ctl'])
+AC_ARG_VAR([DEFAULT_INIT_CONTROL_URL],
[URL of the default control socket])
IMPRIMATUR_INIT
AC_CONFIG_FILES([Makefile
gnu/Makefile
diff --git a/lib/libpies.h b/lib/libpies.h
index b04182e..1c83b8e 100644
--- a/lib/libpies.h
+++ b/lib/libpies.h
@@ -68,12 +68,13 @@ struct pies_url
char *user;
char *passwd;
int argc;
char **argv;
};
+int pies_basic_url_create (struct pies_url **purl, const char *str);
int pies_url_create (struct pies_url **purl, const char *str);
void pies_url_destroy (struct pies_url **purl);
const char *pies_url_get_arg (struct pies_url *url, const char *argname);
int pies_url_copy (struct pies_url **purl, struct pies_url *src);
void pies_url_free_user (struct pies_url *url);
void pies_url_free_passwd (struct pies_url *url);
diff --git a/lib/url.c b/lib/url.c
index 41f5c04..11d220d 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -322,13 +322,13 @@ pies_url_copy (struct pies_url **purl, struct pies_url *src)
}
*purl = dest;
return 0;
}
int
-pies_url_create (struct pies_url **purl, const char *str)
+pies_basic_url_create (struct pies_url **purl, const char *str)
{
int rc;
struct pies_url *url;
url = malloc (sizeof (*url));
if (!url)
@@ -341,12 +341,29 @@ pies_url_create (struct pies_url **purl, const char *str)
{
url->string = strdup (str);
*purl = url;
}
return rc;
}
+
+extern char **environ;
+
+int
+pies_url_create (struct pies_url **purl, const char *str)
+{
+ struct wordsplit ws;
+ int rc;
+
+ ws.ws_env = (const char**) environ;
+ if (wordsplit (str, &ws,
+ WRDSF_NOCMD | WRDSF_QUOTE | WRDSF_NOSPLIT | WRDSF_ENV))
+ return -1;
+ rc = pies_basic_url_create (purl, ws.ws_wordv[0]);
+ wordsplit_free (&ws);
+ return rc;
+}
const char *
pies_url_get_arg (struct pies_url *url, const char *argname)
{
int i;
size_t arglen = strlen (argname);
diff --git a/po/.gitignore b/po/.gitignore
index d00dd8d..b45a955 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,6 +1,7 @@
+/Rules-quot~
/Makevars.template~
/Makefile.in.in~
*.gmo
*.po
*.po~
.pot
diff --git a/src/Makefile.am b/src/Makefile.am
index 9fb29d2..01149c6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -84,13 +84,14 @@ AM_CPPFLAGS=\
-I$(top_builddir)/gnu\
@GRECS_INCLUDES@\
-DDEFAULT_PREPROCESSOR="$(DEFAULT_PREPROCESSOR)"\
-DDEFAULT_VERSION_INCLUDE_DIR=\"$(incdir)\"\
-DDEFAULT_INCLUDE_DIR=\"$(pkgdatadir)/include\"\
-DDEFAULT_STATE_DIR=\"$(pkgstatedir)\"\
- -DDEFAULT_CONTROL_URL=\"$(DEFAULT_CONTROL_URL)\"
+ -DDEFAULT_PIES_CONTROL_URL='"$(DEFAULT_PIES_CONTROL_URL)"'\
+ -DDEFAULT_INIT_CONTROL_URL='"$(DEFAULT_INIT_CONTROL_URL)"'
AM_YFLAGS=-dvt -pmeta1
AM_LFLAGS=-dvp -Pmeta1 -olex.yy.c
EXTRA_SCRIPTS = inetd
sbin_SCRIPTS = @INETD@
diff --git a/src/ctl.c b/src/ctl.c
index 78490cb..46038a2 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -1230,51 +1230,35 @@ ctl_accept (int socket, void *data)
io->addrlen = addrlen;
register_socket (fd, NULL, ctlwr, NULL, io);
return 0;
}
-char const *
-pies_control_url (void)
-{
- if (!control.url)
- {
- char *str = xasprintf (DEFAULT_CONTROL_URL, instance);
- if (pies_url_create (&control.url, str))
- {
- logmsg (LOG_CRIT, _("%s: cannot create URL: %s"),
- str, strerror (errno));
- exit (EX_OSERR);
- }
- free (str);
- }
- return control.url->string;
-}
-
-void
-ctl_open ()
+int
+ctl_open (void)
{
int fd;
- pies_control_url ();
fd = create_socket (control.url, SOCK_STREAM, NULL, 077);
if (fd == -1)
{
logmsg (LOG_CRIT, _("can't create control socket %s"),
control.url->string);
- exit (EX_UNAVAILABLE);
+ return -1;
}
if (listen (fd, 8))
{
logmsg (LOG_CRIT, _("can't listen on control socket %s: %s"),
control.url->string, strerror (errno));
- exit (EX_UNAVAILABLE);
+ return -1;
}
register_socket (fd, ctl_accept, NULL, NULL, NULL);
+
+ return 0;
}
static void
idfmt_string (struct ctlio *io, char const *name, void *ptr)
{
json_object_set_string (io->output.reply, name, "%s", (char*) ptr);
diff --git a/src/pies.c b/src/pies.c
index 875684a..09f9fab 100644
--- a/src/pies.c
+++ b/src/pies.c
@@ -54,12 +54,17 @@ pies_acl_t pies_acl;
limits_record_t pies_limits;
int force_option;
char *mailer_program = "/usr/sbin/sendmail";
char *mailer_command_line = "/usr/sbin/sendmail -oi -t";
int mailer_argc;
char **mailer_argv;
+
+char *default_control_url[2] = {
+ DEFAULT_PIES_CONTROL_URL,
+ DEFAULT_INIT_CONTROL_URL
+};
struct config_file
{
enum config_syntax syntax;
char *name;
};
@@ -1746,12 +1751,24 @@ config_parse (char const *name)
break;
pies_config_provider (node);
}
if (grecs_tree_process (tree, pies_keywords))
config_error ();
+
+ if (!control.url)
+ {
+ char const *str = default_control_url[init_process];
+ if (pies_url_create (&control.url, str))
+ {
+ logmsg (LOG_CRIT, _("%s: cannot create control URL: %s"),
+ str, strerror (errno));
+ if (!init_process)
+ exit (EX_OSERR);
+ }
+ }
grecs_tree_free (tree);
}
void
config_help ()
@@ -1928,12 +1945,14 @@ pies_check_status (pid_t *ppid)
if (kill (pid, 0))
return pies_status_stale;
return pies_status_running;
}
+#define pies_control_url() control.url->string
+
void
request_restart_components (size_t cc, char **cv)
{
char **argv;
size_t i;
@@ -2227,13 +2246,13 @@ main (int argc, char **argv)
instance = strrchr (program_name, '/');
if (!instance)
instance = (char*) program_name;
else
instance++;
}
-
+ setenv ("PIES_INSTANCE", instance, 1);
log_tag = instance;
if (!init_process)
set_conf_file_names (instance);
if (init_process || !DEFAULT_PREPROCESSOR)
@@ -2368,15 +2387,18 @@ main (int argc, char **argv)
logmsg (LOG_ERR, _("cannot become a daemon: %s"), strerror (errno));
exit (EX_SOFTWARE);
}
diag_setup (DIAG_TO_SYSLOG);
}
- if (!init_process)
+ if (init_process)
+ ctl_open ();
+ else
{
- ctl_open ();
+ if (ctl_open ())
+ exit (EX_UNAVAILABLE);
create_pidfile (pidfile);
}
if (argv[0][0] != '/')
logmsg (LOG_NOTICE,
_("not started as an absolute pathname; "
diff --git a/src/pies.h b/src/pies.h
index f69c512..f22ccb2 100644
--- a/src/pies.h
+++ b/src/pies.h
@@ -289,12 +289,13 @@ extern int init_process;
extern char *console_device;
extern int initdefault;
extern int dfl_level;
extern size_t pies_master_argc;
extern char **pies_master_argv;
+extern char *default_control_url[2];
enum config_syntax
{
CONF_PIES,
CONF_META1,
CONF_INETD,
@@ -546,8 +547,7 @@ struct control
unsigned int idle_timeout; /* Session idle timeout */
char *realm; /* Authentication realm */
};
extern struct control control;
-void ctl_open(void);
-char const *pies_control_url (void);
+int ctl_open(void);
diff --git a/src/piesctl-cl.opt b/src/piesctl-cl.opt
index b8e4fc1..b787a5c 100644
--- a/src/piesctl-cl.opt
+++ b/src/piesctl-cl.opt
@@ -92,10 +92,11 @@ END
OPTIONS_END
void
parse_options(int argc, char *argv[], int *index)
{
GETOPT(argc, argv, *index)
+ setenv ("PIES_INSTANCE", instance, 1);
}
diff --git a/src/piesctl.c b/src/piesctl.c
index 301e7ac..dba8988 100644
--- a/src/piesctl.c
+++ b/src/piesctl.c
@@ -185,23 +185,16 @@ parse_config ()
if (verbose)
printf (_("%s: falling back to default URL\n"), program_name);
if (default_url)
url = default_url;
else
{
- int rc;
- size_t len = 0;
- file_name = NULL;
- grecs_asprintf (&file_name, &len, DEFAULT_CONTROL_URL, instance);
- rc = pies_url_create (&url, file_name);
- free (file_name);
-
- if (rc)
+ if (pies_url_create (&url, DEFAULT_PIES_CONTROL_URL))
{
grecs_error (NULL, 0, _("%s: cannot create URL: %s"),
- DEFAULT_CONTROL_URL, strerror (errno));
+ DEFAULT_PIES_CONTROL_URL, strerror (errno));
exit (EX_SOFTWARE);
}
}
}
if (verbose)

Return to:

Send suggestions and report system problems to the System administrator.