From: Fredrik Tolf Date: Thu, 14 Feb 2008 06:08:01 +0000 (+0100) Subject: Merge branch 'master' of pc18:/srv/git/r/doldaconnect X-Git-Tag: 1.1~8 X-Git-Url: http://dolda2000.com/gitweb/?p=doldaconnect.git;a=commitdiff_plain;h=0388d7345b17aeb284ad7d6276a2f672ade6ada7;hp=68f4d42909fb311bc173dc2f684cd826b1f89ba5 Merge branch 'master' of pc18:/srv/git/r/doldaconnect --- diff --git a/ChangeLog b/ChangeLog index b46e100..feecc18 100644 --- 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: diff --git a/clients/gnome-trans-applet/conduit.c b/clients/gnome-trans-applet/conduit.c index 5959a27..e667ee6 100644 --- a/clients/gnome-trans-applet/conduit.c +++ b/clients/gnome-trans-applet/conduit.c @@ -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); diff --git a/clients/gnome-trans-applet/conduit.h b/clients/gnome-trans-applet/conduit.h index d38875b..0d3b15c 100644 --- a/clients/gnome-trans-applet/conduit.h +++ b/clients/gnome-trans-applet/conduit.h @@ -2,6 +2,7 @@ #define _CONDUIT_H #include +#include #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); diff --git a/clients/gnome-trans-applet/dolcon-trans-applet.c b/clients/gnome-trans-applet/dolcon-trans-applet.c index 0495560..6b4a6e9 100644 --- a/clients/gnome-trans-applet/dolcon-trans-applet.c +++ b/clients/gnome-trans-applet/dolcon-trans-applet.c @@ -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 { diff --git a/clients/gtk2/Makefile.am b/clients/gtk2/Makefile.am index 813c8fe..062265f 100644 --- a/clients/gtk2/Makefile.am +++ b/clients/gtk2/Makefile.am @@ -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="$@"; \ diff --git a/clients/gtk2/dolcon.c b/clients/gtk2/dolcon.c index 18a0a38..60374f3 100644 --- a/clients/gtk2/dolcon.c +++ b/clients/gtk2/dolcon.c @@ -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 */ diff --git a/clients/gui-shell/dsh.c b/clients/gui-shell/dsh.c index 40ee546..8e10cc8 100644 --- a/clients/gui-shell/dsh.c +++ b/clients/gui-shell/dsh.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -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; diff --git a/clients/test.c b/clients/test.c index cf4bc4c..34f0779 100644 --- a/clients/test.c +++ b/clients/test.c @@ -1,15 +1,21 @@ #include #include #include +#include +#include #include #include +#include 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); } diff --git a/clients/tty/dcsh.c b/clients/tty/dcsh.c index b8f721f..3627295 100644 --- a/clients/tty/dcsh.c +++ b/clients/tty/dcsh.c @@ -22,7 +22,9 @@ #include #include #include +#include #include +#include #ifdef HAVE_CONFIG_H #include @@ -31,20 +33,160 @@ #include #include +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); } diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 1ff686c..e809b60 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -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 diff --git a/daemon/client.h b/daemon/client.h index aa15d42..19708d2 100644 --- a/daemon/client.h +++ b/daemon/client.h @@ -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; diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index 01592c6..d934025 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -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, "size); + fprintf(fs, "size); if(node->f.b.hastth) { hashbuf = base32encode(node->hashtth, 24); diff --git a/daemon/net.c b/daemon/net.c index 9b5a34a..e0d12af 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -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; diff --git a/daemon/search.h b/daemon/search.h index 990391e..230436c 100644 --- a/daemon/search.h +++ b/daemon/search.h @@ -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; diff --git a/daemon/transfer.c b/daemon/transfer.c index e2fe54e..c432815 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -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); diff --git a/daemon/transfer.h b/daemon/transfer.h index 06b334f..b4ffa69 100644 --- a/daemon/transfer.h +++ b/daemon/transfer.h @@ -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); diff --git a/daemon/ui.c b/daemon/ui.c index 21f387e..a7717ea 100644 --- a/daemon/ui.c +++ b/daemon/ui.c @@ -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); diff --git a/include/doldaconnect/uilib.h b/include/doldaconnect/uilib.h index dc726da..0a1204e 100644 --- a/include/doldaconnect/uilib.h +++ b/include/doldaconnect/uilib.h @@ -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; diff --git a/include/doldaconnect/uimisc.h b/include/doldaconnect/uimisc.h index f47dbd6..707c9b6 100644 --- a/include/doldaconnect/uimisc.h +++ b/include/doldaconnect/uimisc.h @@ -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; diff --git a/lib/Makefile.am b/lib/Makefile.am index a1f677d..4847b2d 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -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 diff --git a/lib/guile/dolcon-guile.c b/lib/guile/dolcon-guile.c index e3e6db8..f0abc2f 100644 --- a/lib/guile/dolcon-guile.c +++ b/lib/guile/dolcon-guile.c @@ -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; } } diff --git a/lib/makecmds b/lib/makecmds index 750b43d..c6f63ee 100755 --- a/lib/makecmds +++ b/lib/makecmds @@ -5,6 +5,7 @@ "s" => "RESP_STR", "d" => "RESP_DSC", "i" => "RESP_INT", + "I" => "RESP_LNUM", "f" => "RESP_FLOAT" ); diff --git a/lib/python/dolmod.c b/lib/python/dolmod.c index 1418174..c8df522 100644 --- a/lib/python/dolmod.c +++ b/lib/python/dolmod.c @@ -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) diff --git a/lib/uicmds b/lib/uicmds index 1ad9b19..b223bf4 100644 --- a/lib/uicmds +++ b/lib/uicmds @@ -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 @@ -139,15 +139,15 @@ 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 diff --git a/lib/uilib.c b/lib/uilib.c index 26429f8..48b3eed 100644 --- a/lib/uilib.c +++ b/lib/uilib.c @@ -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++; diff --git a/lib/uimisc.c b/lib/uimisc.c index 6a30ffa..92d1074 100644 --- a/lib/uimisc.c +++ b/lib/uimisc.c @@ -19,10 +19,6 @@ #include #include -/* 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 #include #include @@ -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)