upstart 0.3.2 "Could anybody have tampered with your luggage?"

The entire code has received a thorough review and clean-up in preparation for the merging of the planned new features for the 0.3 milestone.

Milestone information

Project:
upstart
Series:
0.3
Version:
0.3.2
Code name:
Could anybody have tampered with your luggage?
Released:
 
Registrant:
Scott James Remnant (Canonical)
Release registered:
Active:
No. Drivers cannot target bugs and blueprints to this milestone.  

Download RDF metadata

Activities

Assigned to you:
No blueprints or bugs assigned to you.
Assignees:
No users assigned to blueprints and bugs.
Blueprints:
No blueprints are targeted to this milestone.
Bugs:
No bugs are targeted to this milestone.

Download files for this release

After you've downloaded a file, you can verify its authenticity using its MD5 sum or signature. (How do I verify a download?)

File Description Downloads
download icon upstart-0.3.2.tar.gz (md5) 11
last downloaded 39 weeks ago
download icon upstart-0.3.2.tar.bz2 (md5) Upstart 0.3.2 11
last downloaded 40 weeks ago
Total downloads: 22

Release notes 

* Fix leak of inotify file descriptor that could allow any process on the system to remove upstart's watch on its configuration directory.

* New "emits" configuration stanza, used to list events that are emitted by the job itself. Intended for use by front-ends to draw event graphs and the like.

* Dropped "depends" configuration stanza and all related code. This will be replaced by the complex state mechanism.

* Rewritten IPC code to be significantly simpler, with the goal of having a stable interface once we hit the end of this milestone series.

* Rewritten configuration parser and inotify watch infrastructure to be more maintainable in future.

* Now supports systems where inotify is disabled.

* Duplicate configuration stanzas are no longer permitted.

* Bug fixes, especially concerning malloc failure

Changelog 

View the full changelog

2007-02-05 Scott James Remnant <email address hidden>

 * NEWS: Update.

 * init/process.c (process_spawn): Exit with 255 so we don't clash
 with anything that uses 1 as a normal exit code. Note why we only
 close 0..2 (everything else is FD_CLOEXEC).
 * init/cfgfile.c (cfg_watch_dir): Mark the inotify watch descriptor
 as FD_CLOEXEC.
 * init/control.c (control_open): nih_io_set_cloexec can only ever
 return EINVAL, so no point checking it.

2007-02-04 Scott James Remnant <email address hidden>

 * init/tests/test_control.c: Remove strange old code.

