maildirfilename.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 2000 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <sys/types.h>
  9. #if HAVE_DIRENT_H
  10. #include <dirent.h>
  11. #define NAMLEN(dirent) strlen((dirent)->d_name)
  12. #else
  13. #define dirent direct
  14. #define NAMLEN(dirent) (dirent)->d_namlen
  15. #if HAVE_SYS_NDIR_H
  16. #include <sys/ndir.h>
  17. #endif
  18. #if HAVE_SYS_DIR_H
  19. #include <sys/dir.h>
  20. #endif
  21. #if HAVE_NDIR_H
  22. #include <ndir.h>
  23. #endif
  24. #endif
  25. #include <sys/types.h>
  26. #include <sys/stat.h>
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include <time.h>
  30. #if HAVE_UNISTD_H
  31. #include <unistd.h>
  32. #endif
  33. #include <stdio.h>
  34. #include <ctype.h>
  35. #include <errno.h>
  36. #include "maildirmisc.h"
  37. static const char rcsid[]="$Id: maildirfilename.c,v 1.2 2000/02/08 02:28:49 mrsam Exp $";
  38. /*
  39. ** char *maildir_filename(const char *maildir, const char *folder,
  40. **   const char *filename)
  41. ** - find a message in a maildir
  42. **
  43. ** Return the full path to the indicated message.  If the message flags
  44. ** in filename have changed, we search the maildir for this message.
  45. */
  46. char *maildir_filename(const char *maildir,
  47. const char *folder, const char *filename)
  48. {
  49. struct stat stat_buf;
  50. char *p, *q;
  51. DIR *dirp;
  52. struct dirent *de;
  53. char *dir;
  54. if (strchr(filename, '/') || *filename == '.')
  55. {
  56. errno=ENOENT;
  57. return (0);
  58. }
  59. dir=maildir_folderdir(maildir, folder);
  60. if (!dir) return (0);
  61. p=malloc(strlen(dir)+strlen(filename)+sizeof("/cur/"));
  62. if (!p)
  63. {
  64. free(dir);
  65. return (0);
  66. }
  67. strcat(strcat(strcpy(p, dir), "/cur/"), filename);
  68. if (stat(p, &stat_buf) == 0)
  69. {
  70. free(dir);
  71. return (p);
  72. }
  73. /* Oh, a wise guy... */
  74. q=strrchr(p, '/');
  75. *q=0;
  76. dirp=opendir(p);
  77. *q='/';
  78. if ( dirp == NULL)
  79. {
  80. free(dir);
  81. return p;
  82. }
  83. /* Compare filenames, ignore filename size if set by maildirquota */
  84. while ((de=readdir(dirp)) != NULL)
  85. {
  86. const char *a=filename;
  87. const char *b=de->d_name;
  88. for (;;)
  89. {
  90. if ( a[0] == ',' && a[1] == 'S' && a[2] == '=')
  91. {
  92. /* File size - quota shortcut - skip */
  93. a += 3;
  94. while (*a && isdigit((int)(unsigned char)*a))
  95. ++a;
  96. }
  97. if ( b[0] == ',' && b[1] == 'S' && b[2] == '=')
  98. {
  99. /* File size - quota shortcut - skip */
  100. b += 3;
  101. while (*b && isdigit((int)(unsigned char)*b))
  102. ++b;
  103. }
  104. if ( (*a == 0 || *a == ':') && (*b == 0 || *b == ':'))
  105. {
  106. free(p);
  107. p=malloc(strlen(dir)+strlen(de->d_name)+
  108. sizeof("/cur/"));
  109. if (!p)
  110. {
  111. closedir(dirp);
  112. free(dir);
  113. return (0);
  114. }
  115. strcat(strcat(strcpy(p, dir), "/cur/"),
  116. de->d_name);
  117. closedir(dirp);
  118. free(dir);
  119. return (p);
  120. }
  121. if ( *a == 0 || *a == ':' || *b == 0 || *b == ':' ||
  122. *a != *b)
  123. break;
  124. ++a;
  125. ++b;
  126. }
  127. }
  128. closedir(dirp);
  129. free(dir);
  130. return (p);
  131. }