Diffstat (limited to 'kmicromail/libetpan/maildir/maildir.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libetpan/maildir/maildir.c | 33 |
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 | ||
433 | int maildir_message_add(struct maildir * md, | 433 | int 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 | ||
542 | int maildir_message_add_file(struct maildir * md, int fd) | 547 | int 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 | |||
554 | int 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 | ||
575 | int maildir_message_add_file(struct maildir * md, int fd) | ||
576 | { | ||
577 | return maildir_message_add_file_uid(md, fd, | ||
578 | NULL, 0); | ||
579 | } | ||
580 | |||
562 | char * maildir_message_get(struct maildir * md, const char * uid) | 581 | char * 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); |