2007-02-03 Scott James Remnant <email address hidden>

 * init/control.c (control_open_sock, control_reopen)
 (control_close_handler): Drop these functions; unconnected datagram
 sockets don't close -- so why try dealing with it?
 (control_error_handler): Don't reopen the socket on error, just log
 it -- the socket should be fine, there's no remote end to be lost,
 after all.
 * init/tests/test_control.c (test_close_handler): Drop.
 (test_error_handler): Drop the reopen tests.

 * init/tests/test_job.c (test_run_script): Control socket doesn't
 get unexpectedly opened anymore; so no need to close it.

 * init/control.c (control_open): Remove the strange behaviour that
 this can be called to get the socket. Instead make control_io
 global; we're all adults after all.
 * init/tests/test_control.c (test_open): Remove the test for the
 silly behaviour.
 * init/notify.c (notify_job, notify_event): Use the control_io
 pointer directly, and just do nothing if we lost it somehow.

 * init/main.c (main): Being unable tp open the control socket, or
 parse the configuration, should be a fatal error; stop being so
 damned liberal! <g> Don't reset the signal state if we're
 being restarted, as this loses any pending signals -- be happy
 that our parent left them in a good state. Set SIGCHLD to the
 standard handler, otherwise we might lose this before we start
 the main loop (which does the same anyway).
 (term_handler): Rework so we don't need to close and open the
 control socket; instead we just close it in the child that's
 going to send the state, and notify the parent that it's safe to
 exec (which will cause it to be closed so the new init can open it).

 * init/tests/test_control.c (test_open): Fix valgrind error
 * init/tests/test_notify.c (test_subscribe): Fix valgrind error

 * init/notify.c (notify_subscribe): Make safe against ENOMEM.
 * init/tests/test_notify.c (test_subscribe): Use TEST_ALLOC_FAIL

 * init/control.c: Add needed attributes; tidy up formatting.
 (control_open): Don't let ENOMEM fail opening the control socket.
 * init/control.h: Add needed attributes.
 * init/tests/test_control.c (test_open): Test for failed allocation.
 * init/main.c (term_handler): Make sure we catch failure to open
 the control socket again.

 * TODO: Update

 * init/cfgfile.c (cfg_watch_dir): Clean this up a bit; now we only
 output a warning if inotify failed for any reason other than not
 being supported AND walking worked.

 * init/cfgfile.c (cfg_watch_dir): Update to even newer watch API;
 our create_handler is now always called if inotify is successful,
 so we just need to fall back to walking the directory when it
 isn't -- if inotify isn't supported, don't even bother complaining.
 (cfg_create_modify_handler): Check the stat of the file visited to
 make sure it's a regular file.
 (cfg_visitor): Check the stat of the file visited to make sure it's
 a regular file.

 * init/cfgfile.c: Update include to upstart/enum.h
 * init/job.c: Update include to upstart/enum.h
 * init/job.h: Update include to upstart/enum.h

 * logd/main.c: Add attribute to open_logging

 * util/initctl.c: Split out the command functions into new files;
 * util/jobs.c: This gets the job-related commands
 * util/events.h: This gets the event-related commands
 * util/initctl.h, util/jobs.h, util/events.h: Headers
 * util/tests/test_jobs.c: Test suite for job-related commands.
 * util/tests/test_events.c: Test suite for event-related commands.
 * util/Makefile.am (initctl_SOURCES): Add new files.
 (TESTS): Build new test suites.
 (test_jobs_SOURCES, test_jobs_LDFLAGS, test_jobs_LDADD):
 Details for job-related commands test suite binary.
 (test_events_SOURCES, test_events_LDFLAGS, test_events_LDADD):
 Details for event-related commands test suite binary.
 * TODO: Remove item about splitting initctl now we've done it.

 * TODO: Big update; strip anything we have a spec for.

 * upstart/message.c (upstart_message_handle): Make sure that if we
 fail to parse a message, we don't leave strings around in memory.
 * upstart/tests/test_message.c (test_open): Check that we get a
 raised EADDRINUSE if we try an open a socket twice.
 (test_handle): Add lots of checks for things like NULL names and
 incomplete messages; as well as the obvious unknown message.
 (test_reader): Make sure that errors while handling messages are
 dealt with by logging it.

 * upstart/job.c, upstart/job.h, upstart/tests/test_job.c: Rename to
 enum.c, enum.h and tests/test_enum.c; since this just includes enums
 and convert functions really.
 * upstart/Makefile.am: Update.
 * upstart/libupstart.h: Update include.
 * upstart/tests/test_message.c: Update include.

