--------------------------------------------------------------------------------
cinit commands,
Nico Schottelius 2005-04-28 (Last Modified: 2005-06-11)
--------------------------------------------------------------------------------

cinit allows communication through a socket (see ipc.thoughs for reasons).

Sockets allow to find out the accessing uid, gid and pid (using SO_PEERCRED as
socketoption).

The communication-protocol is binary, the implementation can be found
in comm/* mostly (clients use begin_msg() and server sigio() additonally).

--------------------------------------------------------------------------------
Protocol overview
--------------------------------------------------------------------------------

Any communication begins with a command. A command is a one byte
unsigned char. Depending on the command, the communication has its own
semantics.


Commands are: (values can be found in cinit.h)

   CMD_START_SVC:    I want to start a service.
   CMD_CHG_STATUS:   I want to change the status of a service.
   CMD_STOP_SVC:     Please shutdown a service.

   CMD_RESCUE:       Kill everything, and spawn a sulogin shell.
   CMD_UPDATE:       Hot-reboot system and reload cinit.
   
   CMD_HALT:         Halt the system
   CMD_REBOOT:       Reboot the system
   CMD_POWEROFF:     Power-off the system

--------------------------------------------------------------------------------
Detailled command-listing
--------------------------------------------------------------------------------

CMD_START_SVC
   1. int len;       /* length of service name, including \0 */
   2. char *svc;     /* name of the service, absolute pathname */ 

   cinit returns:
      a) status of service
      b) fail

CMD_CHG_STATUS:   I want to change the status of a service.
   0. int len;
   1. char *svc;
   2. char status;   /* status:
                        once: started successfully the service once.
                        fail: tried to start once, but the service exit ungracefully
                        respawn: I am on it, as soon it exists I'll restart! */
   2. pid_t pid      /* the pid of the service, if started once
                        or the pid of the service watcher, if respawning */

   cinit returns: MSG_OK|MSG_FAIL (char)

CMD_STOP_SVC:     Please shutdown a service and its dependencies.
   1. int len;       /* length of service name, including \0 */
   2. char *svc;     /* name of the service, absolute pathname */ 

   cinit returns: Status of service (should be ST_OFF)


The following commands do not return anything nor do they need any parameter:

CMD_RESCUE:       Kill everything, and spawn a sulogin shell. Irreversible.
CMD_HALT:         Halt the system.
CMD_REBOOT:       Reboot the system.
CMD_POWEROFF:     Power-off the system.
CMD_UPDATE:       Update cinit, hot-reboot the system.
