Merge branch 'master' into socket
[doldaconnect.git] / clients / tty / dcsh.c
index 4354acf..60904b9 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <errno.h>
 #include <locale.h>
+#include <stdint.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -33,6 +34,7 @@
 #include <doldaconnect/uimisc.h>
 #include <doldaconnect/utils.h>
 
+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);
 }