Merge branch 'master' of pc18:/srv/git/r/doldaconnect
authorFredrik Tolf <fredrik@dolda2000.com>
Thu, 14 Feb 2008 06:08:01 +0000 (07:08 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Thu, 14 Feb 2008 06:08:01 +0000 (07:08 +0100)
26 files changed:
ChangeLog
clients/gnome-trans-applet/conduit.c
clients/gnome-trans-applet/conduit.h
clients/gnome-trans-applet/dolcon-trans-applet.c
clients/gtk2/Makefile.am
clients/gtk2/dolcon.c
clients/gui-shell/dsh.c
clients/test.c
clients/tty/dcsh.c
daemon/Makefile.am
daemon/client.h
daemon/fnet-dc.c
daemon/net.c
daemon/search.h
daemon/transfer.c
daemon/transfer.h
daemon/ui.c
include/doldaconnect/uilib.h
include/doldaconnect/uimisc.h
lib/Makefile.am
lib/guile/dolcon-guile.c
lib/makecmds
lib/python/dolmod.c
lib/uicmds
lib/uilib.c
lib/uimisc.c

index b46e100..feecc18 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 Version 1.1:
 
+       * Handles file sizes larger than 2 GiB
        * Ported the Guile plugin to Guile 1.8
        
 Version 1.0:
index 5959a27..e667ee6 100644 (file)
@@ -28,13 +28,13 @@ struct transfer *findtransferbytag(struct conduit *conduit, char *tag)
     return(transfer);
 }
 
-void transfersetsize(struct transfer *transfer, int size)
+void transfersetsize(struct transfer *transfer, intmax_t size)
 {
     transfer->size = size;
     cb_trsize(transfer, transfer->conduit->udata);
 }
 
-void transfersetpos(struct transfer *transfer, int pos)
+void transfersetpos(struct transfer *transfer, intmax_t pos)
 {
     transfer->pos = pos;
     cb_trpos(transfer, transfer->conduit->udata);
index d38875b..0d3b15c 100644 (file)
@@ -2,6 +2,7 @@
 #define _CONDUIT_H
 
 #include <sys/types.h>
+#include <stdint.h>
 
 #define CNDS_IDLE 0
 #define CNDS_SYN 1
@@ -12,9 +13,9 @@ struct transfer
     struct transfer *next, *prev;
     struct conduit *conduit;
     char *tag; /* UTF8 */
-    int pos, size;
+    intmax_t pos, size;
     time_t cmptime, ckptime;
-    size_t cmpsize, ckpsize;
+    intmax_t cmpsize, ckpsize;
     int timeout;
 };
 
@@ -35,8 +36,8 @@ struct conduitiface
 };
 
 struct transfer *findtransferbytag(struct conduit *conduit, char *tag);
-void transfersetsize(struct transfer *transfer, int size);
-void transfersetpos(struct transfer *transfer, int pos);
+void transfersetsize(struct transfer *transfer, intmax_t size);
+void transfersetpos(struct transfer *transfer, intmax_t pos);
 struct transfer *newtransfer(struct conduit *conduit, char *tag, int size, int pos);
 void freetransfer(struct transfer *transfer);
 struct conduit *newconduit(struct conduitiface *iface, void *udata);
