diff -urN cui116/Makefile cui117/Makefile --- cui116/Makefile 2014-04-16 00:00:00.000000000 +0900 +++ cui117/Makefile 2014-04-17 22:00:00.000000000 +0900 @@ -7,7 +7,7 @@ endif TARG = cui_test cui_srv -OBJS = cui.o select.o focus.o num.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 +OBJS = cui.o arg.o readable.o select.o sock.o focus.o num.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) @@ -31,6 +31,5 @@ clean: rm -f $(TARG) *.o *.a *~ - rm -f cui_midi # EOF diff -urN cui116/arg.c cui117/arg.c --- cui116/arg.c 1970-01-01 09:00:00.000000000 +0900 +++ cui117/arg.c 2014-04-17 22:00:00.000000000 +0900 @@ -0,0 +1,44 @@ +#include "arg.h" +#include +#include +#include + +static void +next_set(char **av, char ***next_av) +{ + if(next_av == NULL) return; + if(av == NULL || *av == NULL){ + *next_av = NULL; + }else{ + av++; + *next_av = *av ? av : NULL; + } +} + +int +cui_arg_exist(char **av, char *key, char ***next_av) +{ + if(av == NULL) return 0; + for(; *av; av++) if(strcmp(*av, key) == 0) break; + next_set(av, next_av); + return *av != NULL; +} + +char * +cui_arg_str(char **av, char *key, char *def, char ***next_av) +{ + char **nx; + if(!cui_arg_exist(av, key, &nx)) return def; + if(nx == NULL) return def; + next_set(nx, next_av); + return *nx; +} + +int +cui_arg_int(char **av, char *key, int def, char ***next_av) +{ + char *s = cui_arg_str(av, key, NULL, next_av); + return s ? strtol(s, NULL, 0) : def; +} + +/* EOF */ diff -urN cui116/arg.h cui117/arg.h --- cui116/arg.h 1970-01-01 09:00:00.000000000 +0900 +++ cui117/arg.h 2014-04-17 22:00:00.000000000 +0900 @@ -0,0 +1,8 @@ +#ifndef __ARG_H__ +#define __ARG_H__ + +int cui_arg_exist(char **av, char *key, char ***ret_av); +char *cui_arg_str(char **av, char *key, char *def, char ***ret_av); +int cui_arg_int(char **av, char *key, int def, char ***ret_av); + +#endif diff -urN cui116/cui.c cui117/cui.c --- cui116/cui.c 2014-04-17 00:00:00.000000000 +0900 +++ cui117/cui.c 2014-04-17 22:00:00.000000000 +0900 @@ -1,5 +1,8 @@ #include "cui.h" +#include "arg.h" +#include "readable.h" #include "select.h" +#include "sock.h" #include "focus.h" #include "rect.h" #include "esc.h" @@ -19,107 +22,28 @@ #include #include -/* --> for socket */ -#include -#include -#include -#include -#include -/* <-- for socket */ - #define KEY_FD 0 static int use_stdio = TRUE; - -static int -arg_idx(int ac, char **av, char *targ) -{ - int i; - - for(i=1; ih_addr, hp->h_length); - if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return -1; - if(connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){ - close(fd); - return -1; - } - return fd; -} - -int -cui_conn(char *s) -{ - int i, port; - char name[1024]; - - for(i=0; s[i]; i++) if(s[i] == ':') break; - if(i > 0 && s[i]){ - memcpy(name, s, i); - name[i] = '\0'; - }else strcpy(name, "localhost"); - i = s[i] ? i + 1 : 0; - port = strtol(s+i, NULL, 0); - - return cui_conn_host_port(name, port); -} - -int -cui_srv_port(int port) -{ - int sfd; - struct sockaddr_in saddr; - - if((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) ERR("socket"); - memset(&saddr, 0, sizeof(saddr)); - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = htonl(INADDR_ANY); - saddr.sin_port = htons(port); - if(bind(sfd, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) ERR("bind"); - if(listen(sfd, 5) == -1) ERR("listen"); - return sfd; -} - -int -cui_srv_accept(int sfd) -{ - struct sockaddr_in caddr; - socklen_t clen = sizeof(caddr); - int cfd; - - memset(&caddr, 0, clen); - if((cfd = accept(sfd, (struct sockaddr *)&caddr, &clen)) == -1) ERR("accept"); - return cfd; -} - -static int sfd = -1; +static fd_set sfds; +static int sfdn = 0; static void srv_accept(cui obj) { - int cfd; - - if(sfd == -1 || !cui_select_chk(sfd)) return; + int sfd, cfd; - cfd = cui_srv_accept(sfd); - cui_key_fd_add(cfd); - cui_puts_temp_fd_enter(cfd); - cui_esc_enter(); - cui_clear(obj); - cui_draw(obj); - cui_puts_temp_fd_exit(); + if(sfdn <= 0) return; + for(sfd=0; sfd 0){ - if(i+1 >= ac) ERR("-conn [name:]port"); - cui_key_fd_add(cui_conn(av[i+1])); - use_stdio = arg_idx(ac, av, "-stdio") > 0; - } - if((i = arg_idx(ac, av, "-srv")) > 0){ - if(i+1 >= ac) ERR("-srv port"); - sfd = cui_srv_port(strtol(av[i+1], NULL, 0)); + + av2 = av; + while((s = cui_arg_str(av2, "-conn", NULL, &av2)) != NULL){ + if((fd = cui_conn(s)) == -1) continue; + cui_key_fd_add(fd); + use_stdio = cui_arg_exist(av, "-stdio", NULL); + } + FD_ZERO(&sfds); + sfdn = 0; + av2 = av; + while((port = cui_arg_int(av2, "-srv", -1, &av2)) != -1){ + if((sfd = cui_srv_port(port)) == -1) ERR("cui_srv_port"); + FD_SET(sfd, &sfds); + sfdn++; cui_select_add(sfd); - use_stdio = arg_idx(ac, av, "-stdio") > 0; + use_stdio = cui_arg_exist(av, "-stdio", NULL); } if(use_stdio){ cui_key_fd_add(KEY_FD); @@ -577,56 +508,6 @@ cui_running_set(FALSE); } -typedef struct cui_readable{ - cui obj; - int fd; -} *cui_readable; - -static cui_list readable_list = NULL; - -void -cui_readable_add(cui obj, int fd) -{ - cui_readable p = cui_list_add(&readable_list, sizeof(struct cui_readable)); - p->obj = obj; - p->fd = fd; - cui_select_add(fd); -} - -void -cui_readable_del(cui obj, int fd) -{ - cui_list lp = readable_list; - cui_readable p; - for(; lp; lp=lp->next){ - p = (cui_readable)lp->data; - if(p->obj == obj && p->fd == fd) break; - } - if(lp == NULL) return; - cui_list_del(&readable_list, p); - cui_select_del(fd); -} - -void -cui_readable_add_bind(cui obj, int fd, cui_handler hdr, void *prm) -{ - cui_bind(obj, CUI_EVT_READABLE, hdr, prm); - cui_readable_add(obj, fd); -} - -static void -cui_readable_work(void) -{ - cui_list lp = readable_list, next; - cui_readable p; - for(; lp; lp=next){ - next = lp->next; - p = (cui_readable)lp->data; - if(!cui_select_chk(p->fd)) continue; - cui_handler_call(p->obj, CUI_EVT_READABLE, p->fd); - } -} - static void html_puts(char *s, void *prm) { diff -urN cui116/cui.h cui117/cui.h --- cui116/cui.h 2014-04-17 00:00:00.000000000 +0900 +++ cui117/cui.h 2014-04-17 22:00:00.000000000 +0900 @@ -44,14 +44,9 @@ extern cui_rect cui_clip; -int cui_init(int ac, char **av); +int cui_init(char **av); void cui_fini(int init_ret); -int cui_conn_host_port(char *host, int port); -int cui_conn(char *s); -int cui_srv_port(int port); -int cui_srv_accept(int sfd); - cui cui_alloc(int size); void cui_base_init(cui obj, cui parent, int x, int y, int w, int h); void cui_base_child_add(cui obj, cui child); @@ -101,10 +96,6 @@ int cui_running_get(void); void cui_running_set(int v); -void cui_readable_add(cui obj, int fd); -void cui_readable_del(cui obj, int fd); -void cui_readable_add_bind(cui obj, int fd, cui_handler hdr, void *prm); - void cui_quit(void); void cui_main(cui top_obj, cui init_focus); void cui_del(cui obj); diff -urN cui116/cui_srv.c cui117/cui_srv.c --- cui116/cui_srv.c 2014-04-17 00:00:00.000000000 +0900 +++ cui117/cui_srv.c 2014-04-17 22:00:00.000000000 +0900 @@ -3,6 +3,9 @@ #include #include #include "cui.h" +#include "arg.h" +#include "readable.h" +#include "sock.h" #include "scpanel.h" #include "tab.h" #include "term.h" @@ -12,45 +15,27 @@ #include "num.h" static int -arg_idx(int ac, char **av, char *targ) +w_get(char **av) { - int i; - - for(i=1; i 0 && i+1 < ac) return strtol(av[i+1], NULL, 0); + if((v = cui_arg_int(av, "-w", -1, NULL)) != -1) return v; if((cp = getenv("COLUMNS")) != NULL) return strtol(cp, NULL, 0); return 60; } static int -h_get(int ac, char **av) +h_get(char **av) { - int i; + int v; char *cp; - if((i = arg_idx(ac, av, "-h")) > 0 && i+1 < ac) return strtol(av[i+1], NULL, 0); + if((v = cui_arg_int(av, "-h", -1, NULL)) != -1) return v; if((cp = getenv("LINES")) != NULL) return strtol(cp, NULL, 0); return 20; } -static int -port_get(int ac, char **av) -{ - int i; - - if((i = arg_idx(ac, av, "-port")) > 0 && i+1 < ac) return strtol(av[i+1], NULL, 0); - ERR("-port port"); -} - static void client_add(cui tab, int cfd) { @@ -74,8 +59,8 @@ switch(evt){ case CUI_EVT_READABLE: - sfd = *(int *)prm; - cfd = cui_srv_accept(sfd); + sfd = val; + if((cfd = cui_srv_accept(sfd)) == -1) return FALSE; client_add(obj, cfd); break; default: @@ -175,17 +160,21 @@ int main(int ac, char **av) { - int port = port_get(ac, av); - int sfd = cui_srv_port(port); - - int init_ret = cui_init(ac, av); - cui bs = cui_scpanel_new(NULL, 0, 0, w_get(ac, av), h_get(ac, av), "cui_srv"); + int init_ret = cui_init(av); + cui bs = cui_scpanel_new(NULL, 0, 0, w_get(av), h_get(av), "cui_srv"); cui view = ((cui_scpanel)bs)->view; cui conn = cui_button_new(view, 0, 0, "conn"); cui tab = cui_tab_new(view, cui_x2(conn) + 1, 0, 0, NULL, NULL, FALSE); + char **av2 = av; + int port, sfd; - cui_readable_add_bind(tab, sfd, tab_hdr, &sfd); + cui_bind(tab, CUI_EVT_READABLE, tab_hdr, NULL); + while((port = cui_arg_int(av2, "-port", -1, &av2)) != -1){ + if((sfd = cui_srv_port(port)) == -1) continue; + cui_readable_add(tab, sfd); + } cui_bind(view, CUI_EVT_DEAD | CUI_EVT_RESIZE, view_hdr, tab); + conn_prm_new(conn, tab); cui_main(bs, NULL); diff -urN cui116/cui_test.c cui117/cui_test.c --- cui116/cui_test.c 2014-04-15 23:00:00.000000000 +0900 +++ cui117/cui_test.c 2014-04-17 22:00:00.000000000 +0900 @@ -3,6 +3,7 @@ #include #include #include "cui.h" +#include "sock.h" #include "esc.h" #include "handler.h" #include "label.h" @@ -412,7 +413,7 @@ int main(int ac, char **av) { - int init_ret = cui_init(ac, av); + int init_ret = cui_init(av); cui bs = cui_scpanel_new(NULL, 0, 0, 42, 23, "cui_test"); cui bs_view = ((cui_scpanel)bs)->view; cui bs_bar = cui_base_new(bs_view, 0, 1, 0, 0); diff -urN cui116/dbg.c cui117/dbg.c --- cui116/dbg.c 2014-04-12 23:00:00.000000000 +0900 +++ cui117/dbg.c 2014-04-17 22:00:00.000000000 +0900 @@ -1,48 +1,50 @@ #include "dbg.h" +#include "arg.h" +#include "sock.h" #include #include #include #include +#include -static FILE *fp = NULL; +static int fd = -1; int cui_dbg_enable = 1; void -cui_dbg_open(int ac, char **av) +cui_dbg_open(char **av) { - char buf[1024]; - int i; - char *nc_opt = "localhost 12345"; + char *s; - if(fp) return; + if(fd != -1) return; - for(i=1; i= ac) return; + if(!cui_arg_exist(av, "-dbg", NULL)) return; + s = cui_arg_str(av, "-dbg", "localhost:12345", NULL); - if(i+1 < ac) nc_opt = av[i+1]; - sprintf(buf, "nc %s", nc_opt); - if((fp = popen(buf, "w")) == NULL) perror("popen"); + fd = cui_conn(s); } void cui_dbg_close(void) { - if(fp) pclose(fp); + if(fd != -1){ + close(fd); + fd = -1; + } } void cui_dbg(char *fmt, ...) { va_list ap; + char buf[1024]; - if(!fp) return; + if(fd == -1) return; if(!cui_dbg_enable) return; va_start(ap, fmt); - vfprintf(fp, fmt, ap); - fflush(fp); + vsprintf(buf, fmt, ap); + write(fd, buf, strlen(buf)); va_end(ap); } diff -urN cui116/dbg.h cui117/dbg.h --- cui116/dbg.h 2014-04-12 23:00:00.000000000 +0900 +++ cui117/dbg.h 2014-04-17 22:00:00.000000000 +0900 @@ -5,7 +5,7 @@ extern int cui_dbg_enable; -void cui_dbg_open(int ac, char **av); +void cui_dbg_open(char **av); void cui_dbg_close(void); void cui_dbg(char *fmt, ...); diff -urN cui116/readable.c cui117/readable.c --- cui116/readable.c 1970-01-01 09:00:00.000000000 +0900 +++ cui117/readable.c 2014-04-17 22:00:00.000000000 +0900 @@ -0,0 +1,56 @@ +#include "readable.h" +#include "select.h" +#include "handler.h" +#include + +typedef struct cui_readable{ + cui obj; + int fd; +} *cui_readable; + +static cui_list readable_list = NULL; + +void +cui_readable_add(cui obj, int fd) +{ + cui_readable p = cui_list_add(&readable_list, sizeof(struct cui_readable)); + p->obj = obj; + p->fd = fd; + cui_select_add(fd); +} + +void +cui_readable_del(cui obj, int fd) +{ + cui_list lp = readable_list; + cui_readable p; + for(; lp; lp=lp->next){ + p = (cui_readable)lp->data; + if(p->obj == obj && p->fd == fd) break; + } + if(lp == NULL) return; + cui_list_del(&readable_list, p); + cui_select_del(fd); +} + +void +cui_readable_add_bind(cui obj, int fd, cui_handler hdr, void *prm) +{ + cui_bind(obj, CUI_EVT_READABLE, hdr, prm); + cui_readable_add(obj, fd); +} + +void +cui_readable_work(void) +{ + cui_list lp = readable_list, next; + cui_readable p; + for(; lp; lp=next){ + next = lp->next; + p = (cui_readable)lp->data; + if(!cui_select_chk(p->fd)) continue; + cui_handler_call(p->obj, CUI_EVT_READABLE, p->fd); + } +} + +/* EOF */ diff -urN cui116/readable.h cui117/readable.h --- cui116/readable.h 1970-01-01 09:00:00.000000000 +0900 +++ cui117/readable.h 2014-04-17 22:00:00.000000000 +0900 @@ -0,0 +1,11 @@ +#ifndef __READABLE_H__ +#define __READABLE_H__ + +#include "cui.h" + +void cui_readable_add(cui obj, int fd); +void cui_readable_del(cui obj, int fd); +void cui_readable_add_bind(cui obj, int fd, cui_handler hdr, void *prm); +void cui_readable_work(void); + +#endif diff -urN cui116/sock.c cui117/sock.c --- cui116/sock.c 1970-01-01 09:00:00.000000000 +0900 +++ cui117/sock.c 2014-04-17 22:00:00.000000000 +0900 @@ -0,0 +1,83 @@ +#include "sock.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int +cui_conn_host_port(char *host, int port) +{ + struct sockaddr_in addr; + struct hostent *hp; + int fd; + + if((hp = gethostbyname(host)) == NULL) return -1; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); + if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return -1; + if(connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){ + close(fd); + return -1; + } + return fd; +} + +int +cui_conn(char *s) +{ + int i, port; + char name[1024]; + + for(i=0; s[i]; i++) if(s[i] == ':') break; + if(i > 0 && s[i]){ + memcpy(name, s, i); + name[i] = '\0'; + }else strcpy(name, "localhost"); + i = s[i] ? i + 1 : 0; + port = strtol(s+i, NULL, 0); + + return cui_conn_host_port(name, port); +} + +int +cui_srv_port(int port) +{ + int sfd; + struct sockaddr_in saddr; + + if((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return -1; + memset(&saddr, 0, sizeof(saddr)); + saddr.sin_family = AF_INET; + saddr.sin_addr.s_addr = htonl(INADDR_ANY); + saddr.sin_port = htons(port); + if(bind(sfd, (struct sockaddr *)&saddr, sizeof(saddr)) == -1){ + close(sfd); + return -1; + } + if(listen(sfd, 5) == -1){ + close(sfd); + return -1; + } + return sfd; +} + +int +cui_srv_accept(int sfd) +{ + struct sockaddr_in caddr; + socklen_t clen = sizeof(caddr); + int cfd; + + memset(&caddr, 0, clen); + if((cfd = accept(sfd, (struct sockaddr *)&caddr, &clen)) == -1) return -1; + return cfd; +} + +/* EOF */ diff -urN cui116/sock.h cui117/sock.h --- cui116/sock.h 1970-01-01 09:00:00.000000000 +0900 +++ cui117/sock.h 2014-04-17 22:00:00.000000000 +0900 @@ -0,0 +1,9 @@ +#ifndef __SOCK_H__ +#define __SOCK_H__ + +int cui_conn_host_port(char *host, int port); +int cui_conn(char *s); +int cui_srv_port(int port); +int cui_srv_accept(int sfd); + +#endif diff -urN cui116/term.c cui117/term.c --- cui116/term.c 2014-04-16 22:00:00.000000000 +0900 +++ cui117/term.c 2014-04-17 22:00:00.000000000 +0900 @@ -1,6 +1,7 @@ #define _XOPEN_SOURCE 600 #include "term.h" +#include "readable.h" #include "handler.h" #include "fill.h" #include "rszbox.h"