void s6_svstatus_unpack (char const *pack, s6_svstatus_t *sv) { uint64 pid ; uint16 wstat ; tain_unpack(pack, &sv->stamp) ; tain_unpack(pack + 12, &sv->readystamp) ; uint64_unpack_big(pack + 24, &pid) ; sv->pid = (pid_t)pid ; uint16_unpack_big(pack + 32, &wstat) ; sv->wstat = (int)wstat ; sv->flagpaused = pack[34] & 1 ; sv->flagfinishing = !!(pack[34] & 2) ; sv->flagwant = !!(pack[34] & 4) ; sv->flagwantup = !!(pack[34] & 8) ; sv->flagready = !!(pack[34] & 16) ; }
int aa_service_status_read (aa_service_status *svst, const char *dir) { size_t len = strlen (dir); char file[len + 1 + sizeof (AA_SVST_FILENAME)]; uint32_t u; /* most cases should be w/out a message, so we'll only need FIXED_SIZE and * one extra byte to NUL-terminate the (empty) message */ if (!stralloc_ready_tuned (&svst->sa, AA_SVST_FIXED_SIZE + 1, 0, 0, 1)) return -1; byte_copy (file, len, dir); byte_copy (file + len, 1 + sizeof (AA_SVST_FILENAME), "/" AA_SVST_FILENAME); if (!openreadfileclose (file, &svst->sa, AA_SVST_FIXED_SIZE + AA_SVST_MAX_MSG_SIZE) || svst->sa.len < AA_SVST_FIXED_SIZE) { int e = errno; tain_now_g (); errno = e; return -1; } tain_now_g (); if (svst->sa.len >= svst->sa.a && !stralloc_ready_tuned (&svst->sa, svst->sa.len + 1, 0, 0, 1)) return -1; svst->sa.s[svst->sa.len] = '\0'; svst->sa.len++; tain_unpack (svst->sa.s, &svst->stamp); uint32_unpack (svst->sa.s + 12, &u); svst->event = (unsigned int) u; uint32_unpack (svst->sa.s + 16, &u); svst->code = (int) u; return 0; }
int main (void) { char buf[TAIN_PACK] ; tain_t now, adj ; localtmn_t l ; char fmt[LOCALTMN_FMT] ; PROG = "s6-clockview" ; if (allread(0, buf, TAIN_PACK) < TAIN_PACK) strerr_diefu1sys(111, "read from stdin") ; tain_unpack(buf, &adj) ; if (!sysclock_get(&now)) strerr_diefu1sys(111, "sysclock_get") ; if (!localtmn_from_sysclock(&l, &now, 1)) strerr_diefu1sys(111, "localtmn_from_sysclock") ; if (buffer_puts(buffer_1, "before: ") < 0) goto fail ; if (buffer_put(buffer_1, fmt, localtmn_fmt(fmt, &l)) < 0) goto fail ; tain_add(&now, &now, &adj) ; if (!localtmn_from_sysclock(&l, &now, 1)) strerr_diefu1sys(111, "localtmn_from_sysclock") ; if (buffer_puts(buffer_1, "\nafter: ") < 0) goto fail ; if (buffer_put(buffer_1, fmt, localtmn_fmt(fmt, &l)) < 0) goto fail ; if (buffer_putflush(buffer_1, "\n", 1) < 0) goto fail ; return 0 ; fail: strerr_diefu1sys(111, "write to stdout") ; }
static void report(const char *name, const uchar_t *status, const tain_t *now) { pid_t pid; tain_t when; uint64_t uptime; uchar_t flags; int haslog; char nbuf[NFMT_SIZE]; /* svdef: */ tain_unpack(&when, &status[16]); flags = status[28]; haslog = (flags & SVDEF_FLAG_HASLOG) ? 1 : 0; /* uptime since activation: */ uptime = tain_uptime(now, &when); vputs(name, ": activated ", nfmt_uint64(nbuf, uptime), " seconds"); if(flags & SVDEF_FLAG_CULL){ vputs(", deactivation in progress"); } if(flags & SVDEF_FLAG_CYCLE){ vputs(", flagged for reactivation"); } vputs("\n"); /* main: */ pid = upak32_unpack(&status[30]); tain_unpack(&when, &status[34]); flags = status[46]; uptime = tain_uptime(now, &when); vputs(" main: "); if(pid == 0){ vputs("down ", nfmt_uint64(nbuf, uptime), " seconds"); if(!(flags & SUBSV_FLAG_WANTDOWN)) vputs(", want up!"); if(flags & SUBSV_FLAG_ISONCE) vputs(", flagged once"); }else if((uptime < 1) && !(flags & SUBSV_FLAG_ISRESET)){ /* munge uptime < 1 second to want up: */ vputs("down, want up!"); if(flags & SUBSV_FLAG_ISONCE) vputs(", flagged once"); }else{ vputs((flags & SUBSV_FLAG_ISRESET) ? "resetting " : "up "); vputs(nfmt_uint64(nbuf, uptime), " seconds"); vputs(" (pid ", nfmt_uint32(nbuf, (uint32_t)pid), ")"); if(flags & SUBSV_FLAG_ISPAUSED) vputs(", paused"); if(flags & SUBSV_FLAG_ISONCE) vputs(", flagged once"); } /* log: */ vputs("\n log: "); if(!haslog){ vputs("(no log)\n"); return; } /* else: */ pid = upak32_unpack(&status[48]); tain_unpack(&when, &status[52]); flags = status[64]; uptime = tain_uptime(now, &when); if(pid == 0){ vputs("down ", nfmt_uint64(nbuf, uptime), " seconds"); if(!(flags & SUBSV_FLAG_WANTDOWN)) vputs(", want up!"); if(flags & SUBSV_FLAG_ISONCE) vputs(", flagged once"); }else if((uptime < 1) && !(flags & SUBSV_FLAG_ISRESET)){ /* munge uptime < 1 second to want up: */ vputs("down, want up!"); if(flags & SUBSV_FLAG_ISONCE) vputs(", flagged once"); }else{ vputs((flags & SUBSV_FLAG_ISRESET) ? "resetting " : "up "); vputs(nfmt_uint64(nbuf, uptime), " seconds"); vputs(" (pid ", nfmt_uint32(nbuf, (uint32_t)pid), ")"); if(flags & SUBSV_FLAG_ISPAUSED) vputs(", paused"); if(flags & SUBSV_FLAG_ISONCE) vputs(", flagged once"); } vputs("\n"); return; }