2007-02-01 Scott James Remnant <email address hidden>

 * logd/main.c (main): Ensure we error if daemonise fails.

 * compat/sysv/shutdown.c (main): Ensure that signals and timers
 are added, even if we run out of memory.

 * upstart/tests/test_message.c: Change from assert to assert0
 * upstart/tests/test_wire.c: Change from assert to assert0
 * init/tests/test_notify.c: Change from assert to assert0
 * init/tests/test_control.c: nih_io_message_send should always return
 a value greater than zero.

 * upstart/tests/test_wire.c: Change to use assert instead of NIH_ZERO;
 the rationale here is that in test cases we just want to fail, not
 try again repeatedly.
 * upstart/tests/test_message.c: Likewise.

 * init/tests/test_control.c: Use assert to ensure we get the expected
 return values of functions that raise errors.
 * init/tests/test_notify.c: Use assert to ensure we get the expected
 return values of functions that raise errors.

 * init/cfgfile.c (cfg_watch_dir): Port to the new NihWatch API and
 use nih_dir_walk(). This also fixes the long-standing bug where we
 wouldn't watch the configuration directory if inotify was disabled.
 Drop both the parent and prefix members for now, until we clean this
 up later.
 (cfg_create_modify_handler): Wrap cfg_read_job after figuring out
 the job name.
 (cfg_job_name): Function to figure out the job name from a path.
 (cfg_visitor): Visitor function to handle initial parsing, figuring
 out the job name; otherwise identical to the standard handler.
 * init/cfgfile.h: Update prototype for cfg_watch_dir.
 * init/main.c (main): Update call to cfg_watch_dir.

2007-01-31 Scott James Remnant <email address hidden>

 * upstart/tests/test_message.c: Use TEST_ALLOC_FAIL to make sure
 allocations are handled properly.

2007-01-30 Scott James Remnant <email address hidden>

 * upstart/wire.c: Note that if any of the push functions fail, the
 entire buffer should be discarded.
 * upstart/tests/test_wire.c (test_push_int, test_push_unsigned)
 (test_push_string, test_push_header, test_push_pack): Us
 TEST_ALLOC_FAIL to ensure that failing to allocate memory is caught.

 * upstart/tests/test_message.c (my_handler): Free the name and
 description after checking; they aren't otherwise.

 * upstart/wire.c (upstart_push_packv, upstart_pop_packv): Consume
 a copy of the va_list, so these can be called multiple times on the
 same list without ill effect.

 * upstart/message.h: Add warn_unused_result attributes to
 upstart_message_handle and upstart_message_handle_using as they raise
 errors.

 * upstart/wire.c: push functions return negative values to indicate
 insufficient memory.
 * upstart/wire.h: Add warn_unused_result attributes to push functions

 * upstart/tests/test_message.c: Guard calls to nih_io_buffer_push and
 nih_io_message_add_control with NIH_ZERO to ensure they succeed.
 * upstart/tests/test_wire.c: Guard calls to nih_io_buffer_push

 * HACKING: Update from libnih with new Documentation,
 Function Attributes and Test Cases sections.

2007-01-10 Scott James Remnant <email address hidden>

 * init/main.c (crash_handler): s/SEGV/SIGSEGV/

 * init/main.c (main): Rename variable

 * TODO: Update.

 * init/main.c (main): Change the way we clear the arguments; by
 deleting just the final NULL terminator, we fool the kernel into
 only returning one argument in cmdline.

 * init/main.c (segv_handler): Rename to crash_handler and handle
 SIGABRT as well, so we can catch assertion errors. Of course, in
 theory, with our high test converage this should never happen in
 practice <chortle>

