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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #include "auth.h"
  6. #include "authmod.h"
  7. #include "authwait.h"
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <signal.h>
  12. #if HAVE_UNISTD_H
  13. #include <unistd.h>
  14. #endif
  15. static const char rcsid[]="$Id: authmod.c,v 1.4 1999/12/20 03:10:53 mrsam Exp $";
  16. static char authrec[BUFSIZ];
  17. static char buf[BUFSIZ];
  18. void authmod_init(
  19. int argc,
  20. char **argv,
  21. const char **service,
  22. const char **authtype,
  23. char **authdata)
  24. {
  25. FILE *fpin;
  26. int waitstat;
  27. const char *a=getenv("AUTHENTICATED");
  28. char *p;
  29. int n;
  30. if (a && *a) /* Already a good guy */
  31. authmod_success(argc, argv, a);
  32. n=0;
  33. fpin=fdopen(3, "r");
  34. if (fpin)
  35. {
  36. int c;
  37. while ((c=getc(fpin)) != EOF)
  38. if (n < sizeof(buf)-1)
  39. buf[n++]=c;
  40. buf[n]=0;
  41. }
  42. if (n == 0)
  43. {
  44. write(2, "AUTHFAILUREn", 12);
  45. authexit(1);
  46. }
  47. fclose(fpin);
  48. close(3); /* Insurance */
  49. strcpy(authrec, buf);
  50. signal(SIGCHLD, SIG_DFL);
  51. while (wait(&waitstat) >= 0)
  52. ;
  53. p=buf;
  54. *service=p;
  55. while (*p && *p != 'n')
  56. ++p;
  57. if (*p) *p++=0;
  58. *authtype=p;
  59. while (*p && *p != 'n')
  60. ++p;
  61. if (*p) *p++=0;
  62. *authdata=p;
  63. }
  64. void authmod_success(int argc, char **argv, const char *a)
  65. {
  66. char **vec, *prog;
  67. char *b;
  68. vec=authcopyargv(argc-1, argv+1, &prog);
  69. if (!prog) authexit(1);
  70. b=malloc(sizeof("AUTHENTICATED=")+strlen(a));
  71. if (!b)
  72. {
  73. perror("malloc");
  74. authexit(1);
  75. }
  76. strcat(strcpy(b, "AUTHENTICATED="), a);
  77. putenv(b);
  78. execv(prog, vec);
  79. perror("exec");
  80. authexit(1);
  81. }
  82. void authmod_fail(int argc, char **argv)
  83. {
  84. authchain(argc-1, argv+1, authrec); /* Next module */
  85. }