praliases.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:8k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char copyright[] =
  15. "@(#) Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.n
  16. All rights reserved.n
  17.      Copyright (c) 1983 Eric P. Allman.  All rights reserved.n
  18.      Copyright (c) 1988, 1993n
  19. The Regents of the University of California.  All rights reserved.n";
  20. #endif /* ! lint */
  21. #ifndef lint
  22. static char id[] = "@(#)$Id: praliases.c,v 8.57 1999/10/13 03:35:16 ca Exp $";
  23. #endif /* ! lint */
  24. #include <sys/types.h>
  25. #include <ctype.h>
  26. #include <stdlib.h>
  27. #include <unistd.h>
  28. #ifdef EX_OK
  29. # undef EX_OK /* unistd.h may have another use for this */
  30. #endif /* EX_OK */
  31. #include <sysexits.h>
  32. #ifndef NOT_SENDMAIL
  33. # define NOT_SENDMAIL
  34. #endif /* ! NOT_SENDMAIL */
  35. #include <sendmail/sendmail.h>
  36. #include <sendmail/pathnames.h>
  37. #include <libsmdb/smdb.h>
  38. static void praliases __P((char *, int, char **));
  39. uid_t RealUid;
  40. gid_t RealGid;
  41. char *RealUserName;
  42. uid_t RunAsUid;
  43. uid_t RunAsGid;
  44. char *RunAsUserName;
  45. int Verbose = 2;
  46. bool DontInitGroups = FALSE;
  47. uid_t TrustedUid = 0;
  48. BITMAP256 DontBlameSendmail;
  49. extern void syserr __P((const char *, ...));
  50. int
  51. main(argc, argv)
  52. int argc;
  53. char **argv;
  54. {
  55. char *cfile;
  56. char *filename = NULL;
  57. FILE *cfp;
  58. int ch;
  59. char afilebuf[MAXLINE];
  60. char buf[MAXLINE];
  61. struct passwd *pw;
  62. static char rnamebuf[MAXNAME];
  63. extern char *optarg;
  64. extern int optind;
  65. clrbitmap(DontBlameSendmail);
  66. RunAsUid = RealUid = getuid();
  67. RunAsGid = RealGid = getgid();
  68. pw = getpwuid(RealUid);
  69. if (pw != NULL)
  70. {
  71. if (strlen(pw->pw_name) > MAXNAME - 1)
  72. pw->pw_name[MAXNAME] = 0;
  73. snprintf(rnamebuf, sizeof rnamebuf, "%s", pw->pw_name);
  74. }
  75. else
  76. snprintf(rnamebuf, sizeof rnamebuf,
  77.  "Unknown UID %d", (int) RealUid);
  78. RunAsUserName = RealUserName = rnamebuf;
  79. cfile = _PATH_SENDMAILCF;
  80. while ((ch = getopt(argc, argv, "C:f:")) != EOF)
  81. {
  82. switch ((char)ch) {
  83. case 'C':
  84. cfile = optarg;
  85. break;
  86. case 'f':
  87. filename = optarg;
  88. break;
  89. case '?':
  90. default:
  91. (void)fprintf(stderr,
  92.       "usage: praliases [-C cffile] [-f aliasfile]n");
  93. exit(EX_USAGE);
  94. }
  95. }
  96. argc -= optind;
  97. argv += optind;
  98. if (filename != NULL)
  99. {
  100. praliases(filename, argc, argv);
  101. exit(EX_OK);
  102. }
  103. if ((cfp = fopen(cfile, "r")) == NULL)
  104. {
  105. fprintf(stderr, "praliases: %s: %sn",
  106. cfile, errstring(errno));
  107. exit(EX_NOINPUT);
  108. }
  109. while (fgets(buf, sizeof(buf), cfp) != NULL)
  110. {
  111. register char *b, *p;
  112. b = strchr(buf, 'n');
  113. if (b != NULL)
  114. *b = '';
  115. b = buf;
  116. switch (*b++)
  117. {
  118.   case 'O': /* option -- see if alias file */
  119. if (strncasecmp(b, " AliasFile", 10) == 0 &&
  120.     !(isascii(b[10]) && isalnum(b[10])))
  121. {
  122. /* new form -- find value */
  123. b = strchr(b, '=');
  124. if (b == NULL)
  125. continue;
  126. while (isascii(*++b) && isspace(*b))
  127. continue;
  128. }
  129. else if (*b++ != 'A')
  130. {
  131. /* something else boring */
  132. continue;
  133. }
  134. /* this is the A or AliasFile option -- save it */
  135. if (strlcpy(afilebuf, b, sizeof afilebuf) >=
  136.     sizeof afilebuf)
  137. {
  138. fprintf(stderr,
  139. "praliases: AliasFile filename too long: %.30sn",
  140. b);
  141. (void) fclose(cfp);
  142. exit(EX_CONFIG);
  143. }
  144. b = afilebuf;
  145. for (p = b; p != NULL; )
  146. {
  147. while (isascii(*p) && isspace(*p))
  148. p++;
  149. if (*p == '')
  150. break;
  151. b = p;
  152. p = strpbrk(p, " ,/");
  153. /* find end of spec */
  154. if (p != NULL)
  155. {
  156. bool quoted = FALSE;
  157. for (; *p != ''; p++)
  158. {
  159. /*
  160. **  Don't break into a quoted
  161. **  string.
  162. */
  163. if (*p == '"')
  164. quoted = !quoted;
  165. else if (*p == ',' && !quoted)
  166. break;
  167. }
  168. /* No more alias specs follow */
  169. if (*p == '')
  170. {
  171. /* chop trailing whitespace */
  172. while (isascii(*p) &&
  173.        isspace(*p) &&
  174.        p > b)
  175. p--;
  176. *p = '';
  177. p = NULL;
  178. }
  179. }
  180. if (p != NULL)
  181. {
  182. char *e = p - 1;
  183. /* chop trailing whitespace */
  184. while (isascii(*e) &&
  185.        isspace(*e) &&
  186.        e > b)
  187. e--;
  188. *++e = '';
  189. *p++ = '';
  190. }
  191. praliases(b, argc, argv);
  192. }
  193.   default:
  194. continue;
  195. }
  196. }
  197. (void) fclose(cfp);
  198. exit(EX_OK);
  199. /* NOTREACHED */
  200. return EX_OK;
  201. }
  202. static void
  203. praliases(filename, argc, argv)
  204. char *filename;
  205. int argc;
  206. char **argv;
  207. {
  208. int result;
  209. char *colon;
  210. char *db_name;
  211. char *db_type;
  212. SMDB_DATABASE *database = NULL;
  213. SMDB_CURSOR *cursor = NULL;
  214. SMDB_DBENT db_key, db_value;
  215. SMDB_DBPARAMS params;
  216. SMDB_USER_INFO user_info;
  217. colon = strchr(filename, ':');
  218. if (colon == NULL)
  219. {
  220. db_name = filename;
  221. db_type = SMDB_TYPE_DEFAULT;
  222. }
  223. else
  224. {
  225. *colon = '';
  226. db_name = colon + 1;
  227. db_type = filename;
  228. }
  229. /* clean off arguments */
  230. for (;;)
  231. {
  232. while (isascii(*db_name) && isspace(*db_name))
  233. db_name++;
  234. if (*db_name != '-')
  235. break;
  236. while (*db_name != '' &&
  237.        !(isascii(*db_name) && isspace(*db_name)))
  238. db_name++;
  239. }
  240. if (*db_name == '' || (db_type != NULL && *db_type == ''))
  241. {
  242. if (colon != NULL)
  243. *colon = ':';
  244. fprintf(stderr, "praliases: illegal alias specification: %sn",
  245. filename);
  246. goto fatal;
  247. }
  248. memset(&params, '', sizeof params);
  249. params.smdbp_cache_size = 1024 * 1024;
  250. user_info.smdbu_id = RunAsUid;
  251. user_info.smdbu_group_id = RunAsGid;
  252. strlcpy(user_info.smdbu_name, RunAsUserName, SMDB_MAX_USER_NAME_LEN);
  253. result = smdb_open_database(&database, db_name, O_RDONLY, 0,
  254.     SFF_ROOTOK, db_type, &user_info, &params);
  255. if (result != SMDBE_OK)
  256. {
  257. fprintf(stderr, "praliases: %s: open: %sn",
  258. db_name, errstring(result));
  259. goto fatal;
  260. }
  261. memset(&db_key, '', sizeof db_key);
  262. memset(&db_value, '', sizeof db_value);
  263. result = database->smdb_cursor(database, &cursor, 0);
  264. if (result != SMDBE_OK)
  265. {
  266. fprintf(stderr, "praliases: %s: set cursor: %sn",
  267. db_name, errstring(result));
  268. goto fatal;
  269. }
  270. while ((result = cursor->smdbc_get(cursor, &db_key, &db_value,
  271.    SMDB_CURSOR_GET_NEXT)) == SMDBE_OK)
  272. {
  273. #if 0
  274. /* skip magic @:@ entry */
  275. if (db_key.data.size == 2 &&
  276.     db_key.data.data[0] == '@' &&
  277.     db_key.data.data[1] == '' &&
  278.     db_value.data.size == 2 &&
  279.     db_value.data.data[0] == '@' &&
  280.     db_value.data.data[1] == '')
  281. continue;
  282. #endif /* 0 */
  283. printf("%.*s:%.*sn",
  284.        (int) db_key.data.size,
  285.        (char *) db_key.data.data,
  286.        (int) db_value.data.size,
  287.        (char *) db_value.data.data);
  288. }
  289. if (result != SMDBE_OK && result != SMDBE_LAST_ENTRY)
  290. {
  291. fprintf(stderr, "praliases: %s: get value at cursor: %sn",
  292. db_name, errstring(result));
  293. goto fatal;
  294. }
  295.  fatal:
  296. if (cursor != NULL)
  297. (void) cursor->smdbc_close(cursor);
  298. if (database != NULL)
  299. (void) database->smdb_close(database);
  300. if (colon != NULL)
  301. *colon = ':';
  302. return;
  303. }
  304. /*VARARGS1*/
  305. void
  306. #ifdef __STDC__
  307. message(const char *msg, ...)
  308. #else /* __STDC__ */
  309. message(msg, va_alist)
  310. const char *msg;
  311. va_dcl
  312. #endif /* __STDC__ */
  313. {
  314. const char *m;
  315. VA_LOCAL_DECL
  316. m = msg;
  317. if (isascii(m[0]) && isdigit(m[0]) &&
  318.     isascii(m[1]) && isdigit(m[1]) &&
  319.     isascii(m[2]) && isdigit(m[2]) && m[3] == ' ')
  320. m += 4;
  321. VA_START(msg);
  322. (void) vfprintf(stderr, m, ap);
  323. VA_END;
  324. (void) fprintf(stderr, "n");
  325. }
  326. /*VARARGS1*/
  327. void
  328. #ifdef __STDC__
  329. syserr(const char *msg, ...)
  330. #else /* __STDC__ */
  331. syserr(msg, va_alist)
  332. const char *msg;
  333. va_dcl
  334. #endif /* __STDC__ */
  335. {
  336. const char *m;
  337. VA_LOCAL_DECL
  338. m = msg;
  339. if (isascii(m[0]) && isdigit(m[0]) &&
  340.     isascii(m[1]) && isdigit(m[1]) &&
  341.     isascii(m[2]) && isdigit(m[2]) && m[3] == ' ')
  342. m += 4;
  343. VA_START(msg);
  344. (void) vfprintf(stderr, m, ap);
  345. VA_END;
  346. (void) fprintf(stderr, "n");
  347. }