2007-01-09 Scott James Remnant <email address hidden>

 * init/main.c (main): Clear arguments so that upstart only ever
 appears as /sbin/init in ps, top, etc.

 * TODO: Update.

 * util/initctl.c: Add data pointer to functions and handle calls.

 * init/control.c: Add data pointer to all functions.
 * init/tests/test_control.c: Pass data pointer to
 upstart_message_handle_using()
 * init/tests/test_notify.c: Pass data pointer to
 upstart_message_handle_using()

 * upstart/message.c (upstart_message_handle)
 (upstart_message_handle_using): Add a data pointer argument to these
 functions and pass it to the handler.
 (upstart_message_reader): Pass the io structure's data pointer.
 * upstart/message.h (UpstartMessageHandler): Add a data pointer to
 the message handler.
 * upstart/tests/test_message.c (test_handle, test_handle_using):
 Pass a data pointer to the function call and check it's passed
 to the handler correctly.
 (test_reader): Check that the io data pointer gets passed.

 * init/tests/test_cfgfile.c (test_stanza_console, test_stanza_env)
 (test_stanza_umask, test_stanza_nice, test_stanza_limit): Finish off
 the newer style test cases.

 * init/cfgfile.c (cfg_stanza_console, cfg_stanza_umask)
 (cfg_stanza_nice, cfg_stanza_limit, cfg_stanza_chroot)
 (cfg_stanza_chdir): Guard against duplicate uses of the stanzas.
 * init/tests/test_cfgfile.c (test_stanza_daemon)
 (test_stanza_respawn): Check that neither daemon or respawn override
 exec if they have no arguments.
 (test_stanza_script): Add missing function
 (test_stanza_chroot, test_stanza_chdir): Add tests for these simple
 stanzas.

 * init/cfgfile.c: Change remaining uses of nih_error_raise and
 return to just nih_return_error.

 * init/cfgfile.c (cfg_stanza_exec, cfg_stanza_daemon)
 (cfg_stanza_respawn, cfg_stanza_script): Disallow duplicates,
 both of command strings, scripts, limits and of just the flags.
 * init/tests/test_cfgfile.c (test_stanza_exec)
 (test_stanza_daemon, test_stanza_respawn, test_stanza_instance):
 Check the behaviour of these stanzas.

 * init/cfgfile.c (cfg_stanza_start, cfg_stanza_stop): Disallow
 duplicate values for the script.
 * init/tests/test_cfgfile.c (test_stanza_start, test_stanza_stop):
 Test cases for those two functions.

 * init/cfgfile.c (cfg_stanza_description, cfg_stanza_author)
 (cfg_stanza_version): Don't allow stanza to be duplicated anymore.
 * init/tests/test_cfgfile.c (test_stanza_description)
 (test_stanza_author, test_stanza_version): Test cases for these
 simple stanza; making sure duplication is not permitted.
 (test_stanza_on): Add a test case for this stanza too.

 * init/cfgfile.c (cfg_stanza_kill): Guard against duplicate uses
 of the kill timeout stanza.
 * init/tests/test_cfgfile.c (test_stanza_kill): Test the complex
 kill stanza.
 (test_stanza_pid): Check duplicate usage results in an error.

 * init/job.h (Job): Rename pidfile to pid_file and binary to pid_binary
 * init/job.c (job_new): Update names here too.
 * init/errors.h: Add a new "duplicate value" error.
 * init/cfgfile.c (cfg_read_job): Change name of variables, and catch
 the duplicate value error to add the line number.
 (cfg_stanza_pid): Change variable names, and clean this function up
 a little. Make it an error to use a stanza more than once.
 * init/tests/test_cfgfile.c (test_stanza_pid): Write a newer test
 case function for the pid stanza.

 * init/cfgfile.c (cfg_stanza_normalexit): Use do/while instead of
 while, that we don't have to test has_token first as next_arg does
 that for us.

 * init/cfgfile.c (cfg_stanza_normalexit): Change to peek at the next
 token to see whether it's missing or not, and then just fetch each
 next argument at a time. This is more efficient than parsing them
 all in one go, and also means we can report the error in the right
 place!
 * init/tests/test_cfgfile.c (test_stanza_normalexit): Since we've
 changed the function that parses the stanza, add a proper test case
 function for it, covering all the behaviours.

 * init/job.c (job_new): Initialise the emits member to an empty list.
 * init/job.h (Job): Add the emits member as a list.
 * init/tests/test_job.c (test_new): Check the emits list starts off
 empty.
 * init/tests/test_cfgfile.c (test_stanza_emits): Test the new emits
 stanza; this function will also serve as a prototype for cleaning up
 the config tests.

 * init/cfgfile.c (cfg_stanza_emits): Add function to parse the new
 emits stanza.

 * init/cfgfile.c (cfg_stanza_depends): Remove the depends stanza
 from the configuration file. Dependency support has never been used,
 and is to be replaced by a more flexible event/state configuration
 and blocking on the starting/stopping events.
 * init/tests/test_cfgfile.c: Remove references and tests for the
 depends stanza.
 * init/job.h: Remove the depends list from the job structure.
 * init/job.c (job_new): No depends list to initialise.
 (job_change_state): No dependencies to release
 (job_start): No dependencies to iterate; this removes a particularly
 hairy and complex interaction between state changes. Remove the
 dependency event.
 (job_release_depends): Drop this function.
 * init/tests/test_job.c (test_start, test_stop): Massively simplify
 these tests cases now we don't have dependencies to worry about.
 (test_release_depends): Drop tests