index 0495560..6b4a6e9 100644 (file)
@@ -126,7 +126,7 @@ static void update(struct appletdata *data)
        } else {
            if((data->curdisplay->pos > 0) && (data->curdisplay->size > 0))
            {
-               sprintf(buf, "%'i/%'i", data->curdisplay->pos, data->curdisplay->size);
+               sprintf(buf, "%'ji/%'ji", (intmax_t)data->curdisplay->pos, (intmax_t)data->curdisplay->size);
                gtk_progress_bar_set_fraction(data->pbar, (double)data->curdisplay->pos / (double)data->curdisplay->size);
                gtk_progress_bar_set_text(data->pbar, buf);
            } else {
index 813c8fe..062265f 100644 (file)
@@ -19,7 +19,7 @@ localedir=$(datadir)/locale
 dolcon_LDFLAGS=        @GTK2_LIBS@ @LIBXML_LIBS@ -lbz2
 dolcon_LDADD=$(top_srcdir)/lib/libdcui.la $(top_srcdir)/common/libhttp.a
 dolcon_CPPFLAGS=@GTK2_CFLAGS@ @LIBXML_CFLAGS@ \
-               -DLOCALEDIR=\"$(localedir)\"
+               -DLOCALEDIR=\"$(localedir)\" -D_GNU_SOURCE
 
 .desc.gtk: $(top_srcdir)/common/makegdesc
        target="$@"; \
index 18a0a38..60374f3 100644 (file)
@@ -52,7 +52,7 @@
 
 struct trdata
 {
-    size_t poshist[TRHISTSIZE];
+    dc_lnum_t poshist[TRHISTSIZE];
     double timehist[TRHISTSIZE];
     int hc;
 };
@@ -64,7 +64,7 @@ struct fndata
 
 struct srchsize
 {
-    int size;
+    gint64 size;
     int num;
     int slots;
     double resptime;
@@ -294,7 +294,7 @@ char *bytes2si(long long bytes)
 void progressfunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 {
     int totalc, curc;
-    int total, cur;
+    gint64 total, cur;
     char buf[64];
     
     totalc = (GPOINTER_TO_INT(data) & 0xff00) >> 8;
@@ -307,7 +307,7 @@ void progressfunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *m
     if(cur < 0) {
        g_object_set(rend, "text", "", NULL);
     } else {
-       snprintf(buf, 64, "%'i", cur);
+       snprintf(buf, 64, "%'ji", (intmax_t)cur);
        g_object_set(rend, "text", buf, NULL);
     }
 }
@@ -326,13 +326,14 @@ void percentagefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel
 
 void transnicebytefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 {
-    int colnum, val;
+    int colnum;
+    gint64 val;
     char buf[64];
     
     colnum = GPOINTER_TO_INT(data);
     gtk_tree_model_get(model, iter, colnum, &val, -1);
     if(val >= 0)
-       snprintf(buf, 64, "%'i", val);
+       snprintf(buf, 64, "%'ji", (intmax_t)val);
     else
        strcpy(buf, _("Unknown"));
     g_object_set(rend, "text", buf, NULL);
@@ -341,7 +342,7 @@ void transnicebytefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeMod
 void transnicebytefunc2(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 {
     int colnum;
-    long long val;
+    gint64 val;
     char buf[64];
     
     colnum = GPOINTER_TO_INT(data);
@@ -369,7 +370,8 @@ void hidezerofunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *m
 
 void speedtimefunc(GtkTreeViewColumn *col, GtkCellRenderer *rend, GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 {
-    int speed, size, time;
+    int speed, time;
+    gint64 size;
     char buf[64];
     
     gtk_tree_model_get(model, iter, 4, &size, 8, &speed, -1);
@@ -476,7 +478,8 @@ void updatetransferlists(void)
     int id;
     char *buf;
     char *peerid, *peernick, *path, *hash;
-    int state, dir, size, curpos, error;
+    int state, dir, error;
+    gint64 size, curpos;
     time_t errortime;
     GtkListStore *stores[3];
     
@@ -509,10 +512,10 @@ void updatetransferlists(void)
                        if(state != transfer->state)
                            gtk_list_store_set(stores[i], &iter, 2, transfer->state, 8, gettrstatestock(transfer->state), -1);
                        if(size != transfer->size)
-                           gtk_list_store_set(stores[i], &iter, 6, transfer->size, -1);
+                           gtk_list_store_set(stores[i], &iter, 6, (gint64)transfer->size, -1);
                        if(curpos != transfer->curpos)
                        {
-                           gtk_list_store_set(stores[i], &iter, 7, transfer->curpos, -1);
+                           gtk_list_store_set(stores[i], &iter, 7, (gint64)transfer->curpos, -1);
                            if(transfer->udata != NULL)
                                updatetrdata(transfer);
                        }
@@ -561,8 +564,8 @@ void updatetransferlists(void)
                                   3, peerid,
                                   4, peernick,
                                   5, path,
-                                  6, transfer->size,
-                                  7, transfer->curpos,
+                                  6, (gint64)transfer->size,
+                                  7, (gint64)transfer->curpos,
                                   8, gettrstatestock(transfer->state),
                                   9, 0.0,
                                   10, transfer->error,
@@ -1124,13 +1127,13 @@ void handleresps(void)
                    {
                        for(i = 0; i < numsizes; i++)
                        {
-                           if(srchsizes[i].size == ires->argv[4].val.num)
+                           if(srchsizes[i].size == ires->argv[4].val.lnum)
                                break;
                        }
                        if(i == numsizes)
                        {
                            srchsizes = srealloc(srchsizes, sizeof(*srchsizes) * ++numsizes);
-                           srchsizes[i].size = ires->argv[4].val.num;
+                           srchsizes[i].size = (gint64)ires->argv[4].val.lnum;
                            srchsizes[i].num = 1;
                            srchsizes[i].slots = ires->argv[5].val.num;
                            srchsizes[i].resptime = ires->argv[7].val.flnum;
@@ -1202,7 +1205,7 @@ void handleresps(void)
                            gtk_tree_store_set(srchmodel, &titer, 9, buf, -1);
                            free(buf);
                        }
-                       gtk_tree_store_set(srchmodel, &titer, 4, ires->argv[4].val.num, 5, ires->argv[5].val.num, 6, ires->argv[7].val.flnum, 8, -1, -1);
+                       gtk_tree_store_set(srchmodel, &titer, 4, (gint64)ires->argv[4].val.lnum, 5, ires->argv[5].val.num, 6, ires->argv[7].val.flnum, 8, -1, -1);
                    }
                    dc_freeires(ires);
                }
@@ -1230,9 +1233,9 @@ void handleresps(void)
                        gtk_list_store_append(reslist, &titer);
                        gtk_list_store_set(reslist, &titer, 0, icswcstombs(resp->rlines[i].argv[1] + 3, "UTF-8", NULL), -1);
                    } else if(!wcsncmp(resp->rlines[i].argv[1], L"size:", 5)) {
-                       gtk_list_store_set(reslist, &titer, 1, wcstol(resp->rlines[i].argv[1] + 5, NULL, 10), -1);
+                       gtk_list_store_set(reslist, &titer, 1, (gint64)wcstoll(resp->rlines[i].argv[1] + 5, NULL, 10), -1);
                    } else if(!wcsncmp(resp->rlines[i].argv[1], L"prog:", 5)) {
-                       gtk_list_store_set(reslist, &titer, 2, wcstol(resp->rlines[i].argv[1] + 5, NULL, 10), -1);
+                       gtk_list_store_set(reslist, &titer, 2, (gint64)wcstoll(resp->rlines[i].argv[1] + 5, NULL, 10), -1);
                    } else if(!wcsncmp(resp->rlines[i].argv[1], L"name:", 5)) {
                        gtk_list_store_set(reslist, &titer, 3, icswcstombs(resp->rlines[i].argv[1] + 5, "UTF-8", NULL), -1);
                    } else if(!wcsncmp(resp->rlines[i].argv[1], L"lock:", 5)) {
@@ -1758,7 +1761,8 @@ void cb_main_srchres_activate(GtkWidget *widget, GtkTreePath *path, GtkTreeViewC
     struct dc_response *resp;
     GtkTreeIter iter;
     GtkTreeModel *model;
-    int size, num;
+    int num;
+    gint64 size;
     char *tfnet, *tpeerid, *tfilename, *thash, *arg;
     wchar_t *fnet, *peerid, *filename, *hash;
     
@@ -1800,9 +1804,9 @@ void cb_main_srchres_activate(GtkWidget *widget, GtkTreePath *path, GtkTreeViewC
     g_free(tfilename);
     arg = (char *)gtk_entry_get_text(GTK_ENTRY(main_dlarg));
     if(*arg)
-       tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%i", size, L"hash", L"%ls", (hash == NULL)?L"":hash, L"user", L"%s", arg, NULL);
+       tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%li", (dc_lnum_t)size, L"hash", L"%ls", (hash == NULL)?L"":hash, L"user", L"%s", arg, NULL);
     else
-       tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%i", size, L"hash", L"%ls", (hash == NULL)?L"":hash, NULL);
+       tag = dc_queuecmd(NULL, NULL, L"download", fnet, L"%ls", peerid, L"%ls", filename, L"%li", (dc_lnum_t)size, L"hash", L"%ls", (hash == NULL)?L"":hash, NULL);
     free(fnet);
     free(peerid);
     free(filename);
@@ -2270,7 +2274,7 @@ int main(int argc, char **argv)
     gtk_tree_view_set_model(GTK_TREE_VIEW(main_fnetnodes), GTK_TREE_MODEL(fnmodel));
     gtk_tree_view_set_model(GTK_TREE_VIEW(main_chatnodes), GTK_TREE_MODEL(fnmodel));
     
-    reslist = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
+    reslist = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
     gtk_tree_view_set_model(GTK_TREE_VIEW(reslist_list), GTK_TREE_MODEL(reslist));
     
     dlmodel = gtk_list_store_new(13, G_TYPE_INT, /* id */
@@ -2279,8 +2283,8 @@ int main(int argc, char **argv)
                                 G_TYPE_STRING,  /* peerid */
                                 G_TYPE_STRING,  /* peernick */
                                 G_TYPE_STRING,  /* path */
-                                G_TYPE_INT,     /* size */
-                                G_TYPE_INT,     /* curpos */
+                                G_TYPE_INT64,   /* size */
+                                G_TYPE_INT64,   /* curpos */
                                 G_TYPE_STRING,  /* stock */
                                 G_TYPE_FLOAT,   /* percentage */
                                 G_TYPE_INT,     /* error */
@@ -2288,14 +2292,14 @@ int main(int argc, char **argv)
                                 G_TYPE_STRING); /* hash */
     gtk_tree_view_set_model(GTK_TREE_VIEW(main_downloads), GTK_TREE_MODEL(dlmodel));
 
-    ulmodel = gtk_list_store_new(13, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
+    ulmodel = gtk_list_store_new(13, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
     gtk_tree_view_set_model(GTK_TREE_VIEW(main_uploads), GTK_TREE_MODEL(ulmodel));
 
     srchmodel = gtk_tree_store_new(10, G_TYPE_STRING, /* fnetname */
                                   G_TYPE_STRING,     /* peerid */
                                   G_TYPE_STRING,     /* peername */
                                   G_TYPE_STRING,     /* filename */
-                                  G_TYPE_INT,        /* size */
+                                  G_TYPE_INT64,      /* size */
                                   G_TYPE_INT,        /* slots */
                                   G_TYPE_DOUBLE,     /* resptime */
                                   G_TYPE_INT,        /* sizenum */
index 40ee546..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>
@@ -46,7 +47,8 @@
 
 struct trinfo {
     int ostate;
-    int opos, spos, speed;
+    intmax_t opos, spos;
+    int speed;
     time_t lastprog;
     int warned;
     double sprog;
@@ -202,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;
     
index cf4bc4c..34f0779 100644 (file)
@@ -1,15 +1,21 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/poll.h>
+#include <time.h>
+#include <sys/time.h>
 
 #include <doldaconnect/uilib.h>
 #include <doldaconnect/uimisc.h>
+#include <doldaconnect/utils.h>
 
 int done;
+double btime;
 
 void authcallback(int err, wchar_t *reason, void *data)
 {
+    printf("auth: %f\n", ntime() - btime);
     printf("Logged in: %i\n", err);
+    exit(0);
     dc_queuecmd(NULL, NULL, L"quit", NULL);
 }
 
@@ -19,7 +25,9 @@ int main(int argc, char **argv)
     int fd;
     struct dc_response *resp;
     
+    btime = ntime();
     dc_init();
+    printf("init: %f\n", ntime() - btime);
     fd = dc_connect(NULL);
     done = 0;
     while(!done)
@@ -41,6 +49,7 @@ int main(int argc, char **argv)
        {
            if(!wcscmp(resp->cmdname, L".connect"))
            {
+               printf("conn: %f\n", ntime() - btime);
                printf("Connected: %i\n", resp->code);
                if(resp->code == 201)
                    dc_loginasync(NULL, 1, NULL, authcallback, NULL);
@@ -48,6 +57,8 @@ int main(int argc, char **argv)
            dc_freeresp(resp);
        }
     }
+    printf("fini: %f\n", ntime() - btime);
     dc_cleanup();
+    printf("exit: %f\n", ntime() - btime);
     return(0);
 }
index b8f721f..3627295 100644 (file)
@@ -22,7 +22,9 @@
 #include <unistd.h>
 #include <wchar.h>
 #include <sys/poll.h>
+#include <string.h>
 #include <errno.h>
+#include <locale.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #include <doldaconnect/uimisc.h>
 #include <doldaconnect/utils.h>
 
+int interactive = 0;
 int verbose = 0;
 int dcfd;
 
+struct cmd {
+    wchar_t *name;
+    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';
+    }
+}
+
+int cmd_lsnodes(int argc, wchar_t **argv)
+{
+    struct dc_response *resp;
+    struct dc_intresp *ires;
+    
+    resp = dc_gettaggedrespsync(dc_queuecmd(NULL, NULL, L"lsnodes", NULL));
+    if(resp->code == 200) {
+       if(interactive) {
+           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);
+           dc_freeires(ires);
+       }
+    } else if(resp->code == 201) {
+    } else {
+       fprintf(stderr, "dcsh: %ls\n", resp->rlines[0].argv[0]);
+    }
+    return(0);
+}
+
+struct cmd commands[] = {
+    {L"hubs", cmd_lsnodes},
+    {NULL, NULL}
+};
+
+int run1(int argc, wchar_t **argv)
+{
+    struct cmd *c;
+    
+    for(c = commands; c->handler != NULL; c++) {
+       if(!wcscmp(argv[0], c->name))
+           return(c->handler(argc, argv));
+    }
+    fprintf(stderr, "dcsh: no such command\n");
+    return(1);
+}
+
+int runchar(int argc, char **argv) {
+    int i, rv;
+    wchar_t **wargv, *buf;
+    size_t wargvsize, wargvdata;
+    
+    wargv = NULL;
+    wargvsize = wargvdata = 0;
+    for(i = 0; i < argc; i++) {
+       if((buf = icmbstowcs(argv[i], NULL)) == NULL) {
+           fprintf(stderr, "dcsh: could not convert %s to wide char: %s\n", argv[i], strerror(errno));
+           for(i = 0; i < wargvdata; i++)
+               free(wargv[i]);
+           if(wargv != NULL)
+               free(wargv);
+           return(1);
+       }
+       addtobuf(wargv, buf);
+    }
+    addtobuf(wargv, NULL);
+    rv = run1(wargvdata - 1, wargv);
+    dc_freewcsarr(wargv);
+    return(rv);
+}
+
+int shell(void)
+{
+    int ret, argc;
+    wchar_t *buf, **argv;
+    char *p, cmdbuf[128];
+    int cmddata;
+    struct pollfd pfd[2];
+
+    if(interactive) {
+       fprintf(stderr, "dcsh> ");
+       fflush(stderr);
+    }
+    cmddata = 0;
+    while(1) {
+       pfd[0].fd = dcfd;
+       pfd[0].events = POLLIN;
+       if(dc_wantwrite())
+           pfd[0].events |= POLLOUT;
+       pfd[1].fd = 0;
+       pfd[1].events = POLLIN;
+       pfd[1].revents = 0;
+       if(poll(pfd, 2, -1) < 0) {
+           if(errno != EINTR) {
+               perror("dcsh: poll");
+               exit(1);
+           }
+       }
+       if(((pfd[0].revents & POLLIN) && dc_handleread()) || ((pfd[0].revents & POLLOUT) && dc_handlewrite()))
+           return(1);
+       if(pfd[1].revents) {
+           ret = read(0, cmdbuf + cmddata, sizeof(cmdbuf) - cmddata);
+           if(ret < 0) {
+               fprintf(stderr, "dcsh: stdin: %s\n", strerror(errno));
+               return(1);
+           } else if(ret == 0) {
+               if(interactive)
+                   fprintf(stderr, "\n");
+               return(0);
+           }
+           cmddata += ret;
+           while((p = memchr(cmdbuf, '\n', cmddata)) != NULL) {
+               *(p++) = 0;
+               if((buf = icmbstowcs(cmdbuf, NULL)) == NULL) {
+                   fprintf(stderr, "dcsh: could not convert command to wide chars: %s\n", strerror(errno));
+               } else {
+                   argv = dc_lexsexpr(buf);
+                   free(buf);
+                   for(argc = 0; argv[argc] != NULL; argc++);
+                   if(argc > 0)
+                       run1(argc, argv);
+                   dc_freewcsarr(argv);
+               }
+               memmove(cmdbuf, p, cmddata -= (p - cmdbuf));
+               if(interactive) {
+                   fprintf(stderr, "dcsh> ");
+                   fflush(stderr);
+               }
+           }
+       }
+    }
+}
+
 int main(int argc, char **argv)
 {
-    int c;
+    int c, rv;
     char *server;
     char *username;
     int authless, authia;
-    struct pollfd pfd[2];
-    int done;
-    char cmdbuf[128];
-    int cmddata;
     
+    setlocale(LC_ALL, "");
     server = username = NULL;
     authless = authia = 1;
     while((c = getopt(argc, argv, "hvIAs:u:")) != -1) {
@@ -65,7 +207,7 @@ int main(int argc, char **argv)
            verbose++;
            break;
        default:
-           fprintf(stderr, "usage: dcsh [-AIhv] [-s SERVER] [-u USERNAME]\n");
+           fprintf(stderr, "usage: dcsh [-AIhv] [-s SERVER] [-u USERNAME] [COMMAND [ARGS...]]\n");
            exit((c == 'h')?0:1);
        }
     }
@@ -85,23 +227,12 @@ int main(int argc, char **argv)
     }
     if(verbose)
        fprintf(stderr, "done\n");
-    done = 0;
-    cmddata = 0;
-    while(!done) {
-       pfd[0].fd = dcfd;
-       pfd[0].events = POLLIN;
-       if(dc_wantwrite())
-           pfd[0].events |= POLLOUT;
-       pfd[1].fd = 0;
-       pfd[1].events = POLLIN;
-       pfd[1].revents = 0;
-       if(poll(pfd, (cmddata < sizeof(cmdbuf)) ? 2 : 1, -1) < 0) {
-           if(errno != EINTR) {
-               perror("dcsh: poll");
-               exit(1);
-           }
-       }
-       
+    if(optind < argc) {
+       interactive = isatty(1);
+       rv = runchar(argc - optind, argv + optind);
+    } else {
+       interactive = isatty(0);
+       rv = shell();
     }
-    return(0);
+    return(rv);
 }
index 1ff686c..e809b60 100644 (file)
@@ -30,4 +30,4 @@ doldacond_SOURCES=    main.c \
 EXTRA_DIST=emacs-local
 doldacond_LDADD=$(top_srcdir)/common/libcommon.a \
                @KRB5_LIBS@ -lbz2 -lz -lgdbm @PAM_LIBS@ @KEYUTILS_LIBS@
-doldacond_CPPFLAGS=-I$(top_srcdir)/include -DDAEMON @KRB5_CFLAGS@ -D_ISOC99_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE
+doldacond_CPPFLAGS=-I$(top_srcdir)/include -DDAEMON @KRB5_CFLAGS@ -D_ISOC99_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
index aa15d42..19708d2 100644 (file)
@@ -58,7 +58,7 @@ struct sharecache
     struct sharecache *next, *prev, *child, *parent;
     char *path;
     wchar_t *name;
-    size_t size;
+    off_t size;
     time_t mtime;
     dev_t dev;
     ino_t inode;
index 01592c6..d934025 100644 (file)
@@ -127,7 +127,7 @@ struct dcpeer
     struct fnetnode *fn;
     char *inbuf;
     size_t inbufdata, inbufsize;
-    size_t curread, totalsize;
+    off_t curread, totalsize;
     int freeing;
     struct timer *timeout;
     struct qcommand *queue;
@@ -502,7 +502,11 @@ static void sendadc(struct socket *sk, char *arg)
     free(buf);
 }
 
-static void sendadcf(struct socket *sk, char *arg, ...)
+#if defined(__GNUC__)
+static void __attribute__ ((format (printf, 2, 3))) sendadcf(struct socket *sk, char *arg, ...) 
+#else
+static void sendadcf(struct socket *sk, char *arg, ...) 
+#endif
 {
     char *buf;
     va_list args;
@@ -740,8 +744,8 @@ static void requestfile(struct dcpeer *peer)
        }
        sendadc(peer->sk, buf);
        free(buf);
-       sendadcf(peer->sk, "%i", peer->transfer->curpos);
-       sendadcf(peer->sk, "%i", peer->transfer->size - peer->transfer->curpos);
+       sendadcf(peer->sk, "%ji", (intmax_t)peer->transfer->curpos);
+       sendadcf(peer->sk, "%ji", (intmax_t)(peer->transfer->size - peer->transfer->curpos));
        qstr(peer->sk, "|");
     } else if(supports(peer, "xmlbzlist")) {
        if((buf = icswcstombs(peer->transfer->path, "UTF-8", NULL)) == NULL)
@@ -750,7 +754,7 @@ static void requestfile(struct dcpeer *peer)
            freedcpeer(peer);
            return;
        }
-       qstrf(peer->sk, "$UGetBlock %zi %zi %s|", peer->transfer->curpos, peer->transfer->size - peer->transfer->curpos, buf);
+       qstrf(peer->sk, "$UGetBlock %ji %ji %s|", (intmax_t)peer->transfer->curpos, (intmax_t)(peer->transfer->size - peer->transfer->curpos), buf);
     } else {
        /* Use DCCHARSET for $Get paths until further researched... */
        if((buf = icswcstombs(peer->transfer->path, DCCHARSET, NULL)) == NULL)
@@ -759,7 +763,7 @@ static void requestfile(struct dcpeer *peer)
            freedcpeer(peer);
            return;
        }
-       qstrf(peer->sk, "$Get %s$%zi|", buf, peer->transfer->curpos + 1);
+       qstrf(peer->sk, "$Get %s$%ji|", buf, (intmax_t)peer->transfer->curpos + 1);
     }
 }
 
@@ -1257,10 +1261,10 @@ static void cmd_search(struct socket *sk, struct fnetnode *fn, char *cmd, char *
                if(node->f.b.hastth)
                {
                    buf2 = base32encode(node->hashtth, 24);
-                   qstrf(dsk, "%s%s\005%zi%sTTH:%.39s%s", prefix, buf, node->size, infix, buf2, postfix);
+                   qstrf(dsk, "%s%s\005%ji%sTTH:%.39s%s", prefix, buf, (intmax_t)node->size, infix, buf2, postfix);
                    free(buf2);
                } else {
-                   qstrf(dsk, "%s%s\005%zi%s%s%s", prefix, buf, node->size, infix, hub->nativename, postfix);
+                   qstrf(dsk, "%s%s\005%ji%s%s%s", prefix, buf, (intmax_t)node->size, infix, hub->nativename, postfix);
                }
                free(buf);
            }
@@ -1410,7 +1414,8 @@ static void cmd_sr(struct socket *sk, struct fnetnode *fn, char *cmd, char *args
     struct dchub *hub;
     char *p, *p2, *buf;
     char *nick, *filename, *hubname;
-    int size, slots;
+    off_t size;
+    int slots;
     size_t buflen;
     struct srchres *sr;
     wchar_t *wnick, *wfile;
@@ -1429,7 +1434,7 @@ static void cmd_sr(struct socket *sk, struct fnetnode *fn, char *cmd, char *args
     if((p2 = strchr(p, ' ')) == NULL)
        return;
     *p2 = 0;
-    size = atoi(p);
+    size = strtoll(p, NULL, 10);
     p = p2 + 1;
     if((p2 = strchr(p, '/')) == NULL)
        return;
@@ -1704,7 +1709,7 @@ static void startul(struct dcpeer *peer)
 
 static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
 {
-    int size;
+    off_t size;
     struct transfer *transfer;
     
     if(peer->transfer == NULL)
@@ -1712,7 +1717,7 @@ static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, ch
        freedcpeer(peer);
        return;
     }
-    size = atoi(args);
+    size = strtoll(args, NULL, 10);
     if(peer->transfer->size != size)
     {
        transfersetsize(peer->transfer, size);
@@ -1835,7 +1840,7 @@ static struct sharecache *resdcpath(char *path, char *charset, char sep)
 
 static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
 {
-    int offset;
+    off_t offset;
     char *p, *buf;
     wchar_t *buf2;
     struct sharecache *node;
@@ -1854,7 +1859,7 @@ static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *arg
        return;
     }
     *(p++) = 0;
-    if((offset = (atoi(p) - 1)) < 0)
+    if((offset = (strtoll(p, NULL, 10) - 1)) < 0)
     {
        freedcpeer(peer);
        return;
@@ -1917,7 +1922,7 @@ static void cmd_get(struct socket *sk, struct dcpeer *peer, char *cmd, char *arg
     lesk = wrapsock(fd);
     transferprepul(peer->transfer, sb.st_size, offset, -1, lesk);
     putsock(lesk);
-    qstrf(sk, "$FileLength %zi|", peer->transfer->size);
+    qstrf(sk, "$FileLength %ji|", (intmax_t)peer->transfer->size);
 }
 
 static void cmd_send(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
@@ -1968,7 +1973,7 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char
 {
     int fd;
     char *p, *p2;
-    int start, numbytes;
+    off_t start, numbytes;
     char *charset, *buf;
     wchar_t *buf2;
     struct sharecache *node;
@@ -1987,7 +1992,7 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char
        return;
     }
     *(p2++) = 0;
-    start = atoi(p);
+    start = strtoll(p, NULL, 10);
     p = p2;
     if((p2 = strchr(p, ' ')) == NULL)
     {
@@ -1995,7 +2000,7 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char
        return;
     }
     *(p2++) = 0;
-    numbytes = atoi(p);
+    numbytes = strtoll(p, NULL, 10);
     p = p2;
     if(!strcmp(cmd, "$UGetBlock") || !strcmp(cmd, "$UGetZBlock"))
        charset = "UTF-8";
@@ -2057,7 +2062,7 @@ static void cmd_getblock(struct socket *sk, struct dcpeer *peer, char *cmd, char
     lesk = wrapsock(fd);
     transferprepul(peer->transfer, sb.st_size, start, start + numbytes, lesk);
     putsock(lesk);
-    qstrf(sk, "$Sending %i|", numbytes);
+    qstrf(sk, "$Sending %ji|", (intmax_t)numbytes);
     startul(peer);
 }
 
@@ -2065,7 +2070,7 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char *
 {
     int i;
     char **argv, *buf;
-    int start, numbytes;
+    off_t start, numbytes;
     struct sharecache *node;
     struct stat sb;
     struct socket *lesk;
@@ -2087,8 +2092,8 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char *
        freedcpeer(peer);
        goto out;
     }
-    start = atoi(argv[2]);
-    numbytes = atoi(argv[3]);
+    start = strtoll(argv[2], NULL, 10);
+    numbytes = strtoll(argv[3], NULL, 10);
     node = NULL;
     fd = -1;
     if(((fd = openfilelist(argv[1])) < 0) && (errno != 0))
@@ -2161,8 +2166,8 @@ static void cmd_adcget(struct socket *sk, struct dcpeer *peer, char *cmd, char *
        qstr(sk, "$ADCSND");
        sendadc(sk, "file");
        sendadc(sk, argv[1]);
-       sendadcf(sk, "%i", start);
-       sendadcf(sk, "%i", numbytes);
+       sendadcf(sk, "%ji", (intmax_t)start);
+       sendadcf(sk, "%ji", (intmax_t)numbytes);
        if(peer->compress == CPRS_ZLIB)
            sendadc(sk, "ZL1");
        qstr(sk, "|");
@@ -2223,7 +2228,7 @@ static void handletthl(struct dcpeer *peer)
 static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
 {
     char **argv;
-    int start, numbytes;
+    off_t start, numbytes;
     
     if(peer->transfer == NULL)
     {
@@ -2240,8 +2245,8 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char *
        freedcpeer(peer);
        goto out;
     }
-    start = atoi(argv[2]);
-    numbytes = atoi(argv[3]);
+    start = strtoll(argv[2], NULL, 10);
+    numbytes = strtoll(argv[3], NULL, 10);
     if(!strcmp(argv[0], "tthl"))
     {
        if((start != 0) || (numbytes % 24 != 0))
@@ -2289,14 +2294,14 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char *
 
 static void cmd_sending(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
 {
-    int numbytes;
+    off_t numbytes;
     
     if(peer->transfer == NULL)
     {
        freedcpeer(peer);
        return;
     }
-    numbytes = atoi(args);
+    numbytes = strtoll(args, NULL, 10);
     if(peer->transfer->size - peer->transfer->curpos != numbytes)
     {
        transfersetsize(peer->transfer, peer->transfer->curpos + numbytes);
@@ -2811,7 +2816,8 @@ static void udpread(struct socket *sk, void *data)
     size_t buflen, hashlen;
     char *nick, *filename, *hubname;
     struct sockaddr_in hubaddr;
-    int size, slots;
+    off_t size;
+    int slots;
     struct fnetnode *fn, *myfn;
     struct dchub *hub;
     struct srchres *sr;
@@ -2847,7 +2853,7 @@ static void udpread(struct socket *sk, void *data)
            return;
        }
        *p2 = 0;
-       size = atoi(p);
+       size = strtoll(p, NULL, 10);
        p = p2 + 1;
        if((p2 = strchr(p, '/')) == NULL)
        {
@@ -3317,7 +3323,7 @@ static void updatehmlist(void)
            if(node->f.b.type == FILE_REG)
            {
                addtobuf(buf, '|');
-               sprintf(numbuf, "%zi", node->size);
+               sprintf(numbuf, "%ji", (intmax_t)node->size);
                bufcat(buf, numbuf, strlen(numbuf));
            }
            addtobuf(buf, 13);
@@ -3492,7 +3498,7 @@ static void updatexmllist(void)
                lev++;
                continue;
            } else {
-               fprintf(fs, "<File Name=\"%s\" Size=\"%zi\"", namebuf, node->size);
+               fprintf(fs, "<File Name=\"%s\" Size=\"%ji\"", namebuf, (intmax_t)node->size);
                if(node->f.b.hastth)
                {
                    hashbuf = base32encode(node->hashtth, 24);
index 9b5a34a..e0d12af 100644 (file)
@@ -388,12 +388,17 @@ static void sockrecv(struct socket *sk)
 #if defined(HAVE_LINUX_SOCKIOS_H) && defined(SIOCINQ)
        /* SIOCINQ is Linux-specific AFAIK, but I really have no idea
         * how to read the inqueue size on other OSs */
-       if(ioctl(sk->fd, SIOCINQ, &inq))
-       {
-           /* I don't really know what could go wrong here, so let's
-            * assume it's transient. */
-           flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
-           inq = 2048;
+       if(sk->isrealsocket) {
+           if(ioctl(sk->fd, SIOCINQ, &inq))
+           {
+               /* I don't really know what could go wrong here, so let's
+                * assume it's transient. */
+               flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
+               inq = 2048;
+           }
+       } else {
+           /* There are perils when trying to use SIOCINQ on files >2GiB... */
+           inq = 65536;
        }
 #else
        inq = 2048;
index 990391e..230436c 100644 (file)
@@ -104,7 +104,7 @@ struct srchres
     wchar_t *filename;
     struct fnet *fnet;
     wchar_t *peerid, *peernick;
-    size_t size;
+    off_t size;
     int slots;
     struct fnetnode *fn;
     double time;
index e2fe54e..c432815 100644 (file)
@@ -305,7 +305,7 @@ void *transfergetdata(struct transfer *transfer, size_t *size)
     return(buf);
 }
 
-void transferprepul(struct transfer *transfer, size_t size, size_t start, size_t end, struct socket *lesk)
+void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk)
 {
     transfersetsize(transfer, size);
     transfer->curpos = start;
@@ -461,7 +461,7 @@ void transfersetnick(struct transfer *transfer, wchar_t *newnick)
     CBCHAINDOCB(transfer, trans_ac, transfer, L"nick");
 }
 
-void transfersetsize(struct transfer *transfer, int newsize)
+void transfersetsize(struct transfer *transfer, off_t newsize)
 {
     transfer->size = newsize;
     CBCHAINDOCB(transfer, trans_ac, transfer, L"size");
@@ -670,7 +670,7 @@ int forkfilter(struct transfer *transfer)
     {
        argv = NULL;
        argvsize = argvdata = 0;
-       buf = sprintf2("%zi", transfer->size);
+       buf = sprintf2("%ji", (intmax_t)transfer->size);
        addtobuf(argv, filtername);
        addtobuf(argv, filename);
        addtobuf(argv, buf);
index 06b334f..b4ffa69 100644 (file)
@@ -73,7 +73,7 @@ struct transfer
     wchar_t *path;
     uid_t owner;
     int state, dir, error;
-    size_t size, curpos, endpos;
+    off_t size, curpos, endpos;
     struct fnetnode *fn;
     void *ifacedata;
     struct socket *localend;
@@ -103,7 +103,7 @@ struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nick
 void transfersetnick(struct transfer *transfer, wchar_t *newnick);
 void transfersetpath(struct transfer *transfer, wchar_t *newpath);
 void transfersetstate(struct transfer *transfer, int newstate);
-void transfersetsize(struct transfer *transfer, int newsize);
+void transfersetsize(struct transfer *transfer, off_t newsize);
 void transferseterror(struct transfer *transfer, int error);
 void transfersetactivity(struct transfer *transfer, wchar_t *desc);
 void transferattach(struct transfer *transfer, struct transferiface *iface, void *data);
@@ -115,7 +115,7 @@ int forkfilter(struct transfer *transfer);
 void transferputdata(struct transfer *transfer, void *buf, size_t size);
 size_t transferdatasize(struct transfer *transfer);
 void transferendofdata(struct transfer *transfer);
-void transferprepul(struct transfer *transfer, size_t size, size_t start, size_t end, struct socket *lesk);
+void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk);
 void transferstartul(struct transfer *transfer, struct socket *sk);
 void transfersethash(struct transfer *transfer, struct hash *hash);
 struct transfer *finddownload(wchar_t *peerid);
index 21f387e..a7717ea 100644 (file)
@@ -62,6 +62,7 @@
 #define NOTIF_STR 2
 #define NOTIF_FLOAT 3
 #define NOTIF_ID 4
+#define NOTIF_OFF 5
 #define NOTIF_PEND 0
 #define NOTIF_WAIT 1
 
@@ -105,6 +106,7 @@ struct notif
        union
        {
            int n;
+           off_t o;
            wchar_t *s;
            double d;
        } d;
@@ -232,6 +234,12 @@ static void sq(struct socket *sk, int cont, ...)
            {
                freepart = 1;
                part = swprintf2(L"%i", va_arg(al, int));
+           } else if(!wcscmp(tpart, L"zi")) {
+               freepart = 1;
+               part = swprintf2(L"%zi", va_arg(al, size_t));
+           } else if(!wcscmp(tpart, L"oi")) {
+               freepart = 1;
+               part = swprintf2(L"%ji", (intmax_t)va_arg(al, off_t));
            } else if(!wcscmp(tpart, L"s")) {
                freepart = 1;
                part = icmbstowcs(sarg = va_arg(al, char *), NULL);
@@ -764,7 +772,7 @@ static void cmd_download(struct socket *sk, struct uidata *data, int argc, wchar
        linktransfer(transfer);
     }
     if(argc > 4)
-       transfersetsize(transfer, wcstol(argv[4], NULL, 0));
+       transfersetsize(transfer, wcstoll(argv[4], NULL, 0));
     if(argc > 5)
     {
        for(i = 5; i < argc; i += 2)
@@ -796,7 +804,7 @@ static void cmd_lstrans(struct socket *sk, struct uidata *data, int argc, wchar_
                   L"%i", pt->state, pt->peerid,
                   (pt->peernick == NULL)?L"":(pt->peernick),
                   (pt->path == NULL)?L"":(pt->path),
-                  L"%i", pt->size, L"%i", pt->curpos,
+                  L"%oi", pt->size, L"%oi", pt->curpos,
                   (pt->hash == NULL)?L"":unparsehash(pt->hash),
                   NULL);
            pt = transfer;
@@ -809,7 +817,7 @@ static void cmd_lstrans(struct socket *sk, struct uidata *data, int argc, wchar_
           L"%i", pt->state, pt->peerid,
           (pt->peernick == NULL)?L"":(pt->peernick),
           (pt->path == NULL)?L"":(pt->path),
-          L"%i", pt->size, L"%i", pt->curpos,
+          L"%oi", pt->size, L"%oi", pt->curpos,
           (pt->hash == NULL)?L"":unparsehash(pt->hash),
           NULL);
 }
@@ -1048,7 +1056,7 @@ static void cmd_lssr(struct socket *sk, struct uidata *data, int argc, wchar_t *
        for(sr = srch->results; sr != NULL; sr = sr->next)
        {
            sq(sk, (sr->next != NULL)?1:0, L"200", L"%ls", sr->filename,
-              sr->fnet->name, L"%ls", sr->peerid, L"%i", sr->size,
+              sr->fnet->name, L"%ls", sr->peerid, L"%oi", sr->size,
               L"%i", sr->slots, L"%i", (sr->fn == NULL)?-1:(sr->fn->id),
               L"%f", sr->time,
               L"%ls", (sr->hash == NULL)?L"":unparsehash(sr->hash), NULL);
@@ -1434,6 +1442,9 @@ static void notifappendv(struct notif *notif, va_list args)
        case NOTIF_ID:
            notif->argv[ca].d.n = va_arg(args, int);
            break;
+       case NOTIF_OFF:
+           notif->argv[ca].d.o = va_arg(args, off_t);
+           break;
        case NOTIF_STR:
            notif->argv[ca].d.s = swcsdup(va_arg(args, wchar_t *));
            break;
@@ -1845,7 +1856,7 @@ static int srchres(struct search *srch, struct srchres *sr, void *uudata)
     {
        if(haspriv(data, PERM_SRCH) && data->notify.b.srch && !wcscmp(srch->owner, data->username))
        {
-           newnotif(data, 622, NOTIF_ID, srch->id, NOTIF_STR, sr->filename, NOTIF_STR, sr->fnet->name, NOTIF_STR, sr->peerid, NOTIF_INT, sr->size,
+           newnotif(data, 622, NOTIF_ID, srch->id, NOTIF_STR, sr->filename, NOTIF_STR, sr->fnet->name, NOTIF_STR, sr->peerid, NOTIF_OFF, sr->size,
                     NOTIF_INT, sr->slots, NOTIF_INT, (sr->fn == NULL)?-1:(sr->fn->id), NOTIF_FLOAT, sr->time, NOTIF_STR, (sr->hash == NULL)?L"":unparsehash(sr->hash), NOTIF_END);
        }
     }
@@ -2008,7 +2019,7 @@ static int transferchattr(struct transfer *transfer, wchar_t *attrib, void *uuda
        for(data = actives; data != NULL; data = data->next)
        {
            if(haspriv(data, PERM_TRANS) && data->notify.b.tract && ((transfer->owner == 0) || (transfer->owner == data->uid)))
-               newnotif(data, 613, NOTIF_ID, transfer->id, NOTIF_INT, transfer->size, NOTIF_END);
+               newnotif(data, 613, NOTIF_ID, transfer->id, NOTIF_OFF, transfer->size, NOTIF_END);
        }
     } else if(!wcscmp(attrib, L"error")) {
        for(data = actives; data != NULL; data = data->next)
@@ -2042,9 +2053,9 @@ static int transferprog(struct transfer *transfer, void *uudata)
        if(haspriv(data, PERM_TRANS) && data->notify.b.trprog && ((transfer->owner == 0) || (transfer->owner == data->uid)))
        {
            if((notif = findnotif(data->fnotif, 1, NOTIF_PEND, 615, transfer->id)) != NULL)
-               notif->argv[1].d.n = transfer->curpos;
+               notif->argv[1].d.o = transfer->curpos;
            else
-               newnotif(data, 615, NOTIF_ID, transfer->id, NOTIF_INT, transfer->curpos, NOTIF_END)->rlimit = 0.5;
+               newnotif(data, 615, NOTIF_ID, transfer->id, NOTIF_OFF, transfer->curpos, NOTIF_END)->rlimit = 0.5;
        }
     }
     return(0);
@@ -2359,6 +2370,9 @@ static int run(void)
                case NOTIF_ID:
                    sq(data->sk, 2, L"%i", notif->argv[i].d.n, NULL);
                    break;
+               case NOTIF_OFF:
+                   sq(data->sk, 2, L"%oi", notif->argv[i].d.o, NULL);
+                   break;
                case NOTIF_STR:
                    if(notif->argv[i].d.s[0] == L'%')
                        sq(data->sk, 2, L"%ls", notif->argv[i].d.s, NULL);
index dc726da..0a1204e 100644 (file)
@@ -5,6 +5,8 @@
 
 #define DC_LATEST 2
 
+typedef long long dc_lnum_t;
+
 struct dc_response
 {
     struct dc_response *next, *prev;
@@ -32,6 +34,7 @@ struct dc_intresp
        union
        {
            int num;
+           dc_lnum_t lnum;
            wchar_t *str;
            double flnum;
        } val;
index f47dbd6..707c9b6 100644 (file)
@@ -93,7 +93,7 @@ struct dc_transfer
     int dir, state;
     wchar_t *peerid, *peernick;
     wchar_t *path;
-    int size, curpos;
+    dc_lnum_t size, curpos;
     int found;
     int error;
     time_t errortime;
index a1f677d..4847b2d 100644 (file)
@@ -7,7 +7,7 @@ lib_LTLIBRARIES = libdcui.la
 libdcui_la_SOURCES = uilib.c uimisc.c
 libdcui_la_LIBADD = @KRB5_LIBS@ $(top_srcdir)/common/libcommon.a
 libdcui_la_LDFLAGS = -version-info 2:0:1
-libdcui_la_CPPFLAGS = @KRB5_CFLAGS@
+libdcui_la_CPPFLAGS = @KRB5_CFLAGS@ -D_GNU_SOURCE
 
 BUILT_SOURCES = initcmds.h
 
index e3e6db8..f0abc2f 100644 (file)
@@ -184,10 +184,13 @@ static SCM scm_dc_intresp(SCM scm_resp)
            ret = scm_cons(scm_makfrom0str(icswcstombs(ires->argv[i].val.str, "UTF-8", NULL)), ret);
            break;
        case 2:
-           ret = scm_cons(scm_int2num(ires->argv[i].val.num), ret);
+           ret = scm_cons(scm_from_int(ires->argv[i].val.num), ret);
            break;
        case 3:
-           ret = scm_cons(scm_double2num(ires->argv[i].val.flnum), ret);
+           ret = scm_cons(scm_from_double(ires->argv[i].val.flnum), ret);
+           break;
+       case 4:
+           ret = scm_cons(scm_from_int64(ires->argv[i].val.num), ret);
            break;
        }
     }
index 750b43d..c6f63ee 100755 (executable)
@@ -5,6 +5,7 @@
      "s" => "RESP_STR",
      "d" => "RESP_DSC",
      "i" => "RESP_INT",
+     "I" => "RESP_LNUM",
      "f" => "RESP_FLOAT"
      );
 
index 1418174..c8df522 100644 (file)
@@ -90,6 +90,9 @@ static PyObject *resp_intresp(struct respobj *self)
            case 3:
                PyList_SetItem(sl, i, PyFloat_FromDouble(ires->argv[i].val.flnum));
                break;
+           case 4:
+               PyList_SetItem(sl, i, PyLong_FromLongLong(ires->argv[i].val.lnum));
+               break;
            }
        }
        dc_freeires(ires);
@@ -232,7 +235,7 @@ static int qcmd_cb(struct dc_response *resp)
 
 static PyObject *mod_qcmd(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-    int i, tag;
+    int i;
     wchar_t **toks, *tok, *cmd;
     size_t tokssize, toksdata, toksize;
     PyObject *c, *n, *cb, *ret;
@@ -307,6 +310,9 @@ static void login_cb(int err, wchar_t *reason, PyObject *cb)
     case DC_LOGIN_ERR_AUTHFAIL:
        errstr = "authfail";
        break;
+    default:
+       errstr = "unknown";
+       break;
     }
     pyerr = PyString_FromString(errstr);
     if(reason == NULL)
index 1ad9b19..b223bf4 100644 (file)
@@ -1,5 +1,5 @@
 :lssr
-200 s s s i i i f s
+200 s s s I i i f s
 201
 514
 :lssrch
@@ -66,7 +66,7 @@
 510
 511
 :lstrans
-200 i i i s s s i i s
+200 i i i s s s I I s
 201
 502
 :cancel
 610 i i s s    ; Transfer create
 611 i i                ; Transfer state change
 612 i s                ; Transfer nick change
-613 i i                ; Transfer size change
+613 i I                ; Transfer size change
 614 i i                ; Transfer error update
-615 i i                ; Transfer progress
+615 i I                ; Transfer progress
 616 i s                ; Transfer path change
 617 i s                ; Transfer destroy
 618 i s                ; Transfer hash update
 620 i i
 621 i
-622 i s s s i i i f s
+622 i s s s I i i f s
 630 i s s
 631 i s
 632 i s s       ; More data follows, but cannot be handled by dc_interpret
index 26429f8..48b3eed 100644 (file)
@@ -58,6 +58,7 @@
 #define RESP_STR 1
 #define RESP_INT 2
 #define RESP_FLOAT 3
+#define RESP_LNUM 4
 
 struct respclass
 {
@@ -476,6 +477,9 @@ int dc_queuecmd(int (*callback)(struct dc_response *), void *data, ...)
                {
                    freepart = 1;
                    part = swprintf2(L"%i", va_arg(al, int));
+               } else if(!wcscmp(tpart, L"li")) {
+                   freepart = 1;
+                   part = swprintf2(L"%ji", (intmax_t)va_arg(al, dc_lnum_t));
                } else if(!wcscmp(tpart, L"s")) {
                    freepart = 1;
                    part = icmbstowcs(sarg = va_arg(al, char *), NULL);
@@ -1372,6 +1376,12 @@ struct dc_intresp *dc_interpret(struct dc_response *resp)
            iresp->argv[iresp->argc].type = cls->wordt[i];
            iresp->argc++;
            break;
+       case RESP_LNUM:
+           sizebuf(&(iresp->argv), &args, iresp->argc + 1, sizeof(*(iresp->argv)), 1);
+           iresp->argv[iresp->argc].val.lnum = wcstoll(resp->rlines[resp->curline].argv[i + 1], NULL, 0);
+           iresp->argv[iresp->argc].type = cls->wordt[i];
+           iresp->argc++;
+           break;
        }
     }
     resp->curline++;
index 6a30ffa..92d1074 100644 (file)
 
 #include <unistd.h>
 #include <stdlib.h>
-/* I'm very unsure about this, but for now it defines wcstoll (which
- * should be defined anyway) and doesn't break anything... let's keep
- * two eyes wide open, though. */
-#define __USE_ISOC99
 #include <wchar.h>
 #include <wctype.h>
 #include <pwd.h>
@@ -969,8 +965,8 @@ static int gettrlistcallback(struct dc_response *resp)
                }
                transfer->dir = ires->argv[1].val.num;
                transfer->state = ires->argv[2].val.num;
-               transfer->size = ires->argv[6].val.num;
-               transfer->curpos = ires->argv[7].val.num;
+               transfer->size = ires->argv[6].val.lnum;
+               transfer->curpos = ires->argv[7].val.lnum;
                if(transfer->hash != NULL)
                {
                    free(transfer->hash);
@@ -986,8 +982,8 @@ static int gettrlistcallback(struct dc_response *resp)
                transfer->peerid = swcsdup(ires->argv[3].val.str);
                transfer->peernick = swcsdup(ires->argv[4].val.str);
                transfer->path = swcsdup(ires->argv[5].val.str);
-               transfer->size = ires->argv[6].val.num;
-               transfer->curpos = ires->argv[7].val.num;
+               transfer->size = ires->argv[6].val.lnum;
+               transfer->curpos = ires->argv[7].val.lnum;
                if(wcslen(ires->argv[8].val.str) > 0)
                    transfer->hash = swcsdup(ires->argv[8].val.str);
                transfer->found = 1;
@@ -1249,7 +1245,7 @@ void dc_uimisc_handlenotify(struct dc_response *resp)
        break;
     case 613:
        if((transfer = dc_findtransfer(ires->argv[0].val.num)) != NULL)
-           transfer->size = ires->argv[1].val.num;
+           transfer->size = ires->argv[1].val.lnum;
        break;
     case 614:
        if((transfer = dc_findtransfer(ires->argv[0].val.num)) != NULL)
@@ -1260,7 +1256,7 @@ void dc_uimisc_handlenotify(struct dc_response *resp)
        break;
     case 615:
        if((transfer = dc_findtransfer(ires->argv[0].val.num)) != NULL)
-           transfer->curpos = ires->argv[1].val.num;
+           transfer->curpos = ires->argv[1].val.lnum;
        break;
     case 616:
        if((transfer = dc_findtransfer(ires->argv[0].val.num)) != NULL)