aboutsummaryrefslogtreecommitdiff
path: root/get_services.h
diff options
context:
space:
mode:
Diffstat (limited to 'get_services.h')
-rw-r--r--get_services.h91
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