unix/fiss

src/supervise/encode.c in master
Repositories | Summary | Log | Files | LICENSE

encode.c (2747B) download


  1#include "defs.h"
  2
  3#include <stdlib.h>
  4#include <string.h>
  5
  6const char* state_name(state_t state) {
  7	switch (state) {
  8		case STATE_INACTIVE:
  9			return "inactive";
 10		case STATE_DEPENDENCY:
 11			return "waiting for dependenies";
 12		case STATE_SETUP:
 13			return "setup";
 14		case STATE_STARTING:
 15			return "starting";
 16		case STATE_ACTIVE_DUMMY:
 17			return "active (dummy)";
 18		case STATE_ACTIVE_FOREGROUND:
 19			return "active (foreground)";
 20		case STATE_ACTIVE_BACKGROUND:
 21			return "active (background)";
 22		case STATE_STOPPING:
 23			return "stopping";
 24		case STATE_FINISHING:
 25			return "finishing";
 26		default:
 27			return "unknown";
 28	}
 29}
 30
 31void store_status(serial_t* buffer, char* stat_buffer, char* pid_buffer) {
 32	u64 tai = (u64) service.state_change + 4611686018427387914llu;
 33
 34	stat_buffer[0] = '\0';
 35	pid_buffer[0]  = '\0';
 36
 37	// lower-endian
 38	buffer->status_change[0] = (tai >> 56) & 0xff;
 39	buffer->status_change[1] = (tai >> 48) & 0xff;
 40	buffer->status_change[2] = (tai >> 40) & 0xff;
 41	buffer->status_change[3] = (tai >> 32) & 0xff;
 42	buffer->status_change[4] = (tai >> 24) & 0xff;
 43	buffer->status_change[5] = (tai >> 16) & 0xff;
 44	buffer->status_change[6] = (tai >> 8) & 0xff;
 45	buffer->status_change[7] = (tai >> 0) & 0xff;
 46
 47	// big-endian (network)
 48	buffer->pid[0] = (service.pid >> 0) & 0xff;
 49	buffer->pid[1] = (service.pid >> 8) & 0xff;
 50	buffer->pid[2] = (service.pid >> 16) & 0xff;
 51	buffer->pid[3] = (service.pid >> 24) & 0xff;
 52
 53	buffer->state      = service.state;
 54	buffer->fail_count = service.death_count;
 55
 56	buffer->flags = ((service.stop_timeout != 0) << 4) |
 57	                ((service.should_restart) << 3) |
 58	                ((service.should_restart) << 2);
 59
 60	buffer->paused     = service.paused;
 61	buffer->restart    = need_restart() ? 'u' : 'd';
 62	buffer->force_down = 0;
 63
 64	if (service.death_last == 0) {
 65		buffer->return_code = 0;
 66		buffer->flags |= 0;
 67	} else if (WIFEXITED(service.death_last)) {
 68		buffer->return_code = WEXITSTATUS(service.death_last);
 69		buffer->flags |= 1;
 70	} else {
 71		buffer->return_code = WTERMSIG(service.death_last);
 72		buffer->flags |= 2;
 73	}
 74
 75	switch (service.state) {
 76		case STATE_INACTIVE:
 77			buffer->state_runit = 0;    // inactive
 78			break;
 79		case STATE_DEPENDENCY:
 80		case STATE_SETUP:
 81		case STATE_STARTING:
 82		case STATE_ACTIVE_DUMMY:
 83		case STATE_ACTIVE_FOREGROUND:
 84		case STATE_ACTIVE_BACKGROUND:
 85		case STATE_ACTIVE_PID:
 86			buffer->state_runit = 1;    // running
 87			break;
 88		case STATE_STOPPING:
 89		case STATE_FINISHING:
 90			buffer->state_runit = 2;    // finishing
 91			break;
 92	}
 93
 94
 95	strcpy(stat_buffer, state_name(service.state));
 96	if (service.desired_state) {
 97		strcat(stat_buffer, ", wants ");
 98		strcat(stat_buffer, state_name(service.desired_state));
 99	}
100	if (service.paused)
101		strcat(stat_buffer, ", is paused");
102}