Version 1.1:
+ * Handles file sizes larger than 2 GiB
* Ported the Guile plugin to Guile 1.8
Version 1.0:
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);
#define _CONDUIT_H
#include <sys/types.h>
+#include <stdint.h>
#define CNDS_IDLE 0
#define CNDS_SYN 1
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;
};
};
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);
} 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 {
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="$@"; \
struct trdata
{
- size_t poshist[TRHISTSIZE];
+ dc_lnum_t poshist[TRHISTSIZE];
double timehist[TRHISTSIZE];
int hc;
};
struct srchsize
{
- int size;
+ gint64 size;
int num;
int slots;
double resptime;
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;
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);
}
}
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);
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);
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);
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];
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);
}
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,
{
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;
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);
}
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)) {
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;
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);
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 */
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 */
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 */
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <stdarg.h>
+#include <stdint.h>
#include <doldaconnect/uilib.h>
#include <doldaconnect/uimisc.h>
#include <doldaconnect/utils.h>
struct trinfo {
int ostate;
- int opos, spos, speed;
+ intmax_t opos, spos;
+ int speed;
time_t lastprog;
int warned;
double sprog;
{
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;
#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);
}
int fd;
struct dc_response *resp;
+ btime = ntime();
dc_init();
+ printf("init: %f\n", ntime() - btime);
fd = dc_connect(NULL);
done = 0;
while(!done)
{
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);
dc_freeresp(resp);
}
}
+ printf("fini: %f\n", ntime() - btime);
dc_cleanup();
+ printf("exit: %f\n", ntime() - btime);
return(0);
}
#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) {
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);
}
}
}
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);
}
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
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;
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;
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;
}
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)
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)
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);
}
}
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);
}
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;
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;
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)
freedcpeer(peer);
return;
}
- size = atoi(args);
+ size = strtoll(args, NULL, 10);
if(peer->transfer->size != size)
{
transfersetsize(peer->transfer, size);
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;
return;
}
*(p++) = 0;
- if((offset = (atoi(p) - 1)) < 0)
+ if((offset = (strtoll(p, NULL, 10) - 1)) < 0)
{
freedcpeer(peer);
return;
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)
{
int fd;
char *p, *p2;
- int start, numbytes;
+ off_t start, numbytes;
char *charset, *buf;
wchar_t *buf2;
struct sharecache *node;
return;
}
*(p2++) = 0;
- start = atoi(p);
+ start = strtoll(p, NULL, 10);
p = p2;
if((p2 = strchr(p, ' ')) == NULL)
{
return;
}
*(p2++) = 0;
- numbytes = atoi(p);
+ numbytes = strtoll(p, NULL, 10);
p = p2;
if(!strcmp(cmd, "$UGetBlock") || !strcmp(cmd, "$UGetZBlock"))
charset = "UTF-8";
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);
}
{
int i;
char **argv, *buf;
- int start, numbytes;
+ off_t start, numbytes;
struct sharecache *node;
struct stat sb;
struct socket *lesk;
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))
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, "|");
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)
{
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))
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);
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;
return;
}
*p2 = 0;
- size = atoi(p);
+ size = strtoll(p, NULL, 10);
p = p2 + 1;
if((p2 = strchr(p, '/')) == NULL)
{
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);
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);
#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;
wchar_t *filename;
struct fnet *fnet;
wchar_t *peerid, *peernick;
- size_t size;
+ off_t size;
int slots;
struct fnetnode *fn;
double time;
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;
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");
{
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);
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;
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);
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);
#define NOTIF_STR 2
#define NOTIF_FLOAT 3
#define NOTIF_ID 4
+#define NOTIF_OFF 5
#define NOTIF_PEND 0
#define NOTIF_WAIT 1
union
{
int n;
+ off_t o;
wchar_t *s;
double d;
} d;
{
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);
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)
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;
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);
}
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);
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;
{
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);
}
}
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)
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);
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);
#define DC_LATEST 2
+typedef long long dc_lnum_t;
+
struct dc_response
{
struct dc_response *next, *prev;
union
{
int num;
+ dc_lnum_t lnum;
wchar_t *str;
double flnum;
} val;
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;
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
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;
}
}
"s" => "RESP_STR",
"d" => "RESP_DSC",
"i" => "RESP_INT",
+ "I" => "RESP_LNUM",
"f" => "RESP_FLOAT"
);
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);
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;
case DC_LOGIN_ERR_AUTHFAIL:
errstr = "authfail";
break;
+ default:
+ errstr = "unknown";
+ break;
}
pyerr = PyString_FromString(errstr);
if(reason == NULL)
:lssr
-200 s s s i i i f s
+200 s s s I i i f s
201
514
:lssrch
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
#define RESP_STR 1
#define RESP_INT 2
#define RESP_FLOAT 3
+#define RESP_LNUM 4
struct respclass
{
{
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);
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++;
#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>
}
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);
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;
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)
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)