diff options
Diffstat (limited to 'get_services.h')
| -rw-r--r-- | get_services.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/get_services.h b/get_services.h new file mode 100644 index 0000000..d64ae55 --- /dev/null +++ b/get_services.h @@ -0,0 +1,91 @@ +#include "djb/buffer.h" + +buffer b_outfd = BUFFER_INIT(read, -1, 0, BUFFER_TMP_LEN); +static unsigned short maxhistory; +static unsigned short *history; + +#ifdef UNKNOWN_PROCESS_SIZE +static unsigned int process_size; +#else +#define process_size PROCESS_SIZE +#endif + +#define MAX_SERVICE_NAME 256 + +/* read from outfd string or constant lenght*/ +int read_stringb(char *s,int len) { + int count=0; + while (1) { + if (buffer_getc(&b_outfd, s+count) <=0 ) break; + if (len==-1 && s[count]==0) return count; + ++count; + if (count==len) return count; + if (len==-1 && count==MAX_SERVICE_NAME) break; + } + die_xx("error getting data"); + return -1; +} + +/* buf[??] is defined in the main program */ +void get_services() { + int j; + char x[MAX_SERVICE_NAME + PROCESS_SIZE], *tmp, *name=""; + + if (root) return; + b_outfd.x = buf; + b_outfd.fd = outfd; + x[0] = 'D', x[1]='0'; + if (do_update) x[1]='1'; /* XXX D1 set doupdate */ + write(infd,x,2); + + /* 1. names */ + while (1) { + j = read_stringb(x,-1); + if (j==0) break; + if ((int)mem.r <= j + PROCESS_SIZE) die_xx("Out of memory"); + mem.r -= ++j; + name = mem.x + mem.r; + byte_copy(name, j, x); + ++maxprocess; + } + + /* 2. history */ + read_stringb(x, sizeof(unsigned short) - 1); + maxhistory = (unsigned char)x[0]; + j = sizeof(unsigned short) * maxhistory; + +#ifdef UNKNOWN_PROCESS_SIZE + if (process_size && maxprocess >= 0) { + process_size -= (mem.a-mem.r) + j + sizeof(unsigned short); + process_size /= (maxprocess+1); + byte_zero(mem.x, mem.r); + } else + process_size = PROCESS_SIZE; +#endif + + mem.r -= (mem.r % 8); + if (j) { + if ((int)mem.r < j) die_xx("Out of memory"); + mem.r -= j; + tmp = mem.x + mem.r; + read_stringb(tmp,j); + history = (unsigned short *)tmp; + } + + /* 3. processes */ + mem.l = (maxprocess+1) * PROCESS_SIZE; + mem.r -= (mem.r % 16); + if (mem.l >= mem.r) die_xx("Out of memory"); + tmp = mem.x + mem.r - mem.l; + root = (struct process *)tmp; + + for (j=0; j<=maxprocess; j++) { + read_stringb(tmp, process_size); + tmp += PROCESS_SIZE; + root[j].pr_circular = 0; + root[j].name = alloc_name_set(name); + name += str_len(name) + 1; + } +} + +#undef MAX_SERVICE_NAME |
