Fixed up doldacond-shell for 64-bit transfers.
[doldaconnect.git] / clients / gui-shell / dsh.c
index 62cf0e4..8e10cc8 100644 (file)
@@ -30,6 +30,7 @@
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include <stdarg.h>
+#include <stdint.h>
 #include <doldaconnect/uilib.h>
 #include <doldaconnect/uimisc.h>
 #include <doldaconnect/utils.h>
 
 struct trinfo {
     int ostate;
-    int opos, spos, speed;
+    intmax_t opos, spos;
+    int speed;
     time_t lastprog;
+    int warned;
     double sprog;
 };
 
@@ -201,7 +204,8 @@ void updatetooltip(void)
 {
     struct dc_transfer *tr;
     struct trinfo *tri;
-    int t, i, a, st, bc, bt;
+    int t, i, a, st;
+    intmax_t bc, bt;
     char *buf;
     size_t bufsize, bufdata;
     
@@ -288,11 +292,14 @@ void updatetrinfo(void)
            if(tri->opos != tr->curpos) {
                tri->opos = tr->curpos;
                tri->lastprog = now;
+               tri->warned = 0;
            }
-#ifdef NOTIFY
-           if((tr->state = DC_TRNS_MAIN) && (now - tri->lastprog > 600)) {
-               if(dcpid == 0)
+#ifdef HAVE_NOTIFY
+           if((tr->state = DC_TRNS_MAIN) && (now - tri->lastprog > 600) && !tri->warned) {
+               if(dcpid == 0) {
                    notify(&trnote, "transfer.error", _("Transfer stalled"), _("The transfer of %ls from %ls has not made progress for 10 minutes"), getfilename(tr->path), tr->peernick);
+                   tri->warned = 1;
+               }
            }
 #endif
            if((tr->state == DC_TRNS_MAIN) && (dnow - tri->sprog > 10)) {
@@ -392,6 +399,7 @@ void startdaemon(void)
 {
     char pf[1024];
     int pfd[2], i;
+    sigset_t ss;
     
     if(getenv("HOME") != NULL)
        snprintf(pf, sizeof(pf), "%s/.doldacond.pid", getenv("HOME"));
@@ -399,7 +407,11 @@ void startdaemon(void)
        snprintf(pf, sizeof(pf), "%s/.doldacond.pid", getpwuid(getuid())->pw_dir);
     if(access(pf, F_OK) || !running(pf)) {
        pipe(pfd);
+       sigemptyset(&ss);
+       sigaddset(&ss, SIGCHLD);
+       sigprocmask(SIG_BLOCK, &ss, NULL);
        if((dpid = fork()) == 0) {
+           sigprocmask(SIG_UNBLOCK, &ss, NULL);
            dup2(pfd[1], 2);
            for(i = 3; i < FD_SETSIZE; i++)
                close(i);
@@ -415,6 +427,7 @@ void startdaemon(void)
        create_start_wnd();
        gtk_widget_show(start_wnd);
        gtk_status_icon_set_tooltip(tray, _("Starting..."));
+       sigprocmask(SIG_UNBLOCK, &ss, NULL);
     } else {
        connectdc();
     }
@@ -549,7 +562,7 @@ int main(int argc, char **argv)
 #ifdef HAVE_NOTIFY
     notify_init("Dolda Connect");
 #endif
-    while((c = getopt(argc, argv, "rhs:")) != -1) {
+    while((c = getopt(argc, argv, "Vrhs:")) != -1) {
        switch(c) {
        case 'r':
            remote = 1;
@@ -563,6 +576,10 @@ int main(int argc, char **argv)
            printf("usage: doldacond-shell [-hr]\n");
            printf("\t-h\tDisplay this help message\n");
            printf("\t-r\tConnect to a remote host\n");
+           printf("\t-V\tDisplay version info and exit\n");
+           exit(0);
+       case 'V':
+           printf("%s", RELEASEINFO);
            exit(0);
        default:
            fprintf(stderr, "usage: doldacond-shell [-hr]\n");