131b6611aSDavid van Moolenbroek /* ProcFS - service.c - the service subdirectory */ 231b6611aSDavid van Moolenbroek 331b6611aSDavid van Moolenbroek #include "inc.h" 431b6611aSDavid van Moolenbroek 531b6611aSDavid van Moolenbroek #include <minix/rs.h> 631b6611aSDavid van Moolenbroek #include "rs/const.h" 731b6611aSDavid van Moolenbroek #include "rs/type.h" 831b6611aSDavid van Moolenbroek 941ba8c04SLionel Sambuc enum policy { 1041ba8c04SLionel Sambuc POL_NONE = 0x00, /* user | endpoint */ 1141ba8c04SLionel Sambuc POL_RESET = 0x01, /* visible | change */ 1241ba8c04SLionel Sambuc POL_RESTART = 0x02, /* transparent | preserved */ 1341ba8c04SLionel Sambuc POL_LIVE_UPDATE = 0x04 /* transparent | preserved */ 1441ba8c04SLionel Sambuc }; 1541ba8c04SLionel Sambuc 1641ba8c04SLionel Sambuc struct policies { 1741ba8c04SLionel Sambuc #define MAX_POL_FORMAT_SZ 20 1841ba8c04SLionel Sambuc char formatted[MAX_POL_FORMAT_SZ]; 1941ba8c04SLionel Sambuc enum policy supported; 2041ba8c04SLionel Sambuc }; 2141ba8c04SLionel Sambuc 22129adfebSDavid van Moolenbroek typedef struct { 230eabb93cSDavid van Moolenbroek struct rproc proc[NR_SYS_PROCS]; 240eabb93cSDavid van Moolenbroek struct rprocpub pub[NR_SYS_PROCS]; 25129adfebSDavid van Moolenbroek } ixfer_rproc_t; 26129adfebSDavid van Moolenbroek static ixfer_rproc_t rproc; 270eabb93cSDavid van Moolenbroek 2841ba8c04SLionel Sambuc static struct policies policies[NR_SYS_PROCS]; 2931b6611aSDavid van Moolenbroek 3031b6611aSDavid van Moolenbroek static struct inode *service_node; 3131b6611aSDavid van Moolenbroek 3241ba8c04SLionel Sambuc /* Updates the policies state from RS. Always returns an ASCIIZ string. */ 3341ba8c04SLionel Sambuc static const char * 3441ba8c04SLionel Sambuc service_get_policies(struct policies * pol, index_t slot) 3531b6611aSDavid van Moolenbroek { 3641ba8c04SLionel Sambuc #if 1 /* The following should be retrieved from RS and formated instead. */ 3741ba8c04SLionel Sambuc int pos; 3841ba8c04SLionel Sambuc char *ref_label; 3941ba8c04SLionel Sambuc static const struct { 4041ba8c04SLionel Sambuc const char *label; 4141ba8c04SLionel Sambuc const char *policy_str; 4241ba8c04SLionel Sambuc } def_pol[] = { 4341ba8c04SLionel Sambuc /* audio */ 4486fd71a2SJia-Ju Bai { .label = "als4000", .policy_str = "reset" }, 4537e23b1cSJia-Ju Bai { .label = "cmi8738", .policy_str = "reset" }, 46*8acfcfc3SJia-Ju Bai { .label = "cs4281", .policy_str = "reset" }, 4741ba8c04SLionel Sambuc { .label = "es1370", .policy_str = "reset" }, 4841ba8c04SLionel Sambuc { .label = "es1371", .policy_str = "reset" }, 4941ba8c04SLionel Sambuc { .label = "sb16", .policy_str = "reset" }, 5041ba8c04SLionel Sambuc /* bus */ 5141ba8c04SLionel Sambuc { .label = "i2c", .policy_str = "restart" }, 5241ba8c04SLionel Sambuc { .label = "pci", .policy_str = "restart" }, 5341ba8c04SLionel Sambuc { .label = "ti1225", .policy_str = "restart" }, 5441ba8c04SLionel Sambuc /* clock */ 5541ba8c04SLionel Sambuc { .label = "readclock.drv", .policy_str = "restart" }, 5641ba8c04SLionel Sambuc /* eeprom */ 5741ba8c04SLionel Sambuc { .label = "cat24c256", .policy_str = "restart" }, 5841ba8c04SLionel Sambuc /* examples */ 5941ba8c04SLionel Sambuc { .label = "hello", .policy_str = "restart" }, 6041ba8c04SLionel Sambuc /* hid */ 6141ba8c04SLionel Sambuc { .label = "pckbd", .policy_str = "reset" }, 6241ba8c04SLionel Sambuc /* iommu */ 6341ba8c04SLionel Sambuc { .label = "amddev", .policy_str = "" }, 6441ba8c04SLionel Sambuc /* net */ 650c474453SCristiano Giuffrida { .label = "3c90x", .policy_str = "reset" }, 660c474453SCristiano Giuffrida { .label = "atl2", .policy_str = "reset" }, 670c474453SCristiano Giuffrida { .label = "dec21140A", .policy_str = "reset" }, 680c474453SCristiano Giuffrida { .label = "dp8390", .policy_str = "reset" }, 690c474453SCristiano Giuffrida { .label = "dpeth", .policy_str = "reset" }, 700c474453SCristiano Giuffrida { .label = "e1000", .policy_str = "reset" }, 710c474453SCristiano Giuffrida { .label = "fxp", .policy_str = "reset" }, 728d98f2e5SJia-Ju Bai { .label = "ip1000", .policy_str = "reset" }, 730c474453SCristiano Giuffrida { .label = "lance", .policy_str = "reset" }, 740c474453SCristiano Giuffrida { .label = "lan8710a", .policy_str = "reset" }, 750c474453SCristiano Giuffrida { .label = "orinoco", .policy_str = "reset" }, 760c474453SCristiano Giuffrida { .label = "rtl8139", .policy_str = "reset" }, 770c474453SCristiano Giuffrida { .label = "rtl8169", .policy_str = "reset" }, 7841ba8c04SLionel Sambuc { .label = "uds", .policy_str = "reset" }, 790c474453SCristiano Giuffrida { .label = "virtio_net", .policy_str = "reset" }, 80022136b3SJia-Ju Bai { .label = "vt6105", .policy_str = "reset" }, 8141ba8c04SLionel Sambuc /* power */ 8241ba8c04SLionel Sambuc { .label = "acpi", .policy_str = "" }, 8341ba8c04SLionel Sambuc { .label = "tps65217", .policy_str = "" }, 8441ba8c04SLionel Sambuc { .label = "tps65590", .policy_str = "" }, 8541ba8c04SLionel Sambuc /* printer */ 8641ba8c04SLionel Sambuc { .label = "printer", .policy_str = "restart" }, 8741ba8c04SLionel Sambuc /* sensors */ 8841ba8c04SLionel Sambuc { .label = "bmp085", .policy_str = "" }, 8941ba8c04SLionel Sambuc { .label = "sht21", .policy_str = "restart" }, 9041ba8c04SLionel Sambuc { .label = "tsl2550", .policy_str = "restart" }, 9141ba8c04SLionel Sambuc /* storage */ 9241ba8c04SLionel Sambuc { .label = "ahci", .policy_str = "reset" }, 9341ba8c04SLionel Sambuc { .label = "at_wini", .policy_str = "reset" }, 9441ba8c04SLionel Sambuc { .label = "fbd", .policy_str = "reset" }, 9541ba8c04SLionel Sambuc { .label = "filter", .policy_str = "reset" }, 9641ba8c04SLionel Sambuc { .label = "floppy", .policy_str = "reset" }, 9741ba8c04SLionel Sambuc { .label = "memory", .policy_str = "restart" }, 9841ba8c04SLionel Sambuc { .label = "mmc", .policy_str = "reset" }, 9941ba8c04SLionel Sambuc { .label = "virtio_blk", .policy_str = "reset" }, 10041ba8c04SLionel Sambuc { .label = "vnd", .policy_str = "reset" }, 10141ba8c04SLionel Sambuc /* system */ 10241ba8c04SLionel Sambuc { .label = "gpio", .policy_str = "restart" }, 10367b47183SLionel Sambuc { .label = "log", .policy_str = "reset" }, 10441ba8c04SLionel Sambuc { .label = "random", .policy_str = "restart" }, 10541ba8c04SLionel Sambuc /* tty */ 10641ba8c04SLionel Sambuc { .label = "pty", .policy_str = "restart" }, 1070c474453SCristiano Giuffrida { .label = "tty", .policy_str = "restart" }, 10841ba8c04SLionel Sambuc /* usb */ 10941ba8c04SLionel Sambuc { .label = "usbd", .policy_str = "" }, 11041ba8c04SLionel Sambuc { .label = "usb_hub", .policy_str = "" }, 11141ba8c04SLionel Sambuc { .label = "usb_storage", .policy_str = "" }, 11241ba8c04SLionel Sambuc /* video */ 11341ba8c04SLionel Sambuc { .label = "fb", .policy_str = "" }, 11441ba8c04SLionel Sambuc { .label = "tda19988", .policy_str = "" }, 11541ba8c04SLionel Sambuc /* vmm_guest */ 11641ba8c04SLionel Sambuc { .label = "vbox", .policy_str = "" }, 11741ba8c04SLionel Sambuc /* fs */ 11841ba8c04SLionel Sambuc { .label = "ext2", .policy_str = "" }, 11941ba8c04SLionel Sambuc { .label = "hgfs", .policy_str = "" }, 12041ba8c04SLionel Sambuc { .label = "isofs", .policy_str = "" }, 1210c474453SCristiano Giuffrida { .label = "mfs", .policy_str = "restart" }, 1220c474453SCristiano Giuffrida { .label = "pfs", .policy_str = "restart" }, 1230c474453SCristiano Giuffrida { .label = "procfs", .policy_str = "restart" }, 124da21d850SDavid van Moolenbroek { .label = "ptyfs", .policy_str = "" }, 12541ba8c04SLionel Sambuc { .label = "vbfs", .policy_str = "" }, 12641ba8c04SLionel Sambuc /* net */ 12741ba8c04SLionel Sambuc { .label = "inet", .policy_str = "reset" }, 12841ba8c04SLionel Sambuc { .label = "lwip", .policy_str = "" }, 12941ba8c04SLionel Sambuc /* servers */ 1300c474453SCristiano Giuffrida { .label = "devman", .policy_str = "restart" }, 1310c474453SCristiano Giuffrida { .label = "ds", .policy_str = "restart" }, 13241ba8c04SLionel Sambuc { .label = "input", .policy_str = "reset" }, 13341ba8c04SLionel Sambuc { .label = "ipc", .policy_str = "restart" }, 13441ba8c04SLionel Sambuc { .label = "is", .policy_str = "restart" }, 135e4e21ee1SDavid van Moolenbroek { .label = "mib", .policy_str = "restart" }, 1360c474453SCristiano Giuffrida { .label = "pm", .policy_str = "restart" }, 1370c474453SCristiano Giuffrida { .label = "rs", .policy_str = "restart" }, 1380c474453SCristiano Giuffrida { .label = "sched", .policy_str = "restart" }, 1390c474453SCristiano Giuffrida { .label = "vfs", .policy_str = "restart" }, 1408b0f8559SLionel Sambuc { .label = "vm", .policy_str = "restart" }, 14141ba8c04SLionel Sambuc //{ .label = "", .policy_str = "" }, 14241ba8c04SLionel Sambuc }; 14331b6611aSDavid van Moolenbroek 14441ba8c04SLionel Sambuc /* Find the related policy, based on the file name of the service. */ 1450eabb93cSDavid van Moolenbroek ref_label = strrchr(rproc.pub[slot].proc_name, '/'); 14641ba8c04SLionel Sambuc if (NULL == ref_label) 1470eabb93cSDavid van Moolenbroek ref_label = rproc.pub[slot].proc_name; 14831b6611aSDavid van Moolenbroek 14941ba8c04SLionel Sambuc memset(pol[slot].formatted, 0, MAX_POL_FORMAT_SZ); 15041ba8c04SLionel Sambuc for(pos = 0; pos < (sizeof(def_pol) / sizeof(def_pol[0])); pos++) { 15141ba8c04SLionel Sambuc if (0 == strcmp(ref_label, def_pol[pos].label)) { 152f5321d8dSDavid van Moolenbroek (void)strncpy(pol[slot].formatted, 153f5321d8dSDavid van Moolenbroek def_pol[pos].policy_str, MAX_POL_FORMAT_SZ); 15441ba8c04SLionel Sambuc pol[slot].formatted[MAX_POL_FORMAT_SZ-1] = '\0'; 15541ba8c04SLionel Sambuc break; 15641ba8c04SLionel Sambuc } 15741ba8c04SLionel Sambuc } 15841ba8c04SLionel Sambuc #else 15941ba8c04SLionel Sambuc /* Should do something sensible, based on flags from RS/SEF. */ 16041ba8c04SLionel Sambuc #endif 16131b6611aSDavid van Moolenbroek 16241ba8c04SLionel Sambuc return pol[slot].formatted; 16331b6611aSDavid van Moolenbroek } 16431b6611aSDavid van Moolenbroek 1650c474453SCristiano Giuffrida /* Returns a ASCIIZ string encoding RS flags. */ 1660c474453SCristiano Giuffrida static const char * 1670c474453SCristiano Giuffrida service_get_flags(index_t slot) 1680c474453SCristiano Giuffrida { 1690c474453SCristiano Giuffrida static char str[10]; 1700c474453SCristiano Giuffrida int flags, sys_flags; 1710c474453SCristiano Giuffrida 1720c474453SCristiano Giuffrida flags = rproc.proc[slot].r_flags; 1730c474453SCristiano Giuffrida sys_flags = rproc.pub[slot].sys_flags; 1740c474453SCristiano Giuffrida 1750c474453SCristiano Giuffrida str[0] = (flags & RS_ACTIVE) ? 'A' : '-'; 1760c474453SCristiano Giuffrida str[1] = (flags & RS_UPDATING) ? 'U' : '-'; 1770c474453SCristiano Giuffrida str[2] = (flags & RS_EXITING) ? 'E' : '-'; 1780c474453SCristiano Giuffrida str[3] = (flags & RS_NOPINGREPLY) ? 'N' : '-'; 1790c474453SCristiano Giuffrida str[4] = (sys_flags & SF_USE_COPY) ? 'C' : '-'; 1800c474453SCristiano Giuffrida str[5] = (sys_flags & SF_USE_REPL) ? 'R' : '-'; 1810c474453SCristiano Giuffrida str[6] = (sys_flags & SF_NEED_COPY) ? 'c' : '-'; 1820c474453SCristiano Giuffrida str[7] = (sys_flags & SF_NEED_REPL) ? 'r' : '-'; 1830c474453SCristiano Giuffrida str[8] = (sys_flags & SF_CORE_SRV) ? 's' : '-'; 1840c474453SCristiano Giuffrida str[9] = '\0'; 1850c474453SCristiano Giuffrida 1860c474453SCristiano Giuffrida return str; 1870c474453SCristiano Giuffrida } 1880c474453SCristiano Giuffrida 18931b6611aSDavid van Moolenbroek /* 190f5321d8dSDavid van Moolenbroek * Return whether a slot is in use and active. The purpose of this check is 191f5321d8dSDavid van Moolenbroek * to ensure that after eliminating all slots that do not pass this check, we 192f5321d8dSDavid van Moolenbroek * are left with a set of live services each with a unique label. 193f5321d8dSDavid van Moolenbroek */ 194f5321d8dSDavid van Moolenbroek static int 195f5321d8dSDavid van Moolenbroek service_active(index_t slot) 196f5321d8dSDavid van Moolenbroek { 197f5321d8dSDavid van Moolenbroek 198fefec20eSDavid van Moolenbroek /* 199fefec20eSDavid van Moolenbroek * Init is in RS's process tables as the representation of user 200fefec20eSDavid van Moolenbroek * processes. It is not a system service. 201fefec20eSDavid van Moolenbroek */ 202f5321d8dSDavid van Moolenbroek return ((rproc.proc[slot].r_flags & (RS_IN_USE | RS_ACTIVE)) == 203fefec20eSDavid van Moolenbroek (RS_IN_USE | RS_ACTIVE) && 204fefec20eSDavid van Moolenbroek rproc.pub[slot].endpoint != INIT_PROC_NR); 205f5321d8dSDavid van Moolenbroek } 206f5321d8dSDavid van Moolenbroek 207f5321d8dSDavid van Moolenbroek /* 20831b6611aSDavid van Moolenbroek * Update the contents of the service directory, by first updating the RS 20931b6611aSDavid van Moolenbroek * tables and then updating the directory contents. 21031b6611aSDavid van Moolenbroek */ 21141ba8c04SLionel Sambuc static void 21231b6611aSDavid van Moolenbroek service_update(void) 21331b6611aSDavid van Moolenbroek { 21431b6611aSDavid van Moolenbroek struct inode *node; 21531b6611aSDavid van Moolenbroek struct inode_stat stat; 21631b6611aSDavid van Moolenbroek index_t slot; 2170eabb93cSDavid van Moolenbroek static int warned = FALSE; 2180eabb93cSDavid van Moolenbroek int r; 21931b6611aSDavid van Moolenbroek 2200eabb93cSDavid van Moolenbroek /* There is not much we can do if this call fails. */ 2210eabb93cSDavid van Moolenbroek r = getsysinfo(RS_PROC_NR, SI_PROCALL_TAB, &rproc, sizeof(rproc)); 2220eabb93cSDavid van Moolenbroek if (r != OK && !warned) { 2230eabb93cSDavid van Moolenbroek printf("PROCFS: unable to obtain RS tables (%d)\n", r); 2240eabb93cSDavid van Moolenbroek warned = TRUE; 2250eabb93cSDavid van Moolenbroek } 22631b6611aSDavid van Moolenbroek 22731b6611aSDavid van Moolenbroek /* 22831b6611aSDavid van Moolenbroek * As with PIDs, we make two passes. Delete first, then add. This 22931b6611aSDavid van Moolenbroek * prevents problems in the hypothetical case that between updates, one 23031b6611aSDavid van Moolenbroek * slot ends up with the label name of a previous, different slot. 23131b6611aSDavid van Moolenbroek */ 23231b6611aSDavid van Moolenbroek for (slot = 0; slot < NR_SYS_PROCS; slot++) { 23331b6611aSDavid van Moolenbroek if ((node = get_inode_by_index(service_node, slot)) == NULL) 23431b6611aSDavid van Moolenbroek continue; 23531b6611aSDavid van Moolenbroek 23631b6611aSDavid van Moolenbroek /* 23731b6611aSDavid van Moolenbroek * If the slot is no longer in use, or the label name does not 23831b6611aSDavid van Moolenbroek * match, the node must be deleted. 23931b6611aSDavid van Moolenbroek */ 240f5321d8dSDavid van Moolenbroek if (!service_active(slot) || 2410eabb93cSDavid van Moolenbroek strcmp(get_inode_name(node), rproc.pub[slot].label)) 24231b6611aSDavid van Moolenbroek delete_inode(node); 24331b6611aSDavid van Moolenbroek } 24431b6611aSDavid van Moolenbroek 24531b6611aSDavid van Moolenbroek memset(&stat, 0, sizeof(stat)); 24631b6611aSDavid van Moolenbroek stat.mode = REG_ALL_MODE; 24731b6611aSDavid van Moolenbroek stat.uid = SUPER_USER; 24831b6611aSDavid van Moolenbroek stat.gid = SUPER_USER; 24931b6611aSDavid van Moolenbroek 25031b6611aSDavid van Moolenbroek for (slot = 0; slot < NR_SYS_PROCS; slot++) { 251f5321d8dSDavid van Moolenbroek if (!service_active(slot) || 25231b6611aSDavid van Moolenbroek get_inode_by_index(service_node, slot) != NULL) 25331b6611aSDavid van Moolenbroek continue; 25431b6611aSDavid van Moolenbroek 2550eabb93cSDavid van Moolenbroek node = add_inode(service_node, rproc.pub[slot].label, slot, 25631b6611aSDavid van Moolenbroek &stat, (index_t)0, (cbdata_t)slot); 25731b6611aSDavid van Moolenbroek 25831b6611aSDavid van Moolenbroek if (node == NULL) 25931b6611aSDavid van Moolenbroek out_of_inodes(); 26031b6611aSDavid van Moolenbroek } 26131b6611aSDavid van Moolenbroek } 26231b6611aSDavid van Moolenbroek 26331b6611aSDavid van Moolenbroek /* 26441ba8c04SLionel Sambuc * Initialize the service directory. 26541ba8c04SLionel Sambuc */ 26641ba8c04SLionel Sambuc void 26741ba8c04SLionel Sambuc service_init(void) 26841ba8c04SLionel Sambuc { 26941ba8c04SLionel Sambuc struct inode *root, *node; 27041ba8c04SLionel Sambuc struct inode_stat stat; 27141ba8c04SLionel Sambuc 27241ba8c04SLionel Sambuc root = get_root_inode(); 27341ba8c04SLionel Sambuc 27441ba8c04SLionel Sambuc memset(&stat, 0, sizeof(stat)); 27541ba8c04SLionel Sambuc stat.mode = DIR_ALL_MODE; 27641ba8c04SLionel Sambuc stat.uid = SUPER_USER; 27741ba8c04SLionel Sambuc stat.gid = SUPER_USER; 27841ba8c04SLionel Sambuc 27941ba8c04SLionel Sambuc service_node = add_inode(root, "service", NO_INDEX, &stat, 28041ba8c04SLionel Sambuc NR_SYS_PROCS, NULL); 28141ba8c04SLionel Sambuc 28241ba8c04SLionel Sambuc if (service_node == NULL) 28341ba8c04SLionel Sambuc panic("unable to create service node"); 28441ba8c04SLionel Sambuc } 28541ba8c04SLionel Sambuc 28641ba8c04SLionel Sambuc /* 28731b6611aSDavid van Moolenbroek * A lookup request is being performed. If it is in the service directory, 28831b6611aSDavid van Moolenbroek * update the tables. We do this lazily, to reduce overhead. 28931b6611aSDavid van Moolenbroek */ 29031b6611aSDavid van Moolenbroek void 29131b6611aSDavid van Moolenbroek service_lookup(struct inode * parent, clock_t now) 29231b6611aSDavid van Moolenbroek { 29331b6611aSDavid van Moolenbroek static clock_t last_update = 0; 29431b6611aSDavid van Moolenbroek 29531b6611aSDavid van Moolenbroek if (parent != service_node) 29631b6611aSDavid van Moolenbroek return; 29731b6611aSDavid van Moolenbroek 29831b6611aSDavid van Moolenbroek if (last_update != now) { 29931b6611aSDavid van Moolenbroek service_update(); 30031b6611aSDavid van Moolenbroek 30131b6611aSDavid van Moolenbroek last_update = now; 30231b6611aSDavid van Moolenbroek } 30331b6611aSDavid van Moolenbroek } 30431b6611aSDavid van Moolenbroek 30531b6611aSDavid van Moolenbroek /* 30631b6611aSDavid van Moolenbroek * A getdents request is being performed. If it is in the service directory, 30731b6611aSDavid van Moolenbroek * update the tables. 30831b6611aSDavid van Moolenbroek */ 30931b6611aSDavid van Moolenbroek void 31031b6611aSDavid van Moolenbroek service_getdents(struct inode * node) 31131b6611aSDavid van Moolenbroek { 31231b6611aSDavid van Moolenbroek 31331b6611aSDavid van Moolenbroek if (node != service_node) 31431b6611aSDavid van Moolenbroek return; 31531b6611aSDavid van Moolenbroek 31631b6611aSDavid van Moolenbroek service_update(); 31731b6611aSDavid van Moolenbroek } 31831b6611aSDavid van Moolenbroek 31931b6611aSDavid van Moolenbroek /* 32031b6611aSDavid van Moolenbroek * A read request is being performed. If it is on a file in the service 32131b6611aSDavid van Moolenbroek * directory, process the read request. We rely on the fact that any read 32231b6611aSDavid van Moolenbroek * call will have been preceded by a lookup, so its table entry has been 32331b6611aSDavid van Moolenbroek * updated very recently. 32431b6611aSDavid van Moolenbroek */ 32531b6611aSDavid van Moolenbroek void 32631b6611aSDavid van Moolenbroek service_read(struct inode * node) 32731b6611aSDavid van Moolenbroek { 32831b6611aSDavid van Moolenbroek struct inode *parent; 32931b6611aSDavid van Moolenbroek index_t slot; 33031b6611aSDavid van Moolenbroek struct rprocpub *rpub; 33131b6611aSDavid van Moolenbroek struct rproc *rp; 33231b6611aSDavid van Moolenbroek 33331b6611aSDavid van Moolenbroek if (get_parent_inode(node) != service_node) 33431b6611aSDavid van Moolenbroek return; 33531b6611aSDavid van Moolenbroek 33631b6611aSDavid van Moolenbroek slot = get_inode_index(node); 3370eabb93cSDavid van Moolenbroek rpub = &rproc.pub[slot]; 3380eabb93cSDavid van Moolenbroek rp = &rproc.proc[slot]; 33931b6611aSDavid van Moolenbroek 34031b6611aSDavid van Moolenbroek /* TODO: add a large number of other fields! */ 34141ba8c04SLionel Sambuc buf_printf("filename: %s\n", rpub->proc_name); 34241ba8c04SLionel Sambuc buf_printf("endpoint: %d\n", rpub->endpoint); 343a8f606deSCristiano Giuffrida buf_printf("pid: %d\n", rp->r_pid); 34441ba8c04SLionel Sambuc buf_printf("restarts: %d\n", rp->r_restarts); 3450c474453SCristiano Giuffrida buf_printf("flags: %s\n", service_get_flags(slot)); 34641ba8c04SLionel Sambuc buf_printf("policies: %s\n", service_get_policies(policies, slot)); 347e4d99eb9SDavid van Moolenbroek buf_printf("ASRcount: %u\n", rp->r_asr_count); 34831b6611aSDavid van Moolenbroek } 349