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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 2000 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. /* $Id: maildirmake.c,v 1.5 2000/05/07 17:14:24 mrsam Exp $ */
  6. #if HAVE_CONFIG_H
  7. #include "config.h"
  8. #endif
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #if HAVE_FCNTL_H
  13. #include <fcntl.h>
  14. #endif
  15. #if HAVE_UNISTD_H
  16. #include <unistd.h>
  17. #endif
  18. #include <sys/types.h>
  19. #if HAVE_SYS_STAT_H
  20. #include <sys/stat.h>
  21. #endif
  22. #include <ctype.h>
  23. #include "maildircreate.h"
  24. #include "maildirmisc.h"
  25. #include "maildirsharedrc.h"
  26. static void usage()
  27. {
  28. printf("Usage: maildirmake [ options ] maildirn");
  29. exit(1);
  30. }
  31. extern FILE *maildir_shared_fopen(const char *, const char *);
  32. extern void maildir_shared_fparse(char *, char **, char **);
  33. static void add(const char *dir, const char *name)
  34. {
  35. char *c=malloc(strlen(name)+1);
  36. char *s;
  37. FILE *fp;
  38. char buf[BUFSIZ];
  39. char *ptr, *dirp;
  40. if (!c)
  41. {
  42. perror("malloc");
  43. exit(1);
  44. }
  45. strcpy(c, name);
  46. if ((s=strchr(c, '=')) == 0)
  47. usage();
  48. *s++=0;
  49. if (*s != '/')
  50. usage();
  51. if (access(s, R_OK))
  52. {
  53. perror(s);
  54. exit(1);
  55. }
  56. if (strchr(c, '.') || strchr(c, '/'))
  57. {
  58. fprintf(stderr, "%s: invalid namen", c);
  59. exit(1);
  60. }
  61. if (chdir(dir))
  62. {
  63. perror(dir);
  64. exit(1);
  65. }
  66. if ((fp=fopen(MAILDIRSHAREDRC, "r")) != 0)
  67. {
  68. while ((ptr=fgets(buf, sizeof(buf), fp)) != 0)
  69. {
  70. char *namep;
  71. maildir_shared_fparse(buf, &namep, &dirp);
  72. if (!namep) continue;
  73. if (strcmp(namep, c) == 0)
  74. {
  75. fclose(fp);
  76. fprintf(stderr,
  77. "%s: already defined as a sharable maildir in %s.n",
  78. namep, MAILDIRSHAREDRC);
  79. exit(2);
  80. }
  81. }
  82. fclose(fp);
  83. }
  84. if ((fp=maildir_shared_fopen(".", "a+")) == 0)
  85. {
  86. perror(dir);
  87. exit(1);
  88. }
  89. while ((ptr=fgets(buf, sizeof(buf), fp)) != 0)
  90. {
  91. char *namep;
  92. maildir_shared_fparse(buf, &namep, &dirp);
  93. if (!namep) continue;
  94. if (strcmp(namep, c) == 0)
  95. {
  96. fclose(fp);
  97. fprintf(stderr, "%s: already defined as a sharable maildir.n",
  98. namep);
  99. exit(2);
  100. }
  101. }
  102. fprintf(fp, "%st%sn", c, s);
  103. if (fflush(fp) || ferror(fp) || fclose(fp))
  104. {
  105. perror("dir");
  106. exit(1);
  107. }
  108. exit(0);
  109. }
  110. static void del(const char *dir, const char *n)
  111. {
  112. FILE *fp;
  113. char buf[BUFSIZ];
  114. char buf2[BUFSIZ];
  115. char *tmpname, *newname;
  116. int rc;
  117. FILE *fp2;
  118. int found;
  119. if (chdir(dir))
  120. {
  121. perror(dir);
  122. exit(1);
  123. }
  124. if ((fp=maildir_shared_fopen(".", "r")) == 0)
  125. {
  126. perror(dir);
  127. exit(1);
  128. }
  129. for (;;)
  130. {
  131. rc=maildir_try_create(".", "", 0, &tmpname, &newname);
  132. if (rc < 0)
  133. {
  134. perror(dir);
  135. exit(1);
  136. }
  137. if (rc == 0) break;
  138. sleep(3);
  139. }
  140. free(newname);
  141. rc=maildir_safeopen(tmpname, O_CREAT|O_WRONLY|O_EXCL, 0600);
  142. if (rc < 0)
  143. {
  144. perror(tmpname);
  145. exit(1);
  146. }
  147. fp2=fdopen(rc, "w");
  148. if (!fp2)
  149. {
  150. perror(tmpname);
  151. close(rc);
  152. unlink(tmpname);
  153. free(tmpname);
  154. exit(1);
  155. }
  156. found=0;
  157. while (fgets(buf, sizeof(buf), fp))
  158. {
  159. char *name, *dirp;
  160. strcpy(buf2, buf);
  161. maildir_shared_fparse(buf2, &name, &dirp);
  162. if (name && strcmp(name, n) == 0)
  163. {
  164. found=1;
  165. continue;
  166. }
  167. fprintf(fp2, "%s", buf);
  168. }
  169. fclose(fp);
  170. if (fflush(fp2) || ferror(fp2) || fclose(fp2) || rename(tmpname,
  171. "shared-maildirs"))
  172. {
  173. perror(tmpname);
  174. unlink(tmpname);
  175. exit(1);
  176. }
  177. free(tmpname);
  178. if (!found)
  179. {
  180. fprintf(stderr, "%s: not found.n", n);
  181. exit(1);
  182. }
  183. exit(0);
  184. }
  185. int main(int argc, char *argv[])
  186. {
  187. const char *maildir, *folder=0;
  188. char *p;
  189. int argn;
  190. int perm=0700;
  191. int musthavefolder=0;
  192. int subdirperm;
  193. char *addshared=0, *delshared=0;
  194. for (argn=1; argn<argc; argn++)
  195. {
  196. if (argv[argn][0] != '-') break;
  197. if (strcmp(argv[argn], "-") == 0) break;
  198. if (strncmp(argv[argn], "-f", 2) == 0)
  199. {
  200. folder=argv[argn]+2;
  201. if (*folder == 0 && argn+1 < argc)
  202. folder=argv[++argn];
  203. continue;
  204. }
  205. if (strcmp(argv[argn], "-S") == 0)
  206. {
  207. perm=0755;
  208. continue;
  209. }
  210. if (strncmp(argv[argn], "-s", 2) == 0)
  211. {
  212. const char *p=argv[argn]+2;
  213. if (*p == 0 && argn+1 < argc)
  214. p=argv[++argn];
  215. perm=0755;
  216. for (; *p; ++p)
  217. {
  218. if (isspace((int)(unsigned char)*p) ||
  219. *p == ',')
  220. continue;
  221. if (*p == 'r')
  222. perm=0755;
  223. else if (*p == 'w')
  224. perm=0777 | S_ISVTX;
  225. else if (*p == 'g')
  226. perm &= ~0007;
  227. while (*p && !isspace((int)(unsigned char)*p)
  228. && *p != ',')
  229. ++p;
  230. if (!*p) break;
  231. }
  232. musthavefolder=1;
  233. continue;
  234. }
  235. if (strcmp(argv[argn], "--add") == 0 && argc-argn > 1)
  236. {
  237. addshared=argv[++argn];
  238. continue;
  239. }
  240. if (strcmp(argv[argn], "--del") == 0 && argc-argn > 1)
  241. {
  242. delshared=argv[++argn];
  243. continue;
  244. }
  245. usage();
  246. }
  247. if (argn == argc) usage();
  248. maildir=argv[argn];
  249. if (addshared)
  250. {
  251. add(maildir, addshared);
  252. exit (0);
  253. }
  254. if (delshared)
  255. {
  256. del(maildir, delshared);
  257. exit (0);
  258. }
  259. if (folder && *folder == '.')
  260. {
  261. printf("Invalid folder name: %sn", folder);
  262. exit(1);
  263. }
  264. if (folder)
  265. {
  266. if ((p=(char *)malloc(strlen(folder)+2)) == 0)
  267. {
  268. perror("maildirmake");
  269. exit(1);
  270. }
  271. p[0]='.';
  272. strcpy(p+1, folder);
  273. folder=p;
  274. }
  275. else if (musthavefolder)
  276. usage();
  277. subdirperm=perm;
  278. if (!folder) subdirperm=0700;
  279. umask(0);
  280. if ((folder && chdir(maildir)) ||
  281. mkdir(folder ? folder:maildir, perm & ~0022) < 0 ||
  282. chdir(folder ? folder:maildir) < 0 ||
  283. mkdir("tmp", subdirperm) < 0 ||
  284. chmod("tmp", subdirperm) < 0 ||
  285. mkdir("new", subdirperm) < 0 ||
  286. chmod("new", subdirperm) < 0 ||
  287. mkdir("cur", subdirperm) < 0 ||
  288. chmod("cur", subdirperm) < 0 ||
  289. (folder && open("maildirfolder", O_CREAT|O_WRONLY, 0600) < 0))
  290. {
  291. perror("maildirmake");
  292. exit(1);
  293. }
  294. exit(0);
  295. return (0);
  296. }