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