2007-01-08 Scott James Remnant <email address hidden>

 * init/cfgfile.c: Rewrite using the nih_config API, rather than one
 huge function we now just have seperate handler functions for each
 stanza. We can also use more fine-grained parsing than slurping
 all args in and counting them.
 (cfg_read_job): Catch exceptions from the configuration parser and
 add the line number where the problem occurred to an output message.
 Parser errors are now fatal, and not ignored.
 * init/errors.h: Add a file containing errors raised within the init
 daemon codebase.
 * init/Makefile.am (init_SOURCES): Build with errors.h
 * init/tests/test_cfgfile.c: Update test cases now we don't expect
 a job to be returned if there's a parser error.

 * TODO: Update

2007-01-06 Scott James Remnant <email address hidden>

 * logd/main.c (logging_reader): Fix inadvertent shadowing of the
 len parameter.

 * compat/sysv/telinit.c: Oops, nearly forgot to port this to send
 the messages in the new way.
 * compat/sysv/shutdown.c (shutdown_now): Likewise, port this too.

 * TODO: Update.

 * util/initctl.c (handle_job_status): Output the process argument,
 not the pid argument which contains the origin of the message.

 * upstart/message.c (upstart_message_handle): Raise a new unknown
 message error if we don't have a handler and a new illegal message
 error if the source is illegal.
 * upstart/tests/test_message.c (test_handle): Adjust tests to check
 for the new errors that we raise.
 * upstart/errors.h: Define strings for new errors.

 * util/initctl.c: Yet another makeover for this little program,
 port it to the new message/control framework using handler functions
 and NihIoMessage. This starts to make each action function look
 very similar, so there's method to this madness.

