X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain.c;h=d6782190ffd1055f92092194f50eae81ea5c9fc8;hb=e0c59f7f4ddb73390dc9c16569254c0e2a921931;hp=721cd9aa0b1167d897ef931ed16c52c704b3259f;hpb=2f4fb7c15c5017546238241ea318b16b9a032c52;p=oftp diff --git a/src/main.c b/src/main.c index 721cd9a..d678219 100644 --- a/src/main.c +++ b/src/main.c @@ -1,66 +1,238 @@ +#include +#include +#include +#include +#include +#include #include "tgfx.h" #include "input.h" +#include "util.h" #include "tui.h" #include "ftp.h" -struct ftp *ftp; -struct tui_widget *uilist; +void updateui(void); +int proc_input(void); +int keypress(int key); +int parse_args(int argc, char **argv); -int main(void) +static struct ftp *ftp; +static struct tui_widget *uilist; + +static char *host = "localhost"; +static int port = 21; + +int main(int argc, char **argv) { - union event ev; + int i, numsock, maxfd; + int ftpsock[16]; + fd_set rdset; + struct timeval tv; + + if(parse_args(argc, argv) == -1) { + return 1; + } if(!(ftp = ftp_alloc())) { return 1; } - if(ftp_connect(ftp, "192.168.0.4", 21) == -1) { + if(ftp_connect(ftp, host, port) == -1) { ftp_free(ftp); return 1; } init_input(); + tg_init(); + tg_bgchar(' '); tg_clear(); uilist = tui_list("Remote", 0, 0, 40, 23, 0, 0); - tui_add_list_item(uilist, "first item"); - tui_add_list_item(uilist, "second item"); - tui_add_list_item(uilist, "another item"); - tui_add_list_item(uilist, "foo"); - - /* - tg_bgcolor(1); - tg_rect("Remote", 0, 0, 40, 23, TGFX_FRAME); - tg_rect("Local", 40, 0, 40, 23, TGFX_FRAME); - - tg_bgcolor(0); - tg_fgcolor(7); - tg_text(0, 23, ">"); - tg_setcursor(2, 23); - */ + + tg_setcursor(0, 23); tui_draw(uilist); - while(wait_input(&ev)) { + for(;;) { + FD_ZERO(&rdset); + maxfd = 0; + + numsock = ftp_sockets(ftp, ftpsock, sizeof ftpsock); + for(i=0; i maxfd) maxfd = ftpsock[i]; + } + +#ifdef __unix__ + FD_SET(0, &rdset); + tv.tv_sec = 120; + tv.tv_usec = 0; +#else + tv.tv_sec = tv.tv_usec = 0; +#endif + + if(select(maxfd + 1, &rdset, 0, 0, &tv) == -1 && errno == EINTR) { + continue; + } + +#ifdef __unix__ + if(FD_ISSET(0, &rdset)) { + if(proc_input() == -1) { + break; + } + } +#endif + + for(i=0; icurdir_rem && strcmp(tui_get_title(uilist), ftp->curdir_rem) != 0) { + tui_set_title(uilist, ftp->curdir_rem); + upd |= 1; + } + + if(ftp->modified & FTP_MOD_REMDIR) { + tui_clear_list(uilist); + + ent = ftp->dent_rem; + while(ent) { + if(ent->type == FTP_DIR) { + sprintf(buf, "%s/", ent->name); + tui_add_list_item(uilist, buf); + } else { + tui_add_list_item(uilist, ent->name); + } + ent = ent->next; + } + + //tui_sort_list(uilist, cmpnames); + tui_list_select(uilist, 0); + + ftp->modified &= ~FTP_MOD_REMDIR; + upd |= 1; + } + + if(tui_isdirty(uilist) || upd & 1) { + tui_draw(uilist); + } +} + +int proc_input(void) +{ + union event ev; + + while(poll_input(&ev)) { switch(ev.type) { case EV_KEY: - if(ev.key.key == 27) goto done; + if(keypress(ev.key.key) == -1) { + return -1; + } break; default: break; } } + return 0; +} -done: - tg_bgchar(' '); - tg_bgcolor(0); - tg_fgcolor(7); - tg_clear(); +int keypress(int key) +{ + switch(key) { + case 27: + case 'q': + return -1; - cleanup_input(); + case KB_UP: + tui_list_sel_prev(uilist); + break; + case KB_DOWN: + tui_list_sel_next(uilist); + break; + case KB_LEFT: + tui_list_sel_start(uilist); + break; + case KB_RIGHT: + tui_list_sel_end(uilist); + break; + + default: + break; + } + return 0; +} + +static const char *usage = "Usage: %s [options] [hostname] [port]\n" + "Options:\n" + " -h: print usage information and exit\n"; + +int parse_args(int argc, char **argv) +{ + int i, argidx = 0; + + for(i=1; i