Only print file link name in lsdl.
[doldaconnect.git] / clients / tty / dcsh.c
index 3627295..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>
@@ -52,6 +53,16 @@ void wcslimit(wchar_t *wcs, int limit) {
     }
 }
 
+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)
 {
     struct dc_response *resp;
@@ -60,24 +71,59 @@ int cmd_lsnodes(int argc, wchar_t **argv)
     resp = dc_gettaggedrespsync(dc_queuecmd(NULL, NULL, L"lsnodes", NULL));
     if(resp->code == 200) {
        if(interactive) {
-           printf("   ID  NET  USERS S NAME\n");
+           printf("ID    NET  USERS  S NAME\n");
            printf("----- ---- ------ - ----------------------------------------------------------\n");
        }
        while((ires = dc_interpret(resp)) != NULL) {
            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);
+           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);
+           }
            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}
 };