Skip to content

Commit

Permalink
imap-send: remove useless uid code
Browse files Browse the repository at this point in the history
The imap-send code is based on code from isync, a program
for syncing imap mailboxes. Because of this, it has
inherited some code that makes sense for isync, but not for
imap-send.

In particular, when storing a message, it does one of:

  - if the server supports it, note the server-assigned
    unique identifier (UID) given to each message

  - otherwise, assigned a random UID and store it in the
    message header as X-TUID

Presumably this is used in isync to be able to synchronize
mailstores multiple times without duplication. But for
imap-send, the values are useless; we never do anything
with them and simply forget them at the end of the program.

This patch removes the useless code. Not only is it nice for
maintainability to get rid of dead code, but the removed
code relied on the existence of /dev/urandom, which made it
a portability problem for non-Unix platforms.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Oct 20, 2009
1 parent 1be224b commit 3a7cba9
Showing 1 changed file with 11 additions and 144 deletions.
155 changes: 11 additions & 144 deletions imap-send.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,6 @@ static int nfvasprintf(char **strp, const char *fmt, va_list ap)
return len;
}

static void arc4_init(void);
static unsigned char arc4_getbyte(void);

struct imap_server_conf {
char *name;
char *tunnel;
Expand Down Expand Up @@ -489,52 +486,6 @@ static int nfsnprintf(char *buf, int blen, const char *fmt, ...)
return ret;
}

static struct {
unsigned char i, j, s[256];
} rs;

static void arc4_init(void)
{
int i, fd;
unsigned char j, si, dat[128];

if ((fd = open("/dev/urandom", O_RDONLY)) < 0 && (fd = open("/dev/random", O_RDONLY)) < 0) {
fprintf(stderr, "Fatal: no random number source available.\n");
exit(3);
}
if (read_in_full(fd, dat, 128) != 128) {
fprintf(stderr, "Fatal: cannot read random number source.\n");
exit(3);
}
close(fd);

for (i = 0; i < 256; i++)
rs.s[i] = i;
for (i = j = 0; i < 256; i++) {
si = rs.s[i];
j += si + dat[i & 127];
rs.s[i] = rs.s[j];
rs.s[j] = si;
}
rs.i = rs.j = 0;

for (i = 0; i < 256; i++)
arc4_getbyte();
}

static unsigned char arc4_getbyte(void)
{
unsigned char si, sj;

rs.i++;
si = rs.s[rs.i];
rs.j += si;
sj = rs.s[rs.j];
rs.s[rs.i] = sj;
rs.s[rs.j] = si;
return rs.s[(si + sj) & 0xff];
}

static struct imap_cmd *v_issue_imap_cmd(struct imap_store *ctx,
struct imap_cmd_cb *cb,
const char *fmt, va_list ap)
Expand Down Expand Up @@ -1198,88 +1149,20 @@ static int imap_make_flags(int flags, char *buf)
return d;
}

#define TUIDL 8

static int imap_store_msg(struct store *gctx, struct msg_data *data, int *uid)
static int imap_store_msg(struct store *gctx, struct msg_data *data)
{
struct imap_store *ctx = (struct imap_store *)gctx;
struct imap *imap = ctx->imap;
struct imap_cmd_cb cb;
char *fmap, *buf;
const char *prefix, *box;
int ret, i, j, d, len, extra, nocr;
int start, sbreak = 0, ebreak = 0;
char flagstr[128], tuid[TUIDL * 2 + 1];
int ret, d;
char flagstr[128];

memset(&cb, 0, sizeof(cb));

fmap = data->data;
len = data->len;
nocr = !data->crlf;
extra = 0, i = 0;
if (!CAP(UIDPLUS) && uid) {
nloop:
start = i;
while (i < len)
if (fmap[i++] == '\n') {
extra += nocr;
if (i - 2 + nocr == start) {
sbreak = ebreak = i - 2 + nocr;
goto mktid;
}
if (!memcmp(fmap + start, "X-TUID: ", 8)) {
extra -= (ebreak = i) - (sbreak = start) + nocr;
goto mktid;
}
goto nloop;
}
/* invalid message */
free(fmap);
return DRV_MSG_BAD;
mktid:
for (j = 0; j < TUIDL; j++)
sprintf(tuid + j * 2, "%02x", arc4_getbyte());
extra += 8 + TUIDL * 2 + 2;
}
if (nocr)
for (; i < len; i++)
if (fmap[i] == '\n')
extra++;

cb.dlen = len + extra;
buf = cb.data = xmalloc(cb.dlen);
i = 0;
if (!CAP(UIDPLUS) && uid) {
if (nocr) {
for (; i < sbreak; i++)
if (fmap[i] == '\n') {
*buf++ = '\r';
*buf++ = '\n';
} else
*buf++ = fmap[i];
} else {
memcpy(buf, fmap, sbreak);
buf += sbreak;
}
memcpy(buf, "X-TUID: ", 8);
buf += 8;
memcpy(buf, tuid, TUIDL * 2);
buf += TUIDL * 2;
*buf++ = '\r';
*buf++ = '\n';
i = ebreak;
}
if (nocr) {
for (; i < len; i++)
if (fmap[i] == '\n') {
*buf++ = '\r';
*buf++ = '\n';
} else
*buf++ = fmap[i];
} else
memcpy(buf, fmap + i, len - i);

free(fmap);
cb.dlen = data->len;
cb.data = xmalloc(cb.dlen);
memcpy(cb.data, data->data, data->len);

d = 0;
if (data->flags) {
Expand All @@ -1288,26 +1171,14 @@ static int imap_store_msg(struct store *gctx, struct msg_data *data, int *uid)
}
flagstr[d] = 0;

if (!uid) {
box = gctx->conf->trash;
prefix = ctx->prefix;
cb.create = 1;
if (ctx->trashnc)
imap->caps = imap->rcaps & ~(1 << LITERALPLUS);
} else {
box = gctx->name;
prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
cb.create = 0;
}
cb.ctx = uid;
box = gctx->name;
prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
cb.create = 0;
ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" %s", prefix, box, flagstr);
imap->caps = imap->rcaps;
if (ret != DRV_OK)
return ret;
if (!uid)
ctx->trashnc = 0;
else
gctx->count++;
gctx->count++;

return DRV_OK;
}
Expand Down Expand Up @@ -1483,17 +1354,13 @@ int main(int argc, char **argv)
{
struct msg_data all_msgs, msg;
struct store *ctx = NULL;
int uid = 0;
int ofs = 0;
int r;
int total, n = 0;
int nongit_ok;

git_extract_argv0_path(argv[0]);

/* init the random number generator */
arc4_init();

setup_git_directory_gently(&nongit_ok);
git_config(git_imap_config, NULL);

Expand Down Expand Up @@ -1540,7 +1407,7 @@ int main(int argc, char **argv)
break;
if (server.use_html)
wrap_in_html(&msg);
r = imap_store_msg(ctx, &msg, &uid);
r = imap_store_msg(ctx, &msg);
if (r != DRV_OK)
break;
n++;
Expand Down

0 comments on commit 3a7cba9

Please sign in to comment.