summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/maildir/maildir.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/maildir/maildir.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/maildir/maildir.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/kmicromail/libetpan/maildir/maildir.c b/kmicromail/libetpan/maildir/maildir.c
index 320ef81..0e038b1 100644
--- a/kmicromail/libetpan/maildir/maildir.c
+++ b/kmicromail/libetpan/maildir/maildir.c
@@ -421,48 +421,50 @@ static char * libetpan_basename(char * filename)
421 next = strchr(p + 1, '/'); 421 next = strchr(p + 1, '/');
422 } 422 }
423 423
424 if (p == filename) 424 if (p == filename)
425 return filename; 425 return filename;
426 else 426 else
427 return p + 1; 427 return p + 1;
428} 428}
429#else 429#else
430#define libetpan_basename(a) basename(a) 430#define libetpan_basename(a) basename(a)
431#endif 431#endif
432 432
433int maildir_message_add(struct maildir * md, 433int maildir_message_add_uid(struct maildir * md,
434 const char * message, size_t size) 434 const char * message, size_t size,
435 char * uid, size_t max_uid_len)
435{ 436{
436 char path_new[PATH_MAX]; 437 char path_new[PATH_MAX];
437 char tmpname[PATH_MAX]; 438 char tmpname[PATH_MAX];
438 int fd; 439 int fd;
439 int r; 440 int r;
440 char * mapping; 441 char * mapping;
441 char * delivery_tmp_name; 442 char * delivery_tmp_name;
442 char * delivery_tmp_basename; 443 char * delivery_tmp_basename;
443 char delivery_new_name[PATH_MAX]; 444 char delivery_new_name[PATH_MAX];
444 char * delivery_new_basename; 445 char * delivery_new_basename;
445 int res; 446 int res;
446 struct stat stat_info; 447 struct stat stat_info;
447 448
448 r = maildir_update(md); 449 r = maildir_update(md);
449 if (r != MAILDIR_NO_ERROR) { 450 if (r != MAILDIR_NO_ERROR) {
450 res = r; 451 res = r;
451 goto err; 452 goto err;
452 } 453 }
453 454
454 /* write to tmp/ with a classic temporary file */ 455 /* write to tmp/ with a classic temporary file */
455 456
456 snprintf(tmpname, sizeof(tmpname), "%s/tmp/etpan-maildir-XXXXXX", md->mdir_path); 457 snprintf(tmpname, sizeof(tmpname), "%s/tmp/etpan-maildir-XXXXXX",
458 md->mdir_path);
457 fd = mkstemp(tmpname); 459 fd = mkstemp(tmpname);
458 if (fd < 0) { 460 if (fd < 0) {
459 res = MAILDIR_ERROR_FILE; 461 res = MAILDIR_ERROR_FILE;
460 goto err; 462 goto err;
461 } 463 }
462 464
463 r = ftruncate(fd, size); 465 r = ftruncate(fd, size);
464 if (r < 0) { 466 if (r < 0) {
465 res = MAILDIR_ERROR_FILE; 467 res = MAILDIR_ERROR_FILE;
466 goto close; 468 goto close;
467 } 469 }
468 470
@@ -512,62 +514,79 @@ int maildir_message_add(struct maildir * md,
512 } 514 }
513 515
514 md->mdir_mtime_new = stat_info.st_mtime; 516 md->mdir_mtime_new = stat_info.st_mtime;
515 517
516 delivery_new_basename = libetpan_basename(delivery_new_name); 518 delivery_new_basename = libetpan_basename(delivery_new_name);
517 519
518 r = add_message(md, delivery_new_basename, 1); 520 r = add_message(md, delivery_new_basename, 1);
519 if (r != MAILDIR_NO_ERROR) { 521 if (r != MAILDIR_NO_ERROR) {
520 unlink(delivery_new_name); 522 unlink(delivery_new_name);
521 res = MAILDIR_ERROR_FILE; 523 res = MAILDIR_ERROR_FILE;
522 goto unlink_tmp; 524 goto unlink_tmp;
523 } 525 }
524 526
527 if (uid != NULL)
528 strncpy(uid, delivery_new_basename, max_uid_len);
529
525 unlink(delivery_tmp_name); 530 unlink(delivery_tmp_name);
526 free(delivery_tmp_name); 531 free(delivery_tmp_name);
527 532
528 return MAILDIR_NO_ERROR; 533 return MAILDIR_NO_ERROR;
529 534
530 unlink_tmp: 535 unlink_tmp:
531 unlink(delivery_tmp_name); 536 unlink(delivery_tmp_name);
532 free(delivery_tmp_name); 537 free(delivery_tmp_name);
533 goto err; 538 goto err;
534 close: 539 close:
535 close(fd); 540 close(fd);
536 unlink: 541 unlink:
537 unlink(tmpname); 542 unlink(tmpname);
538 err: 543 err:
539 return res; 544 return res;
540} 545}
541 546
542int maildir_message_add_file(struct maildir * md, int fd) 547int maildir_message_add(struct maildir * md,
548 const char * message, size_t size)
549{
550 return maildir_message_add_uid(md, message, size,
551 NULL, 0);
552}
553
554int maildir_message_add_file_uid(struct maildir * md, int fd,
555 char * uid, size_t max_uid_len)
543{ 556{
544 char * message; 557 char * message;
545 struct stat buf; 558 struct stat buf;
546 int r; 559 int r;
547 560
548 if (fstat(fd, &buf) == -1) 561 if (fstat(fd, &buf) == -1)
549 return MAILDIR_ERROR_FILE; 562 return MAILDIR_ERROR_FILE;
550 563
551 message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 564 message = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
552 if (message == MAP_FAILED) 565 if (message == MAP_FAILED)
553 return MAILDIR_ERROR_FILE; 566 return MAILDIR_ERROR_FILE;
554 567
555 r = maildir_message_add(md, message, buf.st_size); 568 r = maildir_message_add_uid(md, message, buf.st_size, uid, max_uid_len);
556 569
557 munmap(message, buf.st_size); 570 munmap(message, buf.st_size);
558 571
559 return r; 572 return r;
560} 573}
561 574
575int maildir_message_add_file(struct maildir * md, int fd)
576{
577 return maildir_message_add_file_uid(md, fd,
578 NULL, 0);
579}
580
562char * maildir_message_get(struct maildir * md, const char * uid) 581char * maildir_message_get(struct maildir * md, const char * uid)
563{ 582{
564 chashdatum key; 583 chashdatum key;
565 chashdatum value; 584 chashdatum value;
566 char filename[PATH_MAX]; 585 char filename[PATH_MAX];
567 char * dup_filename; 586 char * dup_filename;
568 struct maildir_msg * msg; 587 struct maildir_msg * msg;
569 char * dir; 588 char * dir;
570 int r; 589 int r;
571 590
572 key.data = (void *) uid; 591 key.data = (void *) uid;
573 key.len = strlen(uid); 592 key.len = strlen(uid);