authmoduser2.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 <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <ctype.h>
  11. #include <signal.h>
  12. #if HAVE_UNISTD_H
  13. #include <unistd.h>
  14. #endif
  15. #include <time.h>
  16. #include "authwait.h"
  17. static const char rcsid[]="$Id: authmoduser2.c,v 1.7 2000/05/02 04:31:49 mrsam Exp $";
  18. int authmoduser(int argc, char **argv, unsigned timeout, unsigned errsleep)
  19. {
  20. const char *p;
  21. int rc;
  22. char namebuf[60];
  23. int n;
  24. time_t t, expinterval;
  25. char *q, *r;
  26. int waitstat;
  27. signal(SIGCHLD, SIG_DFL);
  28. while (wait(&waitstat) >= 0)
  29. ;
  30. p=getenv("AUTHUSER");
  31. if (!p && argc && argv[0][0] == '/')
  32. /* Set AUTHUSER from argv[0] */
  33. {
  34. q=malloc(sizeof("AUTHUSER=")+strlen(argv[0]));
  35. if (!q)
  36. {
  37. perror("malloc");
  38. authexit(1);
  39. }
  40. strcat(strcpy(q, "AUTHUSER="), argv[0]);
  41. putenv(q);
  42. }
  43. else if (!p || *p != '/')
  44. {
  45. write(2, argv[0], strlen(argv[0]));
  46. write(2, ": AUTHUSER is not initialized to a complete pathn",
  47. 49);
  48. authexit(1);
  49. }
  50. putenv("AUTHENTICATED=");
  51. if (argc < 2)
  52. {
  53. write(2, "AUTHFAILUREn", 12);
  54. authexit(1);
  55. }
  56. p=getenv("AUTHARGC");
  57. rc= p && *p && *p != '0' ? 0:1;
  58. sprintf(namebuf, "AUTHARGC=%d", argc);
  59. r=strdup(namebuf);
  60. if (!r)
  61. {
  62. perror("strdup");
  63. authexit(1);
  64. }
  65. putenv(r);
  66. for (n=0; n<argc; n++)
  67. {
  68. char *p;
  69. sprintf(namebuf, "AUTHARGV%d=", n);
  70. p=malloc(strlen(namebuf)+1+strlen(argv[n]));
  71. if (!p)
  72. {
  73. perror("malloc");
  74. authexit(1);
  75. }
  76. strcat(strcpy(p, namebuf), argv[n]);
  77. putenv(p);
  78. }
  79. if (rc == 0 && errsleep) sleep(errsleep);
  80. time(&t);
  81. p=getenv("AUTHEXPIRE");
  82. if (p && isdigit((int)(unsigned char)*p))
  83. {
  84. expinterval=0;
  85. do
  86. {
  87. expinterval=expinterval * 10 + (*p++ - '0');
  88. } while ( isdigit((int)(unsigned char)*p) );
  89. }
  90. else
  91. {
  92. time_t n;
  93. expinterval=t + timeout;
  94. q=namebuf+sizeof(namebuf)-1;
  95. *q=0;
  96. n=expinterval;
  97. do
  98. {
  99. *--q = '0' + ( n % 10 );
  100. } while ( (n = n/10) != 0);
  101. q -= sizeof("AUTHEXPIRE=")-1;
  102. memcpy(q, "AUTHEXPIRE=", sizeof("AUTHEXPIRE=")-1);
  103. q=strdup(q);
  104. if (!q)
  105. {
  106. perror("strdup");
  107. authexit(1);
  108. }
  109. putenv(q);
  110. }
  111. if (timeout)
  112. {
  113. if (expinterval <= t) authexit(1);
  114. alarm(expinterval - t);
  115. }
  116. return (rc);
  117. }