Author: blues                        Date: Thu Jun 24 11:15:16 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- rel.3 - state_save added as bcond (to be removed soon)

---- Files affected:
packages/upstart:
   upstart.spec (1.54 -> 1.55) , upstart-state_save.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/upstart/upstart.spec
diff -u packages/upstart/upstart.spec:1.54 packages/upstart/upstart.spec:1.55
--- packages/upstart/upstart.spec:1.54  Tue May 11 12:25:40 2010
+++ packages/upstart/upstart.spec       Thu Jun 24 13:15:11 2010
@@ -3,19 +3,22 @@
 # - 4 of 13 tests failed (3 with 'permission denied')
 #
 # Conditional build:
-%bcond_with    tests   # don't perform "make check"
+%bcond_with    statesave       # state-save experimental patch
+%bcond_with    tests           # don't perform "make check"
 
 Summary:       Event-based init daemon
 Summary(pl.UTF-8):     Oparty na zdarzeniach demon init
 Name:          upstart
 Version:       0.6.6
-Release:       2
+Release:       3
 License:       GPL v2
 Group:         Base
 Source0:       http://upstart.ubuntu.com/download/0.6/%{name}-%{version}.tar.gz
 # Source0-md5: 5a2e9962a4cea719fbe07c33e2591b06
 URL:           http://upstart.ubuntu.com/
 Patch0:                pldize.patch
+# 
https://code.launchpad.net/~jajcus-jajcus/upstart/state-save-stable/+merge/27053/+preview-diff/+files/preview.diff
+Patch1:                %{name}-state_save.patch
 Source1:       start-ttys.conf
 Source2:       tty.conf
 Source3:       %{name}.sysconfig
@@ -55,6 +58,7 @@
 %prep
 %setup -q
 %patch0 -p1
+%{?with_statesave:%patch1 -p0}
 cp -a %{SOURCE1} conf
 cp -a %{SOURCE2} conf
 
@@ -130,6 +134,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.55  2010/06/24 11:15:11  blues
+- rel.3 - state_save added as bcond (to be removed soon)
+
 Revision 1.54  2010/05/11 10:25:40  jajcus
 - updated comment about the failed tests
 