2007-01-05 Scott James Remnant <email address hidden>

 * logd/main.c (main): Make sure that we add the SIGTERM handler.

 * init/tests/test_job.c (test_run_script): This test case relies
 on there only being one file descriptor watch, which won't be true
 if the control socket has been opened because there's a message to
 go out. Make sure it's closed first.

 * init/init.supp: Update supressions file now that control_init
 has been renamed to notify_init

 * init/Makefile.am: Include notify.o from all tests.
 * init/job.c (job_change_state, job_kill_process, job_start)
 (job_stop): Use the new notify_job function name.
 * init/event.c (event_queue_run): Use the new notify_event function
 name.

 * init/control.c (control_error_handler): Handle ECONNREFUSED now
 that the process id is available to us.
 * init/tests/test_control.c (test_error_handler): Make sure children
 going away is handled properly.

 * upstart/message.c (upstart_message_new): Store the process id in
 the int_data message field.
 * upstart/tests/test_message.c (test_new): Check the int_data field
 is filled in.

 * init/main.c (main): Guard against various things returning an error
 that we weren't catching.

 * init/tests/test_notify.c: Whitespace fix.

 * init/control.c (control_watch_jobs, control_unwatch_jobs)
 (control_watch_events, control_unwatch_events): Restore functionality
 to subscribe and unsubscribe from job and event notifications.
 * init/tests/test_control.c (test_watch_jobs, test_unwatch_jobs)
 (test_watch_events, test_unwatch_events): Check that the subscription
 and unsubscription messages work.
 * init/Makefile.am (test_control_LDADD): Link to notify.o

 * init/control.c: Drop unused include of upstart/errors.h

 * init/notify.c: Move functions that handle subscription and
 notification from control.c. Other than changing the names, we're
 keeping the API the same for now; expect it to change later when we
 add the ability to subscribe to individual jobs or events.
 (notify_init): initialise the subscriptions list; we don't have a
 separate send queue now that the control I/O is always asynchronous.
 * init/notify.h: Moved notification enum, structure and prototypes
 from control.h, changing the names so they match notify_* in the
 process.
 * init/Makefile.am (init_SOURCES): Build and link notify.c using
 notify.h
 (TESTS): Build the notify test suite binary.
 (test_notify_SOURCES, test_notify_LDFLAGS, test_notify_LDADD): Details
 for notify test suite binary.
 * init/tests/test_notify.c: Rewrite test cases in the manner of
 test_control.c so that we have one function for notify_job and
 one for notify_event, each of which contains the child process that
 receives the notification,

 * init/control.c (control_open): Allow this to be called to obtain
 the control socket, which means we can make it static.
 * init/tests/test_control.c (test_open): Check that it works.

 * init/control.c, init/control.h, init/tests/test_control.c: Move
 functions that handle subscription and notification to new notify.c
 (control_init): Drop completely, no need to maintain a send queue now
 (control_open): Change to return an NihIo that uses the default
 control watcher, and our error handler. Split socket opening into
 (control_open_sock): which can be called from other functions.
 (control_close): Use nih_io_close() to close the socket and free the
 structure in one go.
 (control_reopen): Close the open control socket and open it again
 without destroying the NihIo structure, its queues or state.
 (control_close_handler): Handle the control socket going away
 (control_error_handler): Handle errors on the control socket,
 including the connection refused error that indicates a client went
 away.
 (control_handle): Split this into a miriad of small functions with
 a table to link them to the message type; this will make expanding
 each message handler much easier in future.
 * init/control.h: Update.
 * init/tests/test_control.c: Rewrite test cases to check the new
 handler functions; as a side-effect, this gets rid of the evil giant
 child/parent functions in favour of one test function per handler
 function.

 * upstart/message.c (upstart_message_handle_using): Wrapper function
 around upstart_message_handle that ensures all messages as passed to
 a single function.
 * upstart/message.h: Update.
 * upstart/tests/test_message.c (test_handle_using): Make sure it
 calls the single function.

2007-01-04 Scott James Remnant <email address hidden>

 * upstart/message.c (upstart_message_reader): Handle any errors
 that occurred while handling the message.

2007-01-02 Scott James Remnant <email address hidden>

 * upstart/message.c (upstart_message_handle): Check that the name
 argument is never NULL.
 (upstart_message_reader): Simple message reader function that can
 be associated with an I/O watch and handles each message received.
 * upstart/message.h: Add prototype.
 * upstart/tests/test_message.c (test_reader): Test the reader function.

 * upstart/control.c: Rename to upstart/message.c
 * upstart/control.h: Rename to upstart/message.h
 * upstart/tests/test_control.c: Rename to upstart/tests/test_message.c
 * upstart/libupstart.h: Update includes.
 * upstart/wire.c: Include message.h
 * upstart/wire.h: Update includes.
 * upstart/tests/test_wire.c: Update includes.
 * upstart/errors.h: Rename UPSTART_INVALID_MESSAGE to
 UPSTART_MESSAGE_INVALID so that it's prefixed.
 * upstart/Makefile.am (libupstart_la_SOURCES)
 (upstartinclude_HEADERS, TESTS): Update filenames.

 * upstart/control.c (upstart_message_new): New function that
 creates an NihIoMessage directly from its arguments, which are a type
 followed by a variable number of args depending on that type.
 (upstart_message_handler): Function to find a handler function for
 a particular message type and origin process.
 (upstart_message_handle): New function that takes an NihIoMessage
 and invokes a handler function with a variable number of args
 depending on the message type.
 (upstart_send_msg, upstart_send_msg_to, upstart_recv_msg): Drop these
 functions, leave it up to the caller to decide whether to send and
 receive the messages synchronously or asynchronously; now that the
 capability is in nih_io_*.
 * upstart/control.h (UpstartMsgType): Rename to UpstartMessageType.
 (UpstartMessageHandler): Function with variable number of arguments
 that handles a message received.
 (UpstartMsg): Drop this structure entirely, we'll encode or decode
 the wire format directly from or into a function call, rather than
 use an intermediate structure to marshal it.
 (UpstartMessage): New structure to make a table that can be passed
 to upstart_message_handle to determine which handler should be called.
 * upstart/tests/test_control.c: Test new behaviour.
 * upstart/wire.c (upstart_push_header, upstart_pop_header): Change
 structure name for type parameter.
 * upstart/wire.h: Update.
 * upstart/tests/test_wire.c: Update.

 * configure.ac (AC_COPYRIGHT): Update copyright to 2007.

