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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #if HAVE_UNISTD_H
  12. #include <unistd.h>
  13. #endif
  14. #if HAVE_FCNTL_H
  15. #include <fcntl.h>
  16. #endif
  17. #include "auth.h"
  18. static const char rcsid[]="$Id: chain.c,v 1.4 2000/05/14 17:39:10 mrsam Exp $";
  19. void authchain(int argc, char **argv, const char *buf)
  20. {
  21. int pipes[2];
  22. pid_t p;
  23. int l, n;
  24. char **vec;
  25. char *prog;
  26. vec=authcopyargv(argc, argv, &prog);
  27. close(3);
  28. if (!prog || open("/dev/null", O_RDONLY) != 3) authexit(1);
  29. if (pipe(pipes))
  30. {
  31. perror("pipe");
  32. authexit(1);
  33. }
  34. while ((p=fork()) < 0)
  35. {
  36. perror("fork");
  37. sleep(3);
  38. }
  39. close(3);
  40. if (p)
  41. {
  42. dup(pipes[0]);
  43. close(pipes[0]);
  44. close(pipes[1]);
  45. execv(prog, vec);
  46. perror(prog);
  47. authexit(1);
  48. }
  49. l=strlen(buf);
  50. close(pipes[0]);
  51. while (l)
  52. {
  53. n=write(pipes[1], buf, l);
  54. if (n <= 0) break;
  55. buf += n;
  56. l -= n;
  57. }
  58. close(pipes[1]);
  59. authexit(1);
  60. }