2 * $Id: uams_guest.c,v 1.12 2003-03-12 15:07:03 didg Exp $
4 * (c) 2001 (see COPYING)
9 #endif /* HAVE_CONFIG_H */
19 #else /* STDC_HEADERS */
23 #endif /* HAVE_STRCHR */
24 char *strchr (), *strrchr ();
26 #define memcpy(d,s,n) bcopy ((s), (d), (n))
27 #define memmove(d,s,n) bcopy ((s), (d), (n))
28 #endif /* ! HAVE_MEMCPY */
29 #endif /* STDC_HEADERS */
32 #include <atalk/logger.h>
34 #include <atalk/afp.h>
35 #include <atalk/uam.h>
37 /* login and login_ext are almost the same */
38 static int noauth_login(void *obj, struct passwd **uam_pwd,
39 char *ibuf, int ibuflen,
40 char *rbuf, int *rbuflen)
43 char *guest, *username;
46 LOG(log_info, logtype_uams, "login noauth" );
48 if (uam_afpserver_option(obj, UAM_OPTION_GUEST, (void *) &guest,
52 if (uam_afpserver_option(obj, UAM_OPTION_USERNAME,
53 (void *) &username, NULL) < 0)
56 strcpy(username, guest);
57 if ((pwent = getpwnam(guest)) == NULL) {
58 LOG(log_error, logtype_uams, "noauth_login: getpwnam( %s ): %s",
59 guest, strerror(errno) );
60 return( AFPERR_BADUAM );
65 LOG(log_error, logtype_uams, "noauth_login: setpag: %s", strerror(errno) );
66 return( AFPERR_BADUAM );
74 static int noauth_login_ext(void *obj, char *uname, struct passwd **uam_pwd,
75 char *ibuf, int ibuflen,
76 char *rbuf, int *rbuflen)
78 return ( noauth_login (obj, uam_pwd, ibuf, ibuflen, rbuf, rbuflen));
82 /* Printer NoAuthUAM Login */
83 int noauth_printer(start, stop, username, out)
84 char *start, *stop, *username;
88 static const char *loginok = "0\r";
90 data = (char *)malloc(stop - start + 1);
91 strncpy(data, start, stop - start + 1);
93 /* We are looking for the following format in data:
96 * Hopefully username doesn't contain a ")"
99 if ((p = strchr(data, '(' )) == NULL) {
100 LOG(log_info, logtype_uams,"Bad Login NoAuthUAM: username not found in string");
105 if ((q = strchr(data, ')' )) == NULL) {
106 LOG(log_info, logtype_uams,"Bad Login NoAuthUAM: username not found in string");
110 strncpy(username, p, q - p);
112 /* Done copying username, clean up */
115 if (getpwnam(username) == NULL) {
116 LOG(log_info, logtype_uams, "Bad Login NoAuthUAM: %s: %s",
117 username, strerror(errno) );
121 /* Login successful */
122 append(out, loginok, strlen(loginok));
123 LOG(log_info, logtype_uams, "Login NoAuthUAM: %s", username);
128 static int uam_setup(const char *path)
130 if (uam_register(UAM_SERVER_LOGIN_EXT, path, "No User Authent",
131 noauth_login, NULL, NULL, noauth_login_ext) < 0)
134 if (uam_register(UAM_SERVER_PRINTAUTH, path, "NoAuthUAM",
141 static void uam_cleanup()
143 uam_unregister(UAM_SERVER_LOGIN, "No User Authent");
144 uam_unregister(UAM_SERVER_PRINTAUTH, "NoAuthUAM");
147 UAM_MODULE_EXPORT struct uam_export uams_guest = {
150 uam_setup, uam_cleanup