2006-12-29 Scott James Remnant <email address hidden>

 * upstart/wire.c (upstart_write_int, upstart_write_unsigned)
 (upstart_write_string, upstart_write_header, upstart_write_packv)
 (upstart_write_pack): Rename to *_push_*
 (upstart_read_int, upstart_read_unsigned, upstart_read_string)
 (upstart_read_header, upstart_read_packv, upstart_read_pack): Rename
 to *_pop_*.
 All of the above modified to modify an NihIoMessage structure,
 instead of trying to carry around buffers ourself.
 * upstart/wire.h: Update to match above.
 * upstart/tests/test_wire.c: Update all tests to match the above
 changes.

2006-12-21 Scott James Remnant <email address hidden>

 * upstart/wire.c (upstart_read_packv, upstart_write_packv): Change
 nih_assert_notreached to nih_assert_not_reached.

 * init/job.c (job_run_script): Open the NihIo structure in stream mode.
 * logd/main.c (logging_watcher): Open the NihIo structure in
 stream mode.
 (logging_reader): Need to pass the length of the size_t as a pointer
 so that it can be modified if less is read.

2006-12-17 Scott James Remnant <email address hidden>

 * upstart/wire.c (upstart_write_packv, upstart_write_pack)
 (upstart_read_packv, upstart_read_pack): Functions to write a pack
 of different variables to the stream, or read them from it
 * upstart/wire.h: Add prototypes.
 * upstart/tests/test_wire.c (test_write_pack, test_read_pack):
 Check we can read and write a pack of variables at once.

 * upstart/wire.c (upstart_write_header, upstart_read_header): Drop
 the version from the header, we'll just keep the protocol always
 backwards compatible.
 * upstart/wire.h: Update.
 * upstart/tests/test_wire.c (test_write_header, test_read_header):
 Check that everything works.

 * upstart/wire.c (upstart_write_string, upstart_read_string):
 Transmit the length as an unsigned, and use 0xffffffff to mean NULL
 instead of zero so we can still transmit the empty string.
 * upstart/wire.h: Update.
 * upstart/tests/test_wire.c (test_write_string, test_read_string):
 Tests for the functions to make sure the wire is at it should be.

 * upstart/wire.c (upstart_read_str, upstart_write_str): Rename to
 upstart_read_string and upstart_write_string.
 * upstart/wire.h: Update.

 * upstart/wire.c (upstart_write_unsigned, upstart_read_unsigned):
 Functions to send unsigned values over the wire, which we'll use
 to get a bit extra for the string lengths.
 * upstart/wire.h: Update.
 * upstart/tests/test_wire.c (test_write_unsigned)
 (test_read_unsigned): Test the new functions.

 * upstart/wire.c (upstart_write_ints, upstart_read_ints): Drop
 these functions, we'll go with something far more generic and
 useful.
 * upstart/wire.h: Remove prototypes.

 * upstart/wire.c (upstart_write_int, upstart_read_int): Transmit
 integers as signed 32-bit values in network byte order.
 * upstart/tests/test_wire.c (test_write_int, test_read_int): Test
 the functions to make sure the wire is at it should be,

 * upstart/control.c (upstart_read_int, upstart_write_int)
 (upstart_read_ints, upstart_write_ints, upstart_read_str)
 (upstart_write_str, upstart_read_header, upstart_write_header): Move
 functions to new wire.c file.
 * upstart/wire.c: Source file to hold wire protocol functions.
 * upstart/wire.h: Prototypes.
 * upstart/tests/test_wire.c: (empty) test suite.
 * upstart/libupstart.h: Include wire.h
 * upstart/Makefile.am (libupstart_la_SOURCES): Build and link wire.c
 (upstartinclude_HEADERS): Install wire.h
 (TESTS): Build and run wire test suite.
 (test_wire_SOURCES, test_wire_LDFLAGS, test_wire_LDADD): Details for
 wire test suite binary.

 * upstart/control.c (MAGIC): Change to "upstart\n", the final
 character was originally \0 and then was a " " for the 0.2 series.
 * upstart/tests/test_control.c (test_recv_msg): Change to match.