================================================================
Index: packages/upstart/upstart-state_save.patch
diff -u /dev/null packages/upstart/upstart-state_save.patch:1.1
--- /dev/null   Thu Jun 24 13:15:16 2010
+++ packages/upstart/upstart-state_save.patch   Thu Jun 24 13:15:11 2010
@@ -0,0 +1,7009 @@
+=== modified file 'configure.ac'
+--- configure.ac       2010-04-27 19:48:44 +0000
++++ configure.ac       2010-06-08 13:33:50 +0000
+@@ -21,6 +21,8 @@
+ # Checks for programs.
+ AC_PROG_CC
+ PKG_PROG_PKG_CONFIG([0.22])
++AM_PROG_LEX
++AC_PROG_YACC
+ 
+ AC_PATH_PROG([NIH_DBUS_TOOL], [nih-dbus-tool])
+ 
+@@ -40,6 +42,7 @@
+ NIH_C_THREAD
+ 
+ # Checks for library functions.
++AC_CHECK_FUNCS([fmemopen])
+ 
+ # Other checks
+ AC_MSG_CHECKING([whether to include sbindir in PATH])
+
+=== modified file 'init/Makefile.am'
+--- init/Makefile.am   2010-02-04 03:42:29 +0000
++++ init/Makefile.am   2010-06-08 13:33:50 +0000
+@@ -48,7 +48,11 @@
+       blocked.c blocked.h \
+       parse_job.c parse_job.h \
+       parse_conf.c parse_conf.h \
++      save_state.c save_state.h \
++      load_state.c load_state.h \
++      state_lexer.l state_parser.y \
+       conf.c conf.h \
++      reexec.c reexec.h \
+       control.c control.h \
+       errors.h
+ nodist_init_SOURCES = \
+@@ -62,6 +66,7 @@
+       $(DBUS_LIBS) \
+       -lrt
+ 
++AM_YFLAGS = -d -v
+ 
+ com_ubuntu_Upstart_OUTPUTS = \
+       com.ubuntu.Upstart.c \
+@@ -113,7 +118,9 @@
+ BUILT_SOURCES = \
+       $(com_ubuntu_Upstart_OUTPUTS) \
+       $(com_ubuntu_Upstart_Job_OUTPUTS) \
+-      $(com_ubuntu_Upstart_Instance_OUTPUTS)
++      $(com_ubuntu_Upstart_Instance_OUTPUTS) \
++      state_lexer.c \
++      state_parser.c state_parser.h 
+ 
+ CLEANFILES = \
+       $(com_ubuntu_Upstart_OUTPUTS) \
+@@ -125,6 +132,9 @@
+ 
+ 
+ TESTS = \
++      test_state_parser \
++      test_save_state \
++      test_load_state \
+       test_system \
+       test_environ \
+       test_process \
+@@ -143,6 +153,36 @@
+ 
+ tests: $(BUILT_SOURCES) $(check_PROGRAMS)
+ 
++test_save_state_SOURCES = tests/test_save_state.c
++test_save_state_LDADD = \
++      system.o environ.o process.o \
++      job_class.o job_process.o job.o event.o event_operator.o blocked.o \
++      parse_job.o parse_conf.o conf.o control.o \
++      com.ubuntu.Upstart.o \
++      com.ubuntu.Upstart.Job.o com.ubuntu.Upstart.Instance.o \
++      save_state.o \
++      $(NIH_LIBS) \
++      $(NIH_DBUS_LIBS) \
++      $(DBUS_LIBS)
++
++test_load_state_SOURCES = tests/test_load_state.c
++test_load_state_LDADD = \
++      system.o environ.o process.o \
++      job_class.o job_process.o job.o event.o event_operator.o blocked.o \
++      parse_job.o parse_conf.o conf.o control.o \
++      com.ubuntu.Upstart.o \
++      com.ubuntu.Upstart.Job.o com.ubuntu.Upstart.Instance.o \
++      load_state.o state_parser.o state_lexer.o \
++      $(NIH_LIBS) \
++      $(NIH_DBUS_LIBS) \
++      $(DBUS_LIBS)
++
++test_state_parser_SOURCES = tests/test_state_parser.c
++test_state_parser_LDADD = \
++      state_parser.o \
++      state_lexer.o \
++      $(NIH_LIBS)
++
+ test_system_SOURCES = tests/test_system.c
+ test_system_LDADD = \
+       system.o \
+
+=== modified file 'init/control.c'
+--- init/control.c     2009-07-11 11:47:12 +0000
++++ init/control.c     2010-06-08 13:33:50 +0000
+@@ -59,6 +59,9 @@
+ static int   control_server_connect (DBusServer *server, DBusConnection 
*conn);
+ static void  control_disconnected   (DBusConnection *conn);
+ static void  control_register_all   (DBusConnection *conn);
++static void  control_unregister_all (DBusConnection *conn);
++DBusHandlerResult control_call_rejecting_filter(DBusConnection *connection,
++                                   DBusMessage *message, void *user_data);
+ 
+ 
+ /**
+@@ -231,7 +234,8 @@
+ 
+               dbus_connection_unref (conn);
+               return -1;
+-      } else if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
++      } else if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
++                      && ret != DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER) {
+               /* Failed to obtain the name (already taken usually) */
+               nih_error_raise (CONTROL_NAME_TAKEN,
+                                _(CONTROL_NAME_TAKEN_STR));
+@@ -267,11 +271,152 @@
+ {
+       nih_assert (control_bus != NULL);
+ 
++      /* Unregister all objects, so control_bus_open() may be called again */
++      control_unregister_all(control_bus);
++
+       dbus_connection_unref (control_bus);
+ 
+       control_disconnected (control_bus);
+ }
+ 
++/**
++ * control_close_all_conns:
++ *
++ * Close all control connections.
++ **/
++void
++control_close_all_conns (void)
++{
++      nih_assert (control_conns != NULL);
++
++      NIH_LIST_FOREACH(control_conns, iter) {
++              NihListEntry *entry = (NihListEntry *)iter;
++              DBusConnection *conn = (DBusConnection *)entry->data;
++              dbus_connection_close(conn);
++      }
++}
++
++typedef struct call_rejection_details {
++      char * error_name;
++      char * message;
++} CallRejectionDetails;
++
++CallRejectionDetails *rejection_details = NULL;
++
++/**
++ * control_reject_calls:
++ *
++ * Add a filter to all connections to reject any incoming method calls.
++ **/
++void 
++control_reject_calls (const char * error_name, const char * message) 
++{
++
++      nih_assert(rejection_details == NULL);
++
++      rejection_details = nih_new(NULL, CallRejectionDetails);
++      if (rejection_details == NULL) {
++              nih_warn(_("Could not set DBus call rejecting filter"));
++              return;
++      }
++      rejection_details->error_name = nih_strdup(rejection_details,
++                                                 error_name);
++      if (rejection_details->error_name == NULL) {
++              nih_warn(_("Could not set DBus call rejecting filter"));
++              nih_free(rejection_details);
++              rejection_details = NULL;
++              return;
++      }
++      rejection_details->message = nih_strdup(rejection_details,
++                                              message);
++      if (rejection_details->message == NULL) {
++              nih_warn(_("Could not set DBus call rejecting filter"));
++              nih_free(rejection_details);
++              rejection_details = NULL;
++              return;
++      }
++
++      if (control_bus) {
++              if (!dbus_connection_add_filter (control_bus,
++                                          control_call_rejecting_filter,
++                                          NULL, NULL)) {
++                      nih_warn(_("Could not set DBus call rejecting filter"));
++              }
++      }
++      NIH_LIST_FOREACH(control_conns, iter) {
++              NihListEntry *entry = (NihListEntry *)iter;
++              DBusConnection *conn = (DBusConnection *)entry->data;
++              if (!dbus_connection_add_filter (conn,
++                                          control_call_rejecting_filter,
++                                          NULL, NULL)) {
++                      nih_warn(_("Could not set DBus call rejecting filter"));
++                      dbus_connection_close(conn);
++              }
++      }
++}
++
++/**
++ * control_unreject_calls:
++ *
++ * Remove the call rejecting filter from all connections.
++ **/
++void 
++control_unreject_calls (void) 
++{
++
++      nih_assert(rejection_details != NULL);
++      if (control_bus) {
++              dbus_connection_remove_filter (control_bus,
++                                          control_call_rejecting_filter,
++                                          NULL);
++      }
++      NIH_LIST_FOREACH(control_conns, iter) {
++              NihListEntry *entry = (NihListEntry *)iter;
++              DBusConnection *conn = (DBusConnection *)entry->data;
++              dbus_connection_remove_filter (conn,
++                                          control_call_rejecting_filter,
++                                          NULL);
++      }
++      nih_discard(rejection_details);
++      rejection_details = NULL;
++}
++
++
++DBusHandlerResult 
++control_call_rejecting_filter(DBusConnection *connection,
++                         DBusMessage *message, void *user_data)
++{
++      DBusMessage *error_message;
++
++      if (rejection_details == NULL) {
++              /* This may happen for the system bus, as libdbus
++               * never really closes it. When rejection_details are NULL
++               * it means the filter is not needed any more.
++               */
++              dbus_connection_remove_filter (connection,
++                                          control_call_rejecting_filter,
++                                          NULL);
++              return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++      }
++              
++      if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
++              return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++      
++      error_message = dbus_message_new_error (message,
++                              rejection_details->error_name,
++                              rejection_details->message);
++
++      if (error_message == NULL)
++              return DBUS_HANDLER_RESULT_NEED_MEMORY;
++
++      if (!dbus_connection_send(connection, error_message, NULL)) {
++              dbus_message_unref (error_message);
++              return DBUS_HANDLER_RESULT_NEED_MEMORY;
++      }
++              
++      dbus_message_unref (error_message);
++      return DBUS_HANDLER_RESULT_HANDLED;     
++}
+ 
+ /**
+  * control_disconnected:
+@@ -333,6 +478,35 @@
+       }
+ }
+ 
++/**
++ * control_unregister_all:
++ * @conn: connection to unregister objects for.
++ *
++ * Unregisters the manager object and objects for all jobs and instances on
++ * the given connection.
++ **/
++static void
++control_unregister_all (DBusConnection *conn)
++{
++      nih_assert (conn != NULL);
++
++      job_class_init ();
++
++      /* Unregister the control object */
++      NIH_MUST(dbus_connection_unregister_object_path (control_bus,
++                                                       DBUS_PATH_UPSTART));
++
++      /* Unregister objects for each currently registered job and its
++       * instances.
++       */
++      NIH_HASH_FOREACH (job_classes, iter) {
++              JobClass *class = (JobClass *)iter;
++
++              job_class_unregister (class, conn, FALSE);
++      }
++}
++
++
+ 
+ /**
+  * control_reload_configuration:
+
+=== modified file 'init/control.h'
+--- init/control.h     2009-07-09 08:36:52 +0000
++++ init/control.h     2010-06-08 13:33:50 +0000
+@@ -46,6 +46,10 @@
+       __attribute__ ((warn_unused_result));
+ void control_bus_close            (void);
+ 
++void control_close_all_conns    (void);
++void control_reject_calls       (const char * error_name, const char * 
message);
++void control_unreject_calls     (void);
++
+ int  control_reload_configuration (void *data, NihDBusMessage *message)
+       __attribute__ ((warn_unused_result));
+ 
+
+=== modified file 'init/errors.h'
+--- init/errors.h      2009-06-23 09:29:35 +0000
++++ init/errors.h      2010-06-08 13:33:50 +0000
+@@ -48,6 +48,15 @@
+       PARSE_EXPECTED_OPERATOR,
+       PARSE_EXPECTED_VARIABLE,
+       PARSE_MISMATCHED_PARENS,
++      
++      /* Errors while parsing saved state */
++      STATE_PARSE_ERROR,
++
++      /* Errors while loading saved state */
++      LOAD_VALUE_MISSING,
++      LOAD_TYPE_MISMATCH,
++      LOAD_UNRECOGNIZED_VALUE,
++      LOAD_BAD_FORMAT_VERSION,
+ 
+       /* Errors while handling control requests */
+       CONTROL_NAME_TAKEN,
+@@ -68,6 +77,11 @@
+ #define PARSE_EXPECTED_OPERATOR_STR   N_("Expected operator")
+ #define PARSE_EXPECTED_VARIABLE_STR   N_("Expected variable name before 
value")
+ #define PARSE_MISMATCHED_PARENS_STR   N_("Mismatched parentheses")
++#define STATE_PARSE_ERROR_STR         N_("Saved state parse error")
+ #define CONTROL_NAME_TAKEN_STR                N_("Name already taken")
++#define       LOAD_VALUE_MISSING_STR          N_("Value missing")
++#define LOAD_TYPE_MISMATCH_STR                N_("Bad type for a field value")
++#define LOAD_UNRECOGNIZED_VALUE_STR   N_("Unrecognized value")
++#define LOAD_BAD_FORMAT_VERSION_STR   N_("Bad format version")
+ 
+ #endif /* INIT_ERRORS_H */
+
+=== modified file 'init/event.c'
+--- init/event.c       2009-07-02 17:31:25 +0000
++++ init/event.c       2010-06-08 13:33:50 +0000
+@@ -60,6 +60,12 @@
+  **/
+ NihList *events = NULL;
+ 
++/**
++ * event_poll_main_func:
++ *
++ * event_poll() callback registered in the NIH main loop.
++ **/
++static NihMainLoopFunc * event_poll_main_func = NULL;
+ 
+ /**
+  * event_init:
+@@ -190,7 +196,6 @@
+       event->blockers--;
+ }
+ 
+-
+ /**
+  * event_poll:
+  *
+@@ -252,6 +257,37 @@
+       } while (poll_again);
+ }
+ 
++/**
++ * event_register_poll:
++ *
++ * Register event_poll as NIH main loop callback function. Store the 
registered
++ * function information, so it can be removed from main loop when neccessary
++ * (like on re-exec).
++ **/
++void
++event_register_poll (void) {
++      
++      /* Process the event queue each time through the main loop */
++      event_poll_main_func = NIH_MUST (
++                      nih_main_loop_add_func (NULL, (NihMainLoopCb)event_poll,
++                                              NULL));
++}
++
++/**
++ * event_unregister_poll:
++ *
++ * Remove event_poll() callback from the NIH main loop. Used during the 
re-exec
++ * procedure to defer event handling to the new init incarnation.
++ **/
++void
++event_unregister_poll (void) {
++
++      if (event_poll_main_func == NULL)
++              return;
++
++      nih_free(event_poll_main_func);
++      event_poll_main_func = NULL;
++}
+ 
+ /**
+  * event_pending:
+
+=== modified file 'init/event.h'
+--- init/event.h       2009-07-09 08:36:52 +0000
++++ init/event.h       2010-06-08 13:33:50 +0000
+@@ -87,6 +87,8 @@
+ void   event_unblock (Event *event);
+ 
+ void   event_poll    (void);
++void   event_register_poll (void);
++void   event_unregister_poll (void);
+ 
+ NIH_END_EXTERN
+ 
+
+=== modified file 'init/job.c'
+--- init/job.c 2009-07-21 11:27:55 +0000
++++ init/job.c 2010-06-08 13:33:50 +0000
+@@ -184,6 +184,32 @@
+                                                        job->path));
+ }
+ 
++/**
++ * job_unregister:
++ * @job: job to unregister,
++ * @conn: connection to unregister for,
++ * @signal: emit the InstanceRemoved signal.
++ *
++ * Unregister the @job instance from the D-Bus connection @conn, using
++ * the path set when the job was created.
++ **/
++void
++job_unregister (Job            *job,
++            DBusConnection *conn,
++            int            signal)
++{
++      nih_assert (job != NULL);
++      nih_assert (conn != NULL);
++
++      NIH_MUST (dbus_connection_unregister_object_path (conn, job->path));
++
++      nih_debug ("Unregistered instance %s", job->path);
++      if (signal)
++              NIH_ZERO (job_class_emit_instance_removed (conn,
++                                                         job->class->path,
++                                                         job->path));
++}
++
+ 
+ /**
+  * job_change_goal:
+
+=== modified file 'init/job.h'
+--- init/job.h 2009-07-03 16:38:02 +0000
++++ init/job.h 2010-06-08 13:33:50 +0000
+@@ -158,7 +158,7 @@
+ Job *       job_new             (JobClass *class, const char *name)
+       __attribute__ ((warn_unused_result, malloc));
+ void        job_register        (Job *job, DBusConnection *conn, int signal);
+-
++void      job_unregister      (Job *job, DBusConnection *conn, int signal);
+ void        job_change_goal     (Job *job, JobGoal goal);
+ 
+ void        job_change_state    (Job *job, JobState state);
+
+=== modified file 'init/job_class.c'
+--- init/job_class.c   2009-07-09 11:50:19 +0000
++++ init/job_class.c   2010-06-08 13:33:50 +0000
+@@ -355,7 +355,7 @@
+               NihListEntry   *entry = (NihListEntry *)iter;
+               DBusConnection *conn = (DBusConnection *)entry->data;
+ 
+-              job_class_unregister (class, conn);
++              job_class_unregister (class, conn, TRUE);
+       }
+ 
+       return TRUE;
+@@ -401,25 +401,31 @@
+  * job_class_unregister:
+  * @class: class to unregistered,
+  * @conn: connection to unregister from.
++ * @signal: emit the JobRemoved signal
+  *
+  * Unregister the job @class from the D-Bus connection @conn, which must
+  * have already been registered with job_class_register().
+  **/
+ void
+ job_class_unregister (JobClass       *class,
+-                    DBusConnection *conn)
++                    DBusConnection *conn,
++                    int            signal)
+ {
+       nih_assert (class != NULL);
+       nih_assert (conn != NULL);
+-      NIH_HASH_FOREACH (class->instances, iter)
+-              nih_assert_not_reached ();
++      NIH_HASH_FOREACH (class->instances, iter) {
++              Job *job = (Job *)iter;
++
++              job_unregister(job, conn, signal);
++      }
+ 
+       NIH_MUST (dbus_connection_unregister_object_path (conn, class->path));
+ 
+       nih_debug ("Unregistered job %s", class->path);
+ 
+-      NIH_ZERO (control_emit_job_removed (conn, DBUS_PATH_UPSTART,
+-                                          class->path));
++      if (signal)
++              NIH_ZERO (control_emit_job_removed (conn, DBUS_PATH_UPSTART,
++                                                  class->path));
+ }
+ 
+ 
+
+=== modified file 'init/job_class.h'
+--- init/job_class.h   2009-07-09 11:01:53 +0000
++++ init/job_class.h   2010-06-08 13:33:50 +0000
+@@ -167,7 +167,7 @@
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/upstart/upstart.spec?r1=1.54&r2=1.55&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to