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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #include "auth.h"
  6. #include "authmod.h"
  7. #include "authwait.h"
  8. #include <sys/types.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <fcntl.h>
  13. #if HAVE_UNISTD_H
  14. #include <unistd.h>
  15. #endif
  16. #include <signal.h>
  17. static const char rcsid[]="$Id: authmoduser.c,v 1.5 2000/05/28 20:48:08 mrsam Exp $";
  18. void authmod(int argc, char **argv,
  19. const char *service,
  20. const char *authtype,
  21. const char *authdata)
  22. {
  23. int pipe3fd[2];
  24. pid_t pid;
  25. char *buf;
  26. int waitstat;
  27. char *p;
  28. int l;
  29. signal(SIGCHLD, SIG_DFL);
  30. while (wait(&waitstat) >= 0)
  31. ;
  32. alarm(0);
  33. close(3);
  34. while (open("/dev/null", O_RDWR) != 3)
  35. ;
  36. if (pipe(pipe3fd))
  37. {
  38. perror("pipe");
  39. authexit(1);
  40. }
  41. while ((pid=fork()) == -1)
  42. {
  43. sleep(5);
  44. }
  45. if (pid)
  46. {
  47. char *prog;
  48. char **argvec=authcopyargv(argc, argv, &prog);
  49. if (!prog) authexit(1);
  50. close(3);
  51. dup(pipe3fd[0]);
  52. close(pipe3fd[0]);
  53. close(pipe3fd[1]);
  54. execv(prog, argvec);
  55. perror("exec");
  56. authexit(1);
  57. }
  58. close(3);
  59. close(pipe3fd[0]);
  60. buf=malloc(strlen(service)+strlen(authtype)+strlen(authdata)+4);
  61. if (!buf)
  62. {
  63. perror("malloc");
  64. authexit(1);
  65. }
  66. sprintf(buf, "%sn%sn%sn", service, authtype, authdata);
  67. p=buf;
  68. l=strlen(p);
  69. while (l)
  70. {
  71. int n=write(pipe3fd[1], p, l);
  72. if (n <= 0) break;
  73. p += n;
  74. l -= n;
  75. }
  76. free(buf);
  77. close(pipe3fd[0]);
  78. close(pipe3fd[1]);
  79. authexit(1);
  80. }