upstart/upstart-tty-stack.patch

1684 lines
40 KiB
Diff

diff -up init/control.c.old init/control.c
--- init/control.c.old 2009-06-22 11:59:11.000000000 +0200
+++ init/control.c 2009-06-22 11:59:26.000000000 +0200
@@ -43,6 +43,7 @@
#include <upstart/message.h>
#include "job.h"
+#include "tty.h"
#include "control.h"
#include "notify.h"
@@ -57,6 +58,11 @@ static int control_log_priority (
static int control_job_find (void *data, pid_t pid,
UpstartMessageType type,
const char *pattern);
+static int control_push_tty (void *data, pid_t pid,
+ UpstartMessageType type,
+ const char *device);
+static int control_pop_tty (void *data, pid_t pid,
+ UpstartMessageType type);
static int control_job_query (void *data, pid_t pid,
UpstartMessageType type,
const char *name, unsigned int id);
@@ -96,6 +102,10 @@ NihIo *control_io = NULL;
static UpstartMessage message_handlers[] = {
{ -1, UPSTART_VERSION_QUERY,
(UpstartMessageHandler)control_version_query },
+ { -1, UPSTART_PUSH_TTY,
+ (UpstartMessageHandler)control_push_tty },
+ { -1, UPSTART_POP_TTY,
+ (UpstartMessageHandler)control_pop_tty },
{ -1, UPSTART_LOG_PRIORITY,
(UpstartMessageHandler)control_log_priority },
{ -1, UPSTART_JOB_FIND,
@@ -308,6 +318,66 @@ control_send_instance (pid_t pid,
nih_io_send_message (control_io, message);
}
+/**
+ * control_push_tty:
+ * @data: data pointer,
+ * @pid: origin process id,
+ * @type: message type received.
+ *
+ * This function is called to change the current tty.
+ *
+ * Returns: zero on success, negative value on raised error.
+ **/
+static int
+control_push_tty (void *data,
+ pid_t pid,
+ UpstartMessageType type,
+ const char *device)
+{
+ NihIoMessage *reply;
+
+ nih_assert (pid > 0);
+ nih_assert (type == UPSTART_PUSH_TTY);
+
+ nih_info (_("Control request to change tty"));
+
+ NIH_MUST (reply = upstart_message_new (control_io, pid,
+ UPSTART_TTY,
+ push_tty (device)));
+ nih_io_send_message (control_io, reply);
+
+ return 0;
+}
+
+/**
+ * control_pop_tty:
+ * @data: data pointer,
+ * @pid: origin process id,
+ * @type: message type received.
+ *
+ * This function is called to revert the most recent tty change.
+ *
+ * Returns: zero on success, negative value on raised error.
+ **/
+static int
+control_pop_tty (void *data,
+ pid_t pid,
+ UpstartMessageType type)
+{
+ NihIoMessage *reply;
+
+ nih_assert (pid > 0);
+ nih_assert (type == UPSTART_POP_TTY);
+
+ nih_info (_("Control request to revert changed tty"));
+
+ NIH_MUST (reply = upstart_message_new (control_io, pid,
+ UPSTART_TTY,
+ pop_tty ()));
+ nih_io_send_message (control_io, reply);
+
+ return 0;
+}
/**
* control_version_query:
diff -up init/main.c.old init/main.c
--- init/main.c.old 2009-06-22 13:42:44.000000000 +0200
+++ init/main.c 2009-06-22 13:42:55.000000000 +0200
@@ -58,6 +58,7 @@
#include "control.h"
#include "cfgfile.h"
#include "paths.h"
+#include "tty.h"
/* Prototypes for static functions */
@@ -190,6 +191,8 @@ main (int argc,
if (! (restart || rescue))
reset_console ();
+ tty_stack_init ();
+
/* Set the PATH environment variable */
setenv ("PATH", PATH, TRUE);
diff -up init/Makefile.in.old init/Makefile.in
--- init/Makefile.in.old 2009-06-22 11:56:34.000000000 +0200
+++ init/Makefile.in 2009-06-22 11:56:53.000000000 +0200
@@ -72,9 +72,9 @@ am__EXEEXT_1 = test_process$(EXEEXT) tes
am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"
sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(sbin_PROGRAMS)
-am_init_OBJECTS = main.$(OBJEXT) process.$(OBJEXT) job.$(OBJEXT) \
- event.$(OBJEXT) control.$(OBJEXT) notify.$(OBJEXT) \
- cfgfile.$(OBJEXT)
+am_init_OBJECTS = main.$(OBJEXT) tty.$(OBJEXT) process.$(OBJEXT) \
+ job.$(OBJEXT) event.$(OBJEXT) control.$(OBJEXT) \
+ notify.$(OBJEXT) cfgfile.$(OBJEXT)
init_OBJECTS = $(am_init_OBJECTS)
am__DEPENDENCIES_1 =
init_DEPENDENCIES = ../upstart/libupstart.la ../nih/libnih.la \
@@ -314,6 +314,7 @@ dist_man_MANS = \
init_SOURCES = \
main.c \
+ tty.c tty.h\
errors.h paths.h \
process.c process.h \
job.c job.h \
@@ -474,6 +475,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_job.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_notify.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_process.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tty.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff -up init/process.c.old init/process.c
--- init/process.c.old 2009-06-22 13:45:48.000000000 +0200
+++ init/process.c 2009-06-22 13:45:48.000000000 +0200
@@ -51,6 +51,7 @@
#include "job.h"
#include "process.h"
#include "paths.h"
+#include "tty.h"
/* Prototypes for static functions */
@@ -385,10 +386,11 @@ process_setup_console (Job *job,
break;
- case CONSOLE_OUTPUT:
+ case CONSOLE_OUTPUT: {
/* Ordinary console input and output */
- fd = open (CONSOLE, O_RDWR | O_NOCTTY);
+ fd = open (current_tty (), O_RDWR | O_NOCTTY);
break;
+ }
case CONSOLE_OWNER:
/* As CONSOLE_OUTPUT but with ^C, etc. sent */
diff -up init/tty.c.old init/tty.c
--- init/tty.c.old 2009-06-22 13:45:48.000000000 +0200
+++ init/tty.c 2009-06-22 13:45:48.000000000 +0200
@@ -0,0 +1,97 @@
+/* upstart
+ *
+ * tty.c - tty change events
+ *
+ * Copyright © 2007 Canonical Ltd.
+ * Author: Scott James Remnant <scott@ubuntu.com>.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <nih/logging.h>
+#include <nih/string.h>
+#include <nih/alloc.h>
+
+#include "paths.h"
+
+static char **tty_stack = NULL;
+static size_t tty_stack_top = 0;
+
+/**
+ * tty_stack_init:
+ *
+ * Allocate the tty stack
+ **/
+void
+tty_stack_init (void)
+{
+ NIH_MUST (tty_stack = nih_str_array_new (NULL));
+}
+
+/**
+ * current_tty:
+ *
+ * Get the tty at the top of the stack
+ **/
+const char *
+current_tty (void)
+{
+ if (!tty_stack_top) return CONSOLE;
+ return tty_stack[tty_stack_top - 1];
+}
+
+/**
+ * tty_stack_init:
+ *
+ * Push a tty onto the tty stack
+ **/
+const char *
+push_tty (const char *tty)
+{
+ nih_assert (tty_stack != NULL);
+ NIH_MUST (nih_str_array_add (&tty_stack, NULL, &tty_stack_top, tty));
+
+ return current_tty ();
+}
+
+/**
+ * pop_tty:
+ *
+ * Pop a tty off of the tty stack
+ **/
+const char *
+pop_tty (void)
+{
+ nih_assert (tty_stack != NULL);
+ if (tty_stack_top == 0) return current_tty();
+ nih_free (tty_stack[tty_stack_top - 1]);
+ tty_stack[--tty_stack_top] = NULL;
+ tty_stack = nih_realloc (tty_stack, NULL,
+ sizeof (char *) * (tty_stack_top + 2));
+
+ return current_tty ();
+}
+
diff -up init/tty.h.old init/tty.h
--- init/tty.h.old 2009-06-22 13:45:48.000000000 +0200
+++ init/tty.h 2009-06-22 13:45:48.000000000 +0200
@@ -0,0 +1,35 @@
+/* upstart
+ *
+ * Copyright © 2007 Canonical Ltd.
+ * Author: Scott James Remnant <scott@ubuntu.com>.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef INIT_TTY_H
+#define INIT_TTY_H
+
+#include <nih/macros.h>
+
+NIH_BEGIN_EXTERN
+
+const char *current_tty (void);
+const char *push_tty (const char *tty);
+const char *pop_tty (void);
+void tty_stack_init (void);
+
+NIH_END_EXTERN
+
+#endif /* INIT_TTY_H */
diff -up po/ca.po.old po/ca.po
--- po/ca.po.old 2009-06-22 13:45:48.000000000 +0200
+++ po/ca.po 2009-06-22 13:45:48.000000000 +0200
@@ -22,46 +22,46 @@ msgstr ""
msgid "display list of commands"
msgstr "mostra aquesta ajuda i surt"
-#: nih/command.c:141
+#: nih/command.c:139
#, c-format
msgid "For a list of commands, try `%s help'."
msgstr ""
-#: nih/command.c:144
+#: nih/command.c:142
msgid "COMMAND [OPTION]... [ARG]..."
msgstr ""
-#: nih/command.c:162
+#: nih/command.c:160
#, fuzzy, c-format
msgid "%s: missing command\n"
msgstr "%s: manca un argument: %s\n"
-#: nih/command.c:170
+#: nih/command.c:168
#, fuzzy, c-format
msgid "%s: invalid command: %s\n"
msgstr "%s: l'opció és invàlida: --%s\n"
-#: nih/command.c:181
+#: nih/command.c:179
#, c-format
msgid "%s [OPTION]..."
msgstr ""
-#: nih/command.c:424
+#: nih/command.c:418
#, c-format
msgid "For more information on a command, try `%s COMMAND --help'.\n"
msgstr ""
-#: nih/command.c:450
+#: nih/command.c:444
#, fuzzy, c-format
msgid "%s commands:\n"
msgstr "Opcions %s:\n"
-#: nih/command.c:452
+#: nih/command.c:446
#, fuzzy, c-format
msgid "Other commands:\n"
msgstr "Altres opcions:\n"
-#: nih/command.c:454
+#: nih/command.c:448
#, c-format
msgid "Commands:\n"
msgstr ""
@@ -70,7 +70,7 @@ msgstr ""
msgid "Unhandled Error"
msgstr "Error no gestionat"
-#: nih/io.c:1203
+#: nih/io.c:1198
msgid "Error while reading from descriptor"
msgstr "S'ha produït un error en llegir del descriptor"
@@ -101,60 +101,60 @@ msgstr "mostra aquesta ajuda i surt"
msgid "output version information and exit"
msgstr "mostra la informació sobre la versió i surt"
-#: nih/option.c:299
+#: nih/option.c:297
#, c-format
msgid "%s: invalid option: -%c\n"
msgstr "%s: l'opció és invàlida: -%c\n"
-#: nih/option.c:392
+#: nih/option.c:390
#, c-format
msgid "%s: invalid option: --%s\n"
msgstr "%s: l'opció és invàlida: --%s\n"
-#: nih/option.c:408
+#: nih/option.c:406
#, c-format
msgid "%s: unexpected argument: --%s\n"
msgstr "%s: no s'esperava l'argument: --%s\n"
-#: nih/option.c:464
+#: nih/option.c:462
#, c-format
msgid "%s: missing argument: %s\n"
msgstr "%s: manca un argument: %s\n"
-#: nih/option.c:664
+#: nih/option.c:660
#, fuzzy, c-format
msgid "%s: illegal argument: %s\n"
msgstr "%s: manca un argument: %s\n"
-#: nih/option.c:862
+#: nih/option.c:858
msgid "Usage"
msgstr "Forma d'ús"
-#: nih/option.c:866
+#: nih/option.c:862
msgid "[OPTION]..."
msgstr ""
-#: nih/option.c:915
+#: nih/option.c:911
#, c-format
msgid "Report bugs to <%s>\n"
msgstr "Informeu-ne del errors a <%s>\n"
-#: nih/option.c:941
+#: nih/option.c:937
#, c-format
msgid "%s options:\n"
msgstr "Opcions %s:\n"
-#: nih/option.c:943
+#: nih/option.c:939
#, c-format
msgid "Other options:\n"
msgstr "Altres opcions:\n"
-#: nih/option.c:945
+#: nih/option.c:941
#, c-format
msgid "Options:\n"
msgstr "Opcions:\n"
-#: nih/watch.c:521
+#: nih/watch.c:560
msgid "Unable to watch directory"
msgstr ""
@@ -305,82 +305,92 @@ msgstr ""
msgid "Deleting %s job"
msgstr "S'està tornant a exiecutar %s"
-#: init/control.c:216
+#: init/control.c:225
#, fuzzy, c-format
msgid "Error on control socket: %s"
msgstr "S'ha produït un error en llegir el missatge de control: %s"
-#: init/control.c:336
+#: init/control.c:345
+#, fuzzy
+msgid "Control request to change tty"
+msgstr "Petició de control per a iniciar %s"
+
+#: init/control.c:379
+#, fuzzy
+msgid "Control request to revert changed tty"
+msgstr "Petició de control per a iniciar %s"
+
+#: init/control.c:413
#, fuzzy
msgid "Control request for our version"
msgstr "Petició de control per a consultar l'estat de %s"
-#: init/control.c:369
+#: init/control.c:446
#, fuzzy
msgid "Control request to change logging priority"
msgstr "Petició de control per a iniciar %s"
-#: init/control.c:406
+#: init/control.c:483
#, fuzzy, c-format
msgid "Control request for jobs matching %s"
msgstr "Petició de control per a consultar l'estat de %s"
-#: init/control.c:408
+#: init/control.c:485
#, fuzzy
msgid "Control request for all jobs"
msgstr "Petició de control per a consultar l'estat de %s"
-#: init/control.c:470
+#: init/control.c:547
#, fuzzy, c-format
msgid "Control request for status of %s"
msgstr "Petició de control per a consultar l'estat de %s"
-#: init/control.c:474
+#: init/control.c:551
#, fuzzy, c-format
msgid "Control request for status of job #%u"
msgstr "Petició de control per a consultar l'estat de %s"
-#: init/control.c:528
+#: init/control.c:605
#, c-format
msgid "Control request to start %s"
msgstr "Petició de control per a iniciar %s"
-#: init/control.c:532
+#: init/control.c:609
#, fuzzy, c-format
msgid "Control request to start job #%u"
msgstr "Petició de control per a iniciar %s"
-#: init/control.c:615
+#: init/control.c:692
#, c-format
msgid "Control request to stop %s"
msgstr "Petició de control per a aturar %s"
-#: init/control.c:619
+#: init/control.c:696
#, fuzzy, c-format
msgid "Control request to stop job #%u"
msgstr "Petició de control per a aturar %s"
-#: init/control.c:748
+#: init/control.c:825
#, fuzzy, c-format
msgid "Control request to emit %s event"
msgstr "Petició de control per a aturar %s"
-#: init/control.c:779
+#: init/control.c:856
#, c-format
msgid "Control request to subscribe %d to jobs"
msgstr "Petició de control per a subscriure %d als treballs"
-#: init/control.c:810
+#: init/control.c:887
#, c-format
msgid "Control request to unsubscribe %d from jobs"
msgstr "Petició de control per a desubscriure %d dels treballs"
-#: init/control.c:840
+#: init/control.c:917
#, c-format
msgid "Control request to subscribe %d to events"
msgstr ""
-#: init/control.c:871
+#: init/control.c:948
#, c-format
msgid "Control request to unsubscribe %d from events"
msgstr ""
@@ -485,7 +495,7 @@ msgid ""
"actually run /sbin/telinit."
msgstr ""
-#: init/main.c:136 util/initctl.c:366 compat/sysv/reboot.c:203
+#: init/main.c:136 util/initctl.c:373 compat/sysv/reboot.c:203
#: compat/sysv/shutdown.c:322 compat/sysv/telinit.c:91
msgid "Need to be root"
msgstr "Es necessita ser root"
@@ -657,6 +667,11 @@ msgstr "%s: l'opció és invàlida: --%s
msgid "%s: missing job name\n"
msgstr ""
+#: util/initctl.c:1889
+#, fuzzy, c-format
+msgid "%s: missing device name\n"
+msgstr "%s: manca un argument: %s\n"
+
#: util/initctl.c:1826
#, c-format
msgid "%s: missing event name\n"
@@ -733,11 +748,11 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2119
+#: util/initctl.c:2239
msgid "Stop jobs."
msgstr ""
-#: util/initctl.c:2120
+#: util/initctl.c:2240
msgid ""
"JOB is one or more job names that are to be stopped.\n"
"\n"
@@ -745,11 +760,11 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2126
+#: util/initctl.c:2246
msgid "Query status of jobs."
msgstr ""
-#: util/initctl.c:2127
+#: util/initctl.c:2247
msgid ""
"JOB is one or more job names that are to be queried.\n"
"\n"
@@ -757,19 +772,19 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2133
+#: util/initctl.c:2253
msgid "List known jobs."
msgstr ""
-#: util/initctl.c:2137
+#: util/initctl.c:2257
msgid "EVENT [ARG]..."
msgstr ""
-#: util/initctl.c:2138
+#: util/initctl.c:2258
msgid "Emit an event."
msgstr ""
-#: util/initctl.c:2139
+#: util/initctl.c:2259
msgid ""
"EVENT is the name of an event the init daemon should emit, which may have "
"zero or more arguments specified by ARG. These may be matched in the job "
@@ -780,27 +795,35 @@ msgid ""
"taken from the environment or ignored if not present there."
msgstr ""
-#: util/initctl.c:2150
+#: util/initctl.c:2270
msgid "Receive notification of job state changes."
msgstr ""
-#: util/initctl.c:2155
+#: util/initctl.c:2275
msgid "Receive notification of emitted events."
msgstr ""
-#: util/initctl.c:2160
+#: util/initctl.c:2280
+msgid "Change the init daemon's tty device"
+msgstr ""
+
+#: util/initctl.c:2285
+msgid "Revert the last change to the init daemon's tty device"
+msgstr ""
+
+#: util/initctl.c:2290
msgid "Request the version of the init daemon."
msgstr ""
-#: util/initctl.c:2163
+#: util/initctl.c:2293
msgid "PRIORITY"
msgstr ""
-#: util/initctl.c:2164
+#: util/initctl.c:2294
msgid "Change the minimum priority of log messages from the init daemon"
msgstr ""
-#: util/initctl.c:2166
+#: util/initctl.c:2296
msgid ""
"PRIORITY may be one of `debug' (messages useful for debugging upstart are "
"logged, equivalent to --debug on kernel command-line); `info' (messages "
diff -up po/fr.po.old po/fr.po
--- po/fr.po.old 2009-06-22 13:45:48.000000000 +0200
+++ po/fr.po 2009-06-22 13:45:48.000000000 +0200
@@ -22,46 +22,46 @@ msgstr ""
msgid "display list of commands"
msgstr "afficher cette aide et quitter"
-#: nih/command.c:141
+#: nih/command.c:139
#, c-format
msgid "For a list of commands, try `%s help'."
msgstr ""
-#: nih/command.c:144
+#: nih/command.c:142
msgid "COMMAND [OPTION]... [ARG]..."
msgstr ""
-#: nih/command.c:162
+#: nih/command.c:160
#, fuzzy, c-format
msgid "%s: missing command\n"
msgstr "%s : argument manquant : %s\n"
-#: nih/command.c:170
+#: nih/command.c:168
#, fuzzy, c-format
msgid "%s: invalid command: %s\n"
msgstr "%s : option invalide : --%s\n"
-#: nih/command.c:181
+#: nih/command.c:179
#, c-format
msgid "%s [OPTION]..."
msgstr ""
-#: nih/command.c:424
+#: nih/command.c:418
#, c-format
msgid "For more information on a command, try `%s COMMAND --help'.\n"
msgstr ""
-#: nih/command.c:450
+#: nih/command.c:444
#, fuzzy, c-format
msgid "%s commands:\n"
msgstr "%s options:\n"
-#: nih/command.c:452
+#: nih/command.c:446
#, fuzzy, c-format
msgid "Other commands:\n"
msgstr "Autres options:\n"
-#: nih/command.c:454
+#: nih/command.c:448
#, c-format
msgid "Commands:\n"
msgstr ""
@@ -70,7 +70,7 @@ msgstr ""
msgid "Unhandled Error"
msgstr "Erreur non traitée"
-#: nih/io.c:1203
+#: nih/io.c:1198
#, fuzzy
msgid "Error while reading from descriptor"
msgstr "Erreur lors de la lecture du descripteur"
@@ -106,60 +106,60 @@ msgstr "afficher cette aide et quitter"
msgid "output version information and exit"
msgstr "affichage de l'information de version et sortie"
-#: nih/option.c:299
+#: nih/option.c:297
#, c-format
msgid "%s: invalid option: -%c\n"
msgstr "%s: option ivalide: -%c\n"
-#: nih/option.c:392
+#: nih/option.c:390
#, c-format
msgid "%s: invalid option: --%s\n"
msgstr "%s : option invalide : --%s\n"
-#: nih/option.c:408
+#: nih/option.c:406
#, c-format
msgid "%s: unexpected argument: --%s\n"
msgstr "%s : argument inattendu : --%s\n"
-#: nih/option.c:464
+#: nih/option.c:462
#, c-format
msgid "%s: missing argument: %s\n"
msgstr "%s : argument manquant : %s\n"
-#: nih/option.c:664
+#: nih/option.c:660
#, fuzzy, c-format
msgid "%s: illegal argument: %s\n"
msgstr "%s : argument manquant : %s\n"
-#: nih/option.c:862
+#: nih/option.c:858
msgid "Usage"
msgstr "Utilisation"
-#: nih/option.c:866
+#: nih/option.c:862
msgid "[OPTION]..."
msgstr ""
-#: nih/option.c:915
+#: nih/option.c:911
#, c-format
msgid "Report bugs to <%s>\n"
msgstr "Signalez les anomalies à <%s>\n"
-#: nih/option.c:941
+#: nih/option.c:937
#, c-format
msgid "%s options:\n"
msgstr "%s options:\n"
-#: nih/option.c:943
+#: nih/option.c:939
#, c-format
msgid "Other options:\n"
msgstr "Autres options:\n"
-#: nih/option.c:945
+#: nih/option.c:941
#, c-format
msgid "Options:\n"
msgstr "Options:\n"
-#: nih/watch.c:521
+#: nih/watch.c:560
#, fuzzy
msgid "Unable to watch directory"
msgstr "Impossible d'accepter la connexion : %s"
@@ -315,82 +315,92 @@ msgstr "Impossible d'accepter la connexi
msgid "Deleting %s job"
msgstr "Ré-éxecution de %s"
-#: init/control.c:216
+#: init/control.c:225
#, fuzzy, c-format
msgid "Error on control socket: %s"
msgstr "Erreur lors de la lecture du message de contrôle : %s"
-#: init/control.c:336
+#: init/control.c:345
+#, fuzzy
+msgid "Control request to change tty"
+msgstr "Demande de contrôle à commencer %s"
+
+#: init/control.c:379
+#, fuzzy
+msgid "Control request to revert changed tty"
+msgstr "Demande de contrôle à commencer %s"
+
+#: init/control.c:413
#, fuzzy
msgid "Control request for our version"
msgstr "Demande de contrôle pour lister les tâches"
-#: init/control.c:369
+#: init/control.c:446
#, fuzzy
msgid "Control request to change logging priority"
msgstr "Demande de contrôle à commencer %s"
-#: init/control.c:406
+#: init/control.c:483
#, fuzzy, c-format
msgid "Control request for jobs matching %s"
msgstr "Demande de contrôle de status pour %s"
-#: init/control.c:408
+#: init/control.c:485
#, fuzzy
msgid "Control request for all jobs"
msgstr "Demande de contrôle pour lister les tâches"
-#: init/control.c:470
+#: init/control.c:547
#, fuzzy, c-format
msgid "Control request for status of %s"
msgstr "Demande de contrôle de status pour %s"
-#: init/control.c:474
+#: init/control.c:551
#, fuzzy, c-format
msgid "Control request for status of job #%u"
msgstr "Demande de contrôle de status pour %s"
-#: init/control.c:528
+#: init/control.c:605
#, fuzzy, c-format
msgid "Control request to start %s"
msgstr "Demande de contrôle à commencer %s"
-#: init/control.c:532
+#: init/control.c:609
#, fuzzy, c-format
msgid "Control request to start job #%u"
msgstr "Demande de contrôle à commencer %s"
-#: init/control.c:615
+#: init/control.c:692
#, fuzzy, c-format
msgid "Control request to stop %s"
msgstr "Demande de contrôle pour arreter %s"
-#: init/control.c:619
+#: init/control.c:696
#, fuzzy, c-format
msgid "Control request to stop job #%u"
msgstr "Demande de contrôle pour arreter %s"
-#: init/control.c:748
+#: init/control.c:825
#, fuzzy, c-format
msgid "Control request to emit %s event"
msgstr "Demande de contrôle pour faire la queue des évènements %s"
-#: init/control.c:779
+#: init/control.c:856
#, fuzzy, c-format
msgid "Control request to subscribe %d to jobs"
msgstr "Demande de contrôle pour inscrire %d aux tâches"
-#: init/control.c:810
+#: init/control.c:887
#, fuzzy, c-format
msgid "Control request to unsubscribe %d from jobs"
msgstr "Demande de contrôle pour désinscrire % des tâches"
-#: init/control.c:840
+#: init/control.c:917
#, fuzzy, c-format
msgid "Control request to subscribe %d to events"
msgstr "Demande de contrôle pour inscrire %d aux évènements"
-#: init/control.c:871
+#: init/control.c:948
#, fuzzy, c-format
msgid "Control request to unsubscribe %d from events"
msgstr "Demande de contrôle pour désinscrire %d des évènements"
@@ -496,7 +506,7 @@ msgid ""
"actually run /sbin/telinit."
msgstr ""
-#: init/main.c:136 util/initctl.c:366 compat/sysv/reboot.c:203
+#: init/main.c:136 util/initctl.c:373 compat/sysv/reboot.c:203
#: compat/sysv/shutdown.c:322 compat/sysv/telinit.c:91
#, fuzzy
msgid "Need to be root"
@@ -672,6 +682,11 @@ msgstr "%s : option invalide : --%s\n"
msgid "%s: missing job name\n"
msgstr ""
+#: util/initctl.c:1889
+#, fuzzy, c-format
+msgid "%s: missing device name\n"
+msgstr "%s: argument manquant : %s\n"
+
#: util/initctl.c:1826
#, c-format
msgid "%s: missing event name\n"
@@ -748,11 +763,11 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2119
+#: util/initctl.c:2239
msgid "Stop jobs."
msgstr ""
-#: util/initctl.c:2120
+#: util/initctl.c:2240
msgid ""
"JOB is one or more job names that are to be stopped.\n"
"\n"
@@ -760,11 +775,11 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2126
+#: util/initctl.c:2246
msgid "Query status of jobs."
msgstr ""
-#: util/initctl.c:2127
+#: util/initctl.c:2247
msgid ""
"JOB is one or more job names that are to be queried.\n"
"\n"
@@ -772,19 +787,19 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2133
+#: util/initctl.c:2253
msgid "List known jobs."
msgstr ""
-#: util/initctl.c:2137
+#: util/initctl.c:2257
msgid "EVENT [ARG]..."
msgstr ""
-#: util/initctl.c:2138
+#: util/initctl.c:2258
msgid "Emit an event."
msgstr ""
-#: util/initctl.c:2139
+#: util/initctl.c:2259
msgid ""
"EVENT is the name of an event the init daemon should emit, which may have "
"zero or more arguments specified by ARG. These may be matched in the job "
@@ -795,27 +810,35 @@ msgid ""
"taken from the environment or ignored if not present there."
msgstr ""
-#: util/initctl.c:2150
+#: util/initctl.c:2270
msgid "Receive notification of job state changes."
msgstr ""
-#: util/initctl.c:2155
+#: util/initctl.c:2275
msgid "Receive notification of emitted events."
msgstr ""
-#: util/initctl.c:2160
+#: util/initctl.c:2280
+msgid "Change the init daemon's tty device"
+msgstr ""
+
+#: util/initctl.c:2285
+msgid "Revert the last change to the init daemon's tty device"
+msgstr ""
+
+#: util/initctl.c:2290
msgid "Request the version of the init daemon."
msgstr ""
-#: util/initctl.c:2163
+#: util/initctl.c:2293
msgid "PRIORITY"
msgstr ""
-#: util/initctl.c:2164
+#: util/initctl.c:2294
msgid "Change the minimum priority of log messages from the init daemon"
msgstr ""
-#: util/initctl.c:2166
+#: util/initctl.c:2296
msgid ""
"PRIORITY may be one of `debug' (messages useful for debugging upstart are "
"logged, equivalent to --debug on kernel command-line); `info' (messages "
diff -up po/sv.po.old po/sv.po
--- po/sv.po.old 2009-06-22 13:45:48.000000000 +0200
+++ po/sv.po 2009-06-22 13:45:48.000000000 +0200
@@ -21,46 +21,46 @@ msgstr ""
msgid "display list of commands"
msgstr ""
-#: nih/command.c:141
+#: nih/command.c:139
#, c-format
msgid "For a list of commands, try `%s help'."
msgstr ""
-#: nih/command.c:144
+#: nih/command.c:142
msgid "COMMAND [OPTION]... [ARG]..."
msgstr ""
-#: nih/command.c:162
+#: nih/command.c:160
#, c-format
msgid "%s: missing command\n"
msgstr ""
-#: nih/command.c:170
+#: nih/command.c:168
#, c-format
msgid "%s: invalid command: %s\n"
msgstr ""
-#: nih/command.c:181
+#: nih/command.c:179
#, c-format
msgid "%s [OPTION]..."
msgstr ""
-#: nih/command.c:424
+#: nih/command.c:418
#, c-format
msgid "For more information on a command, try `%s COMMAND --help'.\n"
msgstr ""
-#: nih/command.c:450
+#: nih/command.c:444
#, c-format
msgid "%s commands:\n"
msgstr ""
-#: nih/command.c:452
+#: nih/command.c:446
#, c-format
msgid "Other commands:\n"
msgstr ""
-#: nih/command.c:454
+#: nih/command.c:448
#, c-format
msgid "Commands:\n"
msgstr ""
@@ -69,7 +69,7 @@ msgstr ""
msgid "Unhandled Error"
msgstr ""
-#: nih/io.c:1203
+#: nih/io.c:1198
msgid "Error while reading from descriptor"
msgstr ""
@@ -100,60 +100,60 @@ msgstr ""
msgid "output version information and exit"
msgstr ""
-#: nih/option.c:299
+#: nih/option.c:297
#, c-format
msgid "%s: invalid option: -%c\n"
msgstr ""
-#: nih/option.c:392
+#: nih/option.c:390
#, c-format
msgid "%s: invalid option: --%s\n"
msgstr ""
-#: nih/option.c:408
+#: nih/option.c:406
#, c-format
msgid "%s: unexpected argument: --%s\n"
msgstr ""
-#: nih/option.c:464
+#: nih/option.c:462
#, c-format
msgid "%s: missing argument: %s\n"
msgstr ""
-#: nih/option.c:664
+#: nih/option.c:660
#, c-format
msgid "%s: illegal argument: %s\n"
msgstr ""
-#: nih/option.c:862
+#: nih/option.c:858
msgid "Usage"
msgstr ""
-#: nih/option.c:866
+#: nih/option.c:862
msgid "[OPTION]..."
msgstr ""
-#: nih/option.c:915
+#: nih/option.c:911
#, c-format
msgid "Report bugs to <%s>\n"
msgstr ""
-#: nih/option.c:941
+#: nih/option.c:937
#, c-format
msgid "%s options:\n"
msgstr ""
-#: nih/option.c:943
+#: nih/option.c:939
#, c-format
msgid "Other options:\n"
msgstr ""
-#: nih/option.c:945
+#: nih/option.c:941
#, c-format
msgid "Options:\n"
msgstr ""
-#: nih/watch.c:521
+#: nih/watch.c:560
msgid "Unable to watch directory"
msgstr ""
@@ -295,79 +295,87 @@ msgstr ""
msgid "Deleting %s job"
msgstr ""
-#: init/control.c:216
+#: init/control.c:225
#, c-format
msgid "Error on control socket: %s"
msgstr ""
-#: init/control.c:336
+#: init/control.c:345
+msgid "Control request to change tty"
+msgstr ""
+
+#: init/control.c:379
+msgid "Control request to revert changed tty"
+msgstr ""
+
+#: init/control.c:413
msgid "Control request for our version"
msgstr ""
-#: init/control.c:369
+#: init/control.c:446
msgid "Control request to change logging priority"
msgstr ""
-#: init/control.c:406
+#: init/control.c:483
#, c-format
msgid "Control request for jobs matching %s"
msgstr ""
-#: init/control.c:408
+#: init/control.c:485
msgid "Control request for all jobs"
msgstr ""
-#: init/control.c:470
+#: init/control.c:547
#, c-format
msgid "Control request for status of %s"
msgstr ""
-#: init/control.c:474
+#: init/control.c:551
#, c-format
msgid "Control request for status of job #%u"
msgstr ""
-#: init/control.c:528
+#: init/control.c:605
#, c-format
msgid "Control request to start %s"
msgstr ""
-#: init/control.c:532
+#: init/control.c:609
#, c-format
msgid "Control request to start job #%u"
msgstr ""
-#: init/control.c:615
+#: init/control.c:692
#, c-format
msgid "Control request to stop %s"
msgstr ""
-#: init/control.c:619
+#: init/control.c:696
#, c-format
msgid "Control request to stop job #%u"
msgstr ""
-#: init/control.c:748
+#: init/control.c:825
#, c-format
msgid "Control request to emit %s event"
msgstr ""
-#: init/control.c:779
+#: init/control.c:856
#, c-format
msgid "Control request to subscribe %d to jobs"
msgstr ""
-#: init/control.c:810
+#: init/control.c:887
#, c-format
msgid "Control request to unsubscribe %d from jobs"
msgstr ""
-#: init/control.c:840
+#: init/control.c:917
#, c-format
msgid "Control request to subscribe %d to events"
msgstr ""
-#: init/control.c:871
+#: init/control.c:948
#, c-format
msgid "Control request to unsubscribe %d from events"
msgstr ""
@@ -472,7 +480,7 @@ msgid ""
"actually run /sbin/telinit."
msgstr ""
-#: init/main.c:136 util/initctl.c:366 compat/sysv/reboot.c:203
+#: init/main.c:136 util/initctl.c:373 compat/sysv/reboot.c:203
#: compat/sysv/shutdown.c:322 compat/sysv/telinit.c:91
msgid "Need to be root"
msgstr ""
@@ -642,6 +650,11 @@ msgstr ""
msgid "%s: missing job name\n"
msgstr ""
+#: util/initctl.c:1889
+#, fuzzy, c-format
+msgid "%s: missing device name\n"
+msgstr ""
+
#: util/initctl.c:1826
#, c-format
msgid "%s: missing event name\n"
@@ -718,11 +731,11 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2119
+#: util/initctl.c:2239
msgid "Stop jobs."
msgstr ""
-#: util/initctl.c:2120
+#: util/initctl.c:2240
msgid ""
"JOB is one or more job names that are to be stopped.\n"
"\n"
@@ -730,11 +743,11 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2126
+#: util/initctl.c:2246
msgid "Query status of jobs."
msgstr ""
-#: util/initctl.c:2127
+#: util/initctl.c:2247
msgid ""
"JOB is one or more job names that are to be queried.\n"
"\n"
@@ -742,19 +755,19 @@ msgid ""
"uniquely identifying a particular instance of a job."
msgstr ""
-#: util/initctl.c:2133
+#: util/initctl.c:2253
msgid "List known jobs."
msgstr ""
-#: util/initctl.c:2137
+#: util/initctl.c:2257
msgid "EVENT [ARG]..."
msgstr ""
-#: util/initctl.c:2138
+#: util/initctl.c:2258
msgid "Emit an event."
msgstr ""
-#: util/initctl.c:2139
+#: util/initctl.c:2259
msgid ""
"EVENT is the name of an event the init daemon should emit, which may have "
"zero or more arguments specified by ARG. These may be matched in the job "
@@ -765,27 +778,35 @@ msgid ""
"taken from the environment or ignored if not present there."
msgstr ""
-#: util/initctl.c:2150
+#: util/initctl.c:2270
msgid "Receive notification of job state changes."
msgstr ""
-#: util/initctl.c:2155
+#: util/initctl.c:2275
msgid "Receive notification of emitted events."
msgstr ""
-#: util/initctl.c:2160
+#: util/initctl.c:2280
+msgid "Change the init daemon's tty device"
+msgstr ""
+
+#: util/initctl.c:2285
+msgid "Revert the last change to the init daemon's tty device"
+msgstr ""
+
+#: util/initctl.c:2290
msgid "Request the version of the init daemon."
msgstr ""
-#: util/initctl.c:2163
+#: util/initctl.c:2293
msgid "PRIORITY"
msgstr ""
-#: util/initctl.c:2164
+#: util/initctl.c:2294
msgid "Change the minimum priority of log messages from the init daemon"
msgstr ""
-#: util/initctl.c:2166
+#: util/initctl.c:2296
msgid ""
"PRIORITY may be one of `debug' (messages useful for debugging upstart are "
"logged, equivalent to --debug on kernel command-line); `info' (messages "
diff -up upstart/message.c.old upstart/message.c
--- upstart/message.c.old 2009-06-22 13:45:48.000000000 +0200
+++ upstart/message.c 2009-06-22 13:45:48.000000000 +0200
@@ -261,6 +261,20 @@ upstart_message_newv (const void
break;
case UPSTART_VERSION_QUERY:
break;
+ case UPSTART_POP_TTY:
+ break;
+ case UPSTART_TTY:
+ if (upstart_push_packv (message, "s", args_copy))
+ goto error;
+
+ break;
+
+ case UPSTART_PUSH_TTY:
+ if (upstart_push_packv (message, "s", args_copy))
+ goto error;
+
+ break;
+
case UPSTART_LOG_PRIORITY:
if (upstart_push_packv (message, "u", args_copy))
goto error;
@@ -550,6 +564,9 @@ upstart_message_handle (const void *
case UPSTART_VERSION_QUERY:
ret = handler (data, cred.pid, type);
break;
+ case UPSTART_POP_TTY:
+ ret = handler (data, cred.pid, type);
+ break;
case UPSTART_LOG_PRIORITY: {
NihLogLevel priority;
@@ -559,6 +576,41 @@ upstart_message_handle (const void *
ret = handler (data, cred.pid, type, priority);
break;
}
+
+ case UPSTART_PUSH_TTY: {
+ char *tty = NULL;
+
+ if (upstart_pop_pack (message, parent, "s", &tty)) {
+ if (tty)
+ nih_free (tty);
+
+ goto invalid;
+ }
+
+ if (! tty)
+ goto invalid;
+
+ ret = handler (data, cred.pid, type, tty);
+ break;
+ }
+
+ case UPSTART_TTY: {
+ char *tty = NULL;
+
+ if (upstart_pop_pack (message, parent, "s", &tty)) {
+ if (tty)
+ nih_free (tty);
+
+ goto invalid;
+ }
+
+ if (! tty)
+ goto invalid;
+
+ ret = handler (data, cred.pid, type, tty);
+ break;
+ }
+
case UPSTART_VERSION: {
char *version = NULL;
diff -up upstart/message.h.old upstart/message.h
--- upstart/message.h.old 2009-06-22 13:45:48.000000000 +0200
+++ upstart/message.h 2009-06-22 13:45:48.000000000 +0200
@@ -57,11 +57,20 @@ typedef enum upstart_message_type {
* UPSTART_VERSION message in reply.
*
* Clients may send UPSTART_LOG_PRIORITY, without any reply.
+ *
+ * Clients may send UPSTART_PUSH_TTY and recieve an UPSTART_TTY message
+ * in reply
+ *
+ * Clients may send UPSTART_POP_TTY and recieve an UPSTART_TTY message
+ * in reply
*/
UPSTART_NO_OP = 0x0000,
UPSTART_VERSION_QUERY = 0x0001,
UPSTART_LOG_PRIORITY = 0x0002,
UPSTART_VERSION = 0x0010,
+ UPSTART_PUSH_TTY = 0x0011,
+ UPSTART_POP_TTY = 0x0012,
+ UPSTART_TTY = 0x0013,
/* Job requests and responses.
*
diff -up util/initctl.c.old util/initctl.c
--- util/initctl.c.old 2009-06-22 13:45:48.000000000 +0200
+++ util/initctl.c 2009-06-22 13:45:48.000000000 +0200
@@ -99,6 +99,9 @@ static void job_info_output (const JobI
static char *output_name (unsigned int id, const char *name);
/* Prototypes of response handler functions */
+static int handle_tty (void *data, pid_t pid,
+ UpstartMessageType type,
+ const char *tty);
static int handle_version (void *data, pid_t pid,
UpstartMessageType type,
const char *version);
@@ -159,6 +162,8 @@ static int handle_unknown_message (void
/* Prototypes for option and command functions */
int env_option (NihOption *option, const char *arg);
+int push_tty_action (NihCommand *command, char * const *args);
+int pop_tty_action (NihCommand *command, char * const *args);
int start_action (NihCommand *command, char * const *args);
int stop_action (NihCommand *command, char * const *args);
int status_action (NihCommand *command, char * const *args);
@@ -296,6 +301,8 @@ static UpstartMessage handlers[] = {
{ -1, UPSTART_VERSION,
(UpstartMessageHandler)handle_version },
+ { -1, UPSTART_TTY,
+ (UpstartMessageHandler)handle_tty },
{ -1, UPSTART_JOB,
(UpstartMessageHandler)handle_job },
{ -1, UPSTART_JOB_FINISHED,
@@ -687,6 +694,40 @@ handle_version (void *data
}
/**
+ * handle_tty:
+ * @data: data passed to handler,
+ * @pid: origin of message,
+ * @type: message type,
+ * @version: tty device in use.
+ *
+ * Handles receipt of the UPSTART_TTY reply from the server, which is
+ * sent in response to an UPSTART_PUSH_TTY or UPSTART_POP_TTY message.
+ *
+ * Output the version string received and mark it as a response.
+ *
+ * Returns: zero on success, negative value on error or positive value if the
+ * command should exit with that exit status.
+ **/
+static int
+handle_tty (void *data,
+ pid_t pid,
+ UpstartMessageType type,
+ const char *tty)
+{
+ nih_assert (pid > 0);
+ nih_assert (type == UPSTART_TTY);
+ nih_assert (tty != NULL);
+
+ if (! event_caused)
+ num_responses++;
+
+ event_caused = FALSE;
+
+ nih_message ("%s", tty);
+
+ return 0;
+}
+/**
* handle_job:
* @data: data passed to handler,
* @pid: origin of message,
@@ -1802,6 +1843,61 @@ list_action (NihCommand *command,
}
/**
+ * pop_tty_action:
+ * @command: NihCommand invoked,
+ * @args: command-line arguments.
+ *
+ * This function is called for the "pop_tty" command; it takes no arguments.
+ *
+ * It reverts the last push_tty command, and replies with the new tty.
+ *
+ * Returns: command exit status.
+ **/
+int
+pop_tty_action (NihCommand *command,
+ char * const *args)
+{
+ nih_assert (command != NULL);
+ nih_assert (args != NULL);
+
+ if (initctl_send (UPSTART_POP_TTY) < 0)
+ return 1;
+
+ return initctl_recv (1);
+}
+
+/**
+ * push_tty_action:
+ * @command: NihCommand invoked,
+ * @args: command-line arguments.
+ *
+ * This function is called for the "push_tty" command; it takes a tty device
+ * name.
+ *
+ * It causes upstart to begin using that tty, and replies with the new tty.
+ *
+ * Returns: command exit status.
+ **/
+int
+push_tty_action (NihCommand *command,
+ char * const *args)
+{
+ nih_assert (command != NULL);
+ nih_assert (args != NULL);
+
+ if (! args[0]) {
+ fprintf (stderr, _("%s: missing device name\n"), program_name);
+ nih_main_suggest_help ();
+ return 1;
+ }
+
+ if (initctl_send (UPSTART_PUSH_TTY, args[0]) < 0)
+ return 1;
+
+ return initctl_recv (1);
+}
+
+/**
* emit_action:
* @command: NihCommand invoked,
* @args: command-line arguments.
@@ -2079,6 +2175,24 @@ NihOption version_options[] = {
};
/**
+ * pop_tty_options:
+ *
+ * Command-line options accepted for the pop_tty command.
+ **/
+NihOption pop_tty_options[] = {
+ NIH_OPTION_LAST
+};
+
+/**
+ * push_tty_options:
+ *
+ * Command-line options accepted for the push_tty command.
+ **/
+NihOption push_tty_options[] = {
+ NIH_OPTION_LAST
+};
+
+/**
* log_priority_options:
*
* Command-line options accepted for the log-priority command.
@@ -2156,6 +2270,16 @@ static NihCommand commands[] = {
NULL,
&event_commands, events_options, events_action },
+ { "push-tty", NULL,
+ N_("Change the init daemon's tty device"),
+ NULL,
+ NULL, push_tty_options, push_tty_action },
+
+ { "pop-tty", NULL,
+ N_("Revert the last change to the init daemon's tty device"),
+ NULL,
+ NULL, pop_tty_options, pop_tty_action },
+
{ "version", NULL,
N_("Request the version of the init daemon."),
NULL,