diff -urN cui108/cui.c cui109/cui.c --- cui108/cui.c Sat Apr 12 23:00:00 2014 +++ cui109/cui.c Sun Apr 13 22:00:00 2014 @@ -65,6 +65,54 @@ return fd; } +static int sfd = -1; + +static void +srv(char *s) +{ + int port = strtol(s, NULL, 0); + 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"); +} + +static void +srv_accept(cui obj) +{ + struct sockaddr_in caddr; + int clen = sizeof(caddr), cfd; + + if(sfd == -1 || !cui_select_chk(sfd)) return; + + memset(&caddr, 0, clen); + if((cfd = accept(sfd, (struct sockaddr *)&caddr, &clen)) == -1) ERR("accept"); + + 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(); +} + +static void +disconn(void) +{ + int fd = cui_key_last_fd; + if(fd == 0) return; + cui_puts_temp_fd_enter(fd); + cui_esc_exit(); + cui_puts_temp_fd_exit(); + cui_key_fd_del(fd); + close(fd); +} + int cui_init(int ac, char **av) { @@ -78,6 +126,12 @@ cui_key_fd_add(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"); + srv(av[i+1]); + cui_select_add(sfd); + use_stdio = arg_idx(ac, av, "-stdio") > 0; + } if(use_stdio){ cui_key_fd_add(KEY_FD); cui_key_enter(); @@ -627,7 +681,7 @@ cmenu(cui obj, int key) { cui mn; - char *lst[] = { "Cancel", "^C", "Redraw", "HTML", "Quit", NULL }, *s; + char *lst[] = { "Cancel", "^C", "Redraw", "Disconn", "HTML", "Quit", NULL }, *s; if(key != CUI_KEY_CTRL('C')) return key; @@ -643,6 +697,7 @@ cui_clear(obj); cui_draw(obj); }else if(strcmp(s, "HTML") == 0) html(cui_root(obj)); + else if(strcmp(s, "Disconn") == 0) disconn(); /* else Cancel */ return 0; } @@ -668,6 +723,7 @@ cui_timer_work(); if(cui_select(100*1000) <= 0) continue; cui_readable_work(); + srv_accept(top_obj); if((key = cui_key_get2()) == 0) continue; if(cmenu(top_obj, key) == 0) continue; focus = cui_focus_get(); @@ -747,6 +803,27 @@ for(; lp; lp=lp->next) if(*(puts_func *)lp->data == f) break; if(lp == NULL) return; cui_list_del(&puts_list, lp->data); +} + +static void +temp_puts(char *s, void *prm) +{ + int fd = *(int *)prm, n = strlen(s); + write(fd, s, n); +} + +void +cui_puts_temp_fd_enter(int fd) +{ + static int tmp_fd; + tmp_fd = fd; + cui_puts_add(temp_puts, &tmp_fd); +} + +void +cui_puts_temp_fd_exit(void) +{ + cui_puts_del(temp_puts); } void diff -urN cui108/cui.h cui109/cui.h --- cui108/cui.h Sat Apr 12 23:00:00 2014 +++ cui109/cui.h Sun Apr 13 22:00:00 2014 @@ -108,6 +108,8 @@ typedef void (*puts_func)(char *, void *prm); void cui_puts_add(puts_func f, void *prm); void cui_puts_del(puts_func f); +void cui_puts_temp_fd_enter(int fd); +void cui_puts_temp_fd_exit(void); void cui_puts(char *s); #endif diff -urN cui108/key.c cui109/key.c --- cui108/key.c Sat Apr 12 23:00:00 2014 +++ cui109/key.c Sun Apr 13 22:00:00 2014 @@ -76,6 +76,8 @@ } } +int cui_key_last_fd = -1; + static int key_get(int fd) { @@ -83,6 +85,7 @@ if(!cui_select_readable_chk(fd, 100*1000)) return 0; if(read(fd, &uc, 1) != 1) return 0; + cui_key_last_fd = fd; return uc; } diff -urN cui108/key.h cui109/key.h --- cui108/key.h Sat Apr 12 23:00:00 2014 +++ cui109/key.h Sun Apr 13 22:00:00 2014 @@ -26,4 +26,6 @@ int cui_key_get(void); int cui_key_get2(void); +extern int cui_key_last_fd; + #endif