diff -urN cui93/Makefile cui94/Makefile --- cui93/Makefile Mon Mar 31 00:00:00 2014 +++ cui94/Makefile Wed Apr 2 00:00:00 2014 @@ -7,7 +7,7 @@ endif TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o dbg.o +OBJS = cui.o focus.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o dbg.o list.o all: $(TARG) diff -urN cui93/list.c cui94/list.c --- cui93/list.c Thu Jan 1 09:00:00 1970 +++ cui94/list.c Wed Apr 2 00:00:00 2014 @@ -0,0 +1,26 @@ +#include "list.h" +#include "cui.h" +#include +#include + +void * +cui_list_add(cui_list *root, int data_size) +{ + cui_list p = malloc(sizeof(struct cui_list) + data_size); + if(p == NULL) ERR("No Mem"); + p->next = *root; + *root = p; + return p->data; +} + +void +cui_list_del(cui_list *root, void *data) +{ + cui_list p = *root, *prev=root; + for(; p; prev=&p->next, p=p->next) if(p->data == data) break; + if(p == NULL) return; + *prev = p->next; + free(p); +} + +/* EOF */ diff -urN cui93/list.h cui94/list.h --- cui93/list.h Thu Jan 1 09:00:00 1970 +++ cui94/list.h Wed Apr 2 00:00:00 2014 @@ -0,0 +1,14 @@ +#ifndef __LIST_H__ +#define __LIST_H__ + +typedef struct cui_list *cui_list; + +struct cui_list{ + cui_list next; + char data[0]; +}; + +void *cui_list_add(cui_list *root, int data_size); +void cui_list_del(cui_list *root, void *data); + +#endif diff -urN cui93/term.c cui94/term.c --- cui93/term.c Tue Apr 1 23:20:00 2014 +++ cui94/term.c Wed Apr 2 00:00:00 2014 @@ -6,6 +6,7 @@ #include "rszbox.h" #include "key.h" #include "timer.h" +#include "list.h" #include #include #include @@ -411,52 +412,26 @@ #define TIMEOUT_MSEC (3*1000) -typedef struct trm_list *trm_list; - -struct trm_list{ - cui obj; - trm_list next; -}; - -static trm_list t_list = NULL; - -static void -trm_list_add(cui obj) -{ - trm_list p; - if((p = malloc(sizeof(struct trm_list))) == NULL) ERR("No Mem"); - p->obj = obj; - p->next = t_list; - t_list = p; -} - -static void -trm_list_del(cui obj) -{ - trm_list p = t_list, *prev = &t_list; - for(; p; prev=&p->next, p=p->next) if(p->obj == obj) break; - if(p == NULL) return; - *prev = p->next; - free(p); -} +static cui_list t_list = NULL; static void sig_hdr(int sig) { int pid; - trm_list p; + cui_list p = t_list; + cui obj; cui_terminal t; if(sig != SIGCHLD) return; pid = wait(NULL); - for(p=t_list; p; p=p->next){ - t = (cui_terminal)p->obj; + for(; p; p=p->next){ + obj = *(cui *)p->data; + t = (cui_terminal)obj; if(t->pid == pid) break; } if(p == NULL) return; - t = (cui_terminal)p->obj; - cui_readable_del(p->obj, t->pipe_r); - trm_list_del(p->obj); + cui_readable_del(obj, t->pipe_r); + cui_list_del(&t_list, p->data); } static void @@ -467,26 +442,22 @@ signal(SIGCHLD, sig_hdr); #if defined(__FreeBSD__) if((ret = forkpty(&master, NULL, NULL, NULL)) < 0) ERR("forkpy"); - if(ret != 0){ /* parent */ - p->pipe_r = p->pipe_w = master; - p->pid = ret; - trm_list_add(obj); - return; - } #else /* defined(__linux__) */ int slave; char *name; if((master = posix_openpt(O_RDWR)) < 0) ERR("posix_openpt"); if((ret = fork()) < 0) ERR("fork"); +#endif if(ret != 0){ /* parent */ p->pipe_r = p->pipe_w = master; p->pid = ret; - trm_list_add(obj); + *(cui *)cui_list_add(&t_list, sizeof(cui)) = obj; return; } /* child */ +#if defined(__linux__) setsid(); if(grantpt(master) < 0) ERR("grantpt"); if(unlockpt(master) < 0) ERR("unlockpt");