2006-12-15 Scott James Remnant <email address hidden>

 * util/initctl.c, compat/sysv/telinit.c, compat/sysv/shutdown.c:
 Update all uses of the UpstartMsg structure to avoid the
 intermediate union that no longer exists.

 * init/control.c, init/tests/test_control.c: Update all uses of
 the UpstartMsg structure to avoid the intermediate union that no
 longer exists.

 * upstart/control.h: Combine all the previous message structures
 into just one that has all of the fields anyway.
 * upstart/control.c, upstart/tests/test_control.c: Update all uses of
 the UpstartMsg structure to avoid the intermediate union that no
 longer exists.

 * upstart/control.h (UPSTART_API_VERSION): Define API version macro
 to be public.
 * upstart/control.c (MSG_VERSION, upstart_send_msg_to): Replacing the
 previous MSG_VERSION macro here.

 * upstart/control.c (upstart_read_int, upstart_write_int)
 (upstart_read_ints, upstart_write_ints, upstart_read_str)
 (upstart_write_str, upstart_read_header, upstart_write_header):
 New functions to replace the old "write a struct" protocol with
 something a little more regimented and supportable.
 (IOVEC_ADD, IOVEC_READ, WireHdr, WireJobPayload, WireJobStatusPayload)
 (WireEventPayload): Remove these structures, use the functions
 instead.
 (upstart_send_msg_to): Call write functions intead of using macros,
 this makes the code somewhat neater.
 (upstart_recv_msg): Call read functions instead of using macros,
 again making the code somewhat neater.
 * upstart/tests/test_control.c (test_recv_msg): Change wire
 tests to match new protocol, and thus actually work properly,
 previously these were endian sensitive.

2006-12-14 Scott James Remnant <email address hidden>

 * compat/sysv/shutdown.c (wall): Construct the wall message so that
 we don't put \r into a po file; for some reason, gettext hates that
 and bitches about it. Someone's confusing internationalisation with
 operating system portability, I expect.

 * util/man/initctl.8: Drop reference to start(8), as that's just
 a symlink to initctl now.

 * init/man/init.8: Link to initctl.

 * compat/sysv/reboot.c (main): Clear up help text a little.

 * HACKING: Correct some typos.

 * configure.ac (AC_INIT): Correct bug reporting address.

2006-12-13 Scott James Remnant <email address hidden>

 * configure.ac: Bump version to 0.3.2

0 blueprints and 0 bugs targeted

There are no feature specifications or bug tasks targeted to this milestone. The project's maintainer, driver, or bug supervisor can target specifications and bug tasks to this milestone to track the things that are expected to be completed for the release.

This milestone contains Public information
Everyone can see this information.