--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/courier-authlib/authmod.c Wed Jan 16 22:39:43 2008 +0100
@@ -0,0 +1,101 @@
+/*
+** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
+** distribution information.
+*/
+
+#include "auth.h"
+#include "authmod.h"
+#include "authwait.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <signal.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+static const char rcsid[]="$Id: authmod.c,v 1.1 2000/04/13 17:55:05 bruce Exp $";
+
+static char authrec[BUFSIZ];
+static char buf[BUFSIZ];
+
+void authmod_init(
+ int argc,
+ char **argv,
+ const char **service,
+ const char **authtype,
+ char **authdata)
+{
+FILE *fpin;
+int waitstat;
+const char *a=getenv("AUTHENTICATED");
+char *p;
+int n;
+
+ if (a && *a) /* Already a good guy */
+ authmod_success(argc, argv, a);
+
+ n=0;
+ fpin=fdopen(3, "r");
+ if (fpin)
+ {
+ int c;
+
+ while ((c=getc(fpin)) != EOF)
+ if (n < sizeof(buf)-1)
+ buf[n++]=c;
+ buf[n]=0;
+ }
+
+ if (n == 0)
+ {
+ write(2, "AUTHFAILURE\n", 12);
+ authexit(1);
+ }
+
+ fclose(fpin);
+ close(3); /* Insurance */
+ strcpy(authrec, buf);
+
+ signal(SIGCHLD, SIG_DFL);
+
+ while (wait(&waitstat) >= 0)
+ ;
+
+ p=buf;
+ *service=p;
+ while (*p && *p != '\n')
+ ++p;
+ if (*p) *p++=0;
+ *authtype=p;
+ while (*p && *p != '\n')
+ ++p;
+ if (*p) *p++=0;
+ *authdata=p;
+}
+
+void authmod_success(int argc, char **argv, const char *a)
+{
+char **vec, *prog;
+char *b;
+
+ vec=authcopyargv(argc-1, argv+1, &prog);
+ if (!prog) authexit(1);
+
+ b=malloc(sizeof("AUTHENTICATED=")+strlen(a));
+ if (!b)
+ {
+ perror("malloc");
+ authexit(1);
+ }
+ strcat(strcpy(b, "AUTHENTICATED="), a);
+ putenv(b);
+ execv(prog, vec);
+ perror("exec");
+ authexit(1);
+}
+
+void authmod_fail(int argc, char **argv)
+{
+ authchain(argc-1, argv+1, authrec); /* Next module */
+}