X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=clients%2Ftty%2Fdcsh.c;h=60904b9be54932bb3de35b1f79527f138928a84a;hb=51da262d8d796aa8a31ee1513783735a40130931;hp=4354acfc79a967a1b953f3eb2a1d48adaefb5fa0;hpb=c8817ca24ba391abdce2c989ceb37ac496eb5ff8;p=doldaconnect.git diff --git a/clients/tty/dcsh.c b/clients/tty/dcsh.c index 4354acf..60904b9 100644 --- a/clients/tty/dcsh.c +++ b/clients/tty/dcsh.c @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -33,6 +34,7 @@ #include #include +int interactive = 0; int verbose = 0; int dcfd; @@ -41,33 +43,87 @@ struct cmd { int (*handler)(int argc, wchar_t **argv); }; +void wcslimit(wchar_t *wcs, int limit) { + int i; + + if(wcslen(wcs) > limit) { + for(i = limit - 3; i < limit; i++) + wcs[i] = L'.'; + wcs[i] = L'\0'; + } +} + +void wcslimitr(wchar_t *wcs, int limit) { + int i; + + if((i = wcslen(wcs)) > limit) { + memmove(wcs + 3, wcs + (i - limit + 3), sizeof(wchar_t) * (limit - 2)); + for(i = 0; i < 3; i++) + wcs[i] = L'.'; + } +} + int cmd_lsnodes(int argc, wchar_t **argv) { - int i; struct dc_response *resp; struct dc_intresp *ires; resp = dc_gettaggedrespsync(dc_queuecmd(NULL, NULL, L"lsnodes", NULL)); if(resp->code == 200) { - printf(" ID NET USERS S NAME\n"); + if(interactive) { + printf("ID NET USERS S NAME\n"); + printf("----- ---- ------ - ----------------------------------------------------------\n"); + } while((ires = dc_interpret(resp)) != NULL) { - if(wcslen(ires->argv[2].val.str) > 58) { - for(i = 55; i < 58; i++) - ires->argv[2].val.str[i] = L'.'; - ires->argv[2].val.str[i] = L'\0'; + if(interactive) + wcslimit(ires->argv[2].val.str, 58); + printf("%-5i %-4ls %-6i %c %ls\n", ires->argv[0].val.num, ires->argv[1].val.str, ires->argv[3].val.num, "SHED"[ires->argv[4].val.num], ires->argv[2].val.str); + dc_freeires(ires); + } + } else if(resp->code == 201) { + } else { + fprintf(stderr, "dcsh: %ls\n", resp->rlines[0].argv[0]); + return(1); + } + return(0); +} + +int cmd_lsdl(int argc, wchar_t **argv) +{ + struct dc_response *resp; + struct dc_intresp *ires; + wchar_t *file, *p; + + resp = dc_gettaggedrespsync(dc_queuecmd(NULL, NULL, L"lstrans", NULL)); + if(resp->code == 200) { + if(interactive) { + printf("ID S USER PROGRESS FILE\n"); + printf("------- - ---------- ------------- -------------------------------------------\n"); + } + while((ires = dc_interpret(resp)) != NULL) { + if(ires->argv[1].val.num == DC_TRNSD_DOWN) { + file = ires->argv[5].val.str; + if((p = wcsrchr(file, L'/')) != NULL) + file = p + 1; + if(interactive) { + wcslimit(ires->argv[4].val.str, 10); + wcslimit(file, 43); + } + printf("%-7i %c %-10ls %'-13ji %ls\n", ires->argv[0].val.num, "SHED"[ires->argv[2].val.num], ires->argv[4].val.str, (intmax_t)ires->argv[7].val.lnum, file); } - printf("%5i %4ls %6i %c %ls\n", ires->argv[0].val.num, ires->argv[1].val.str, ires->argv[3].val.num, "SHED"[ires->argv[4].val.num], ires->argv[2].val.str); dc_freeires(ires); } } else if(resp->code == 201) { } else { fprintf(stderr, "dcsh: %ls\n", resp->rlines[0].argv[0]); + return(1); } return(0); } struct cmd commands[] = { {L"hubs", cmd_lsnodes}, + {L"lsdl", cmd_lsdl}, {NULL, NULL} }; @@ -115,6 +171,10 @@ int shell(void) int cmddata; struct pollfd pfd[2]; + if(interactive) { + fprintf(stderr, "dcsh> "); + fflush(stderr); + } cmddata = 0; while(1) { pfd[0].fd = dcfd; @@ -138,6 +198,8 @@ int shell(void) fprintf(stderr, "dcsh: stdin: %s\n", strerror(errno)); return(1); } else if(ret == 0) { + if(interactive) + fprintf(stderr, "\n"); return(0); } cmddata += ret; @@ -154,6 +216,10 @@ int shell(void) dc_freewcsarr(argv); } memmove(cmdbuf, p, cmddata -= (p - cmdbuf)); + if(interactive) { + fprintf(stderr, "dcsh> "); + fflush(stderr); + } } } } @@ -207,9 +273,12 @@ int main(int argc, char **argv) } if(verbose) fprintf(stderr, "done\n"); - if(optind < argc) + if(optind < argc) { + interactive = isatty(1); rv = runchar(argc - optind, argv + optind); - else + } else { + interactive = isatty(0); rv = shell(); + } return(rv); }