]> arthur.barton.de Git - netatalk.git/blobdiff - etc/uams/uams_krb4/uams_krb4.c
Remove bdb env on exit
[netatalk.git] / etc / uams / uams_krb4 / uams_krb4.c
index e0cd40a9ae407f6770641c28c6d8bdf094c03216..ff7c2c0a4767e9ac7af0eee3394b59173fc08603 100644 (file)
@@ -1,30 +1,57 @@
 /*
+ * $Id: uams_krb4.c,v 1.10 2009-10-15 11:39:48 didg Exp $
+ *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
 
 #if defined( KRB ) || defined( UAM_AFSKRB )
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
+#endif /* HAVE_FCNTL_H */
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <limits.h>
+
+/* STDC check */
+#if STDC_HEADERS
 #include <string.h>
+#else /* STDC_HEADERS */
+#ifndef HAVE_STRCHR
+#define strchr index
+#define strrchr index
+#endif /* HAVE_STRCHR */
+char *strchr (), *strrchr ();
+#ifndef HAVE_MEMCPY
+#define memcpy(d,s,n) bcopy ((s), (d), (n))
+#define memmove(d,s,n) bcopy ((s), (d), (n))
+#endif /* ! HAVE_MEMCPY */
+#endif /* STDC_HEADERS */
+
 #include <ctype.h>
 #include <pwd.h>
-#include <syslog.h>
+#include <atalk/logger.h>
 #include <netinet/in.h>
 #include <des.h>
 #include <krb.h>
+#if 0
 #include <prot.h>
+#endif /* 0 */
 
 #include <netatalk/endian.h>
 #include <atalk/afp.h>
 #include <atalk/compat.h>
 #include <atalk/util.h>
+#include <atalk/uam.h>
 
 static C_Block                 seskey;
 static Key_schedule            seskeysched;
@@ -36,7 +63,7 @@ static int            validseskey = 0;
 static int             logged = 0;
 static char            *tktfile;
 static char            instance[ INST_SZ ], name[ ANAME_SZ ];
-#endif /*UAM_AFSKRB*/
+#endif /* UAM_AFSKRB */
 
 #ifdef AFS
 #include <afs/stds.h>
@@ -54,12 +81,12 @@ struct ClearToken {
     int32_t BeginTimestamp;
     int32_t EndTimestamp;
 };
-#endif /*AFS*/
+#endif /* AFS */
 
 
 #ifdef KRB
 
-static __inline__ void lcase( p )
+static void lcase( p )
     char       *p;
 {
     for (; *p; p++ ) {
@@ -70,7 +97,7 @@ static __inline__ void lcase( p )
     return;
 }
 
-static __inline__ void ucase( p )
+static void ucase( p )
     char       *p;
 {
     for (; *p; p++ ) {
@@ -89,37 +116,125 @@ static __inline__ void ucase( p )
 #define KRB4WRT_TOKEN  6
 #define KRB4WRT_SKIP   7
 #define KRB4RPL_DONEMUT        8
-
+#define KRB4CMD_SESS   9
+#define KRB4CMD_TOKEN  10
+#define KRB4CMD_SKIP   11
 
 static int krb4_login(void *obj, struct passwd **uam_pwd,
-                     char *ibuf, int ibuflen,
-                     char *rbuf, int *rbuflen )
+                     char *ibuf, size_t ibuflen,
+                     char *rbuf, size_t *rbuflen )
 {
     char               *p;
-    int                        len;
+    char               *username;
+    struct passwd      *pwd;
+    u_int16_t          len;
+    KTEXT_ST           tkt;
+    static AUTH_DAT    ad;
+    int                        rc, proto;
+    size_t             ulen;
+    char               inst[ 40 ], princ[ 40 ];
 
-    *rbuflen = 0;
-    if ( *ibuf != KRB4CMD_HELO ) {
-       syslog( LOG_INFO, "krb4_login: bad command %d", *ibuf );
-       return( AFPERR_NOTAUTH );
-    }
+    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username, &ulen) < 0)
+      return AFPERR_MISC;
 
-    p = rbuf;
-    if ( krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
-       syslog( LOG_ERR, "krb4_login: can't get local realm!" );
-       return( AFPERR_NOTAUTH );
-    }
+    if (uam_afpserver_option(obj, UAM_OPTION_PROTOCOL, &proto, NULL) < 0)
+      return AFPERR_MISC;
 
-    *p++ = KRB4RPL_REALM;
-    *p++ = 1;
-    len = strlen( realm );
-    *p++ = len;
-    strcpy( p, realm );
-    p += len + 1;
+    switch( *ibuf ) {
+       case KRB4CMD_SESS:
+           LOG(log_info, logtype_default, "krb4_login: KRB4CMD_SESS" );
+           ++ibuf;
+           p = ibuf;
+           memcpy( &len, p, sizeof( u_int16_t ));
+           tkt.length = ntohs( len );
+           p += sizeof( u_int16_t );
+
+           if ( tkt.length <= 0 || tkt.length > MAX_KTXT_LEN ) {
+               *rbuflen = 0;
+               LOG(log_info, logtype_default, "krb4_login: tkt.length = %d", tkt.length );
+               return( AFPERR_BADUAM );
+           }
+
+           memcpy( tkt.dat, p, tkt.length );
+           p += tkt.length;
+
+           strcpy( inst, "*" );
+
+           switch( proto ) {
+               case AFPPROTO_ASP:
+                   strcpy( princ, "afpserver" );
+                   break;
+               case AFPPROTO_DSI:
+                   strcpy( princ, "rcmd" );
+                   break;
+           }
+
+           if( (rc = krb_rd_req( &tkt, princ, inst, 0, &ad, "" )) 
+               != RD_AP_OK ) {
+               LOG(log_error, logtype_default, 
+                       "krb4_login: krb_rd_req(): %s", krb_err_txt[ rc ] );
+               *rbuflen = 0;
+               return( AFPERR_BADUAM );
+           }
+
+           LOG(log_info, logtype_default, "krb4_login: %s.%s@%s", ad.pname, ad.pinst, 
+               ad.prealm );
+           strcpy( realm, ad.prealm );
+           memcpy( seskey, ad.session, sizeof( C_Block ) );
+           key_sched( (C_Block *)seskey, seskeysched );
+
+           strncpy( username, ad.pname, ulen );
+
+           p = rbuf;
+
+#ifdef AFS
+           *p = KRB4RPL_DONE;  /* XXX */
+           *rbuflen = 1;
+
+           if (( pwd = uam_getname( obj, ad.pname, strlen(ad.pname) )) == NULL ) {
+               return AFPERR_PARAM;
+           }
+/*
+           if (uam_checkuser( pwd ) < 0) {
+               return AFPERR_NOTAUTH;
+           }
+*/
+           *uam_pwd = pwd;
+           return( AFP_OK ); /* Should this be AFPERR_AUTHCONT? */
+#else /* AFS */
+           /* get principals */
+           *p++ = KRB4RPL_PRINC;
+           len = strlen( realm );
+           *p++ = len + 1;
+           *p++ = '@';
+           strcpy( p, realm );
+           p += len + 1;
+           break;
+#endif /* AFS */
+       case KRB4CMD_HELO:
+           p = rbuf;
+           if (krb_get_lrealm( realm, 1 ) != KSUCCESS ) {
+               LOG(log_error, logtype_default, "krb4_login: can't get local realm!" );
+               return( AFPERR_NOTAUTH );
+           }
+           *p++ = KRB4RPL_REALM;
+           *p++ = 1;
+           len = strlen( realm );
+           *p++ = len;
+           strcpy( p, realm );
+           p += len + 1;
+           break;
+
+       default:
+           *rbuflen = 0;
+           LOG(log_info, logtype_default, "krb4_login: bad command %d", *ibuf );
+           return( AFPERR_NOTAUTH );
+    }
 
 #ifdef AFS
     if ( setpag() < 0 ) {
-       syslog( LOG_ERR, "krb_login: setpag: %m" );
+       *rbuflen = 0;
+       LOG(log_error, logtype_default, "krb_login: setpag: %s", strerror(errno) );
        return( AFPERR_BADUAM );
     }
 #endif /*AFS*/
@@ -128,151 +243,237 @@ static int krb4_login(void *obj, struct passwd **uam_pwd,
     return( AFPERR_AUTHCONT );
 }
 
+static int krb4_action( void *v1, void *v2, const int i )
+{
+       return i;
+}
+
+/*
+   I have a hunch that problems might arise on platforms 
+   with non-16bit short's and non-32bit int's
+*/
 static int krb4_logincont(void *obj, struct passwd **uam_pwd,
-                         char *ibuf, int ibuflen,
-                         char *rbuf, int *rbuflen)
+                         char *ibuf, size_t ibuflen,
+                         char *rbuf, size_t *rbuflen)
 {
     static struct passwd       *pwd;
     KTEXT_ST           tkt;
     static AUTH_DAT    ad;
     int                        rc;
     u_int16_t          len;
-    char               *p, *username;
+    char               *p, *username, *servername;
     CREDENTIALS                cr;
 #ifdef AFS
     struct ViceIoctl   vi;
     struct ClearToken  ct;
-#endif /*AFS*/
+#endif /* AFS */
     char               buf[ 1024 ];
-    int                        aint, ulen;
+    int                        aint, ulen, snlen;
 
-    if (uam_afp_read(obj, rbuf, rbuflen) < 0) /* read in the rest. */
-      return AFPERR_PARAM;
-
-    *rbuflen = 0;
-    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username) < 0)
-      return AFPERR_MISC;
-    
-    if (uam_afpserver_option(obj, UAM_OPTION_USERNAMELEN, &ulen) < 0)
+    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username, &ulen) < 0)
       return AFPERR_MISC;
 
-    p = rbuf;
-
-    switch ( rc = *p++ ) {
-    case KRB4WRT_SESS :
-       memcpy( &len, p, sizeof( len ));
-       tkt.length = ntohs( len );
-       p += sizeof( short );
-
-       if ( tkt.length <= 0 || tkt.length > MAX_KTXT_LEN ) {
-           return( AFPERR_BADUAM );
-       }
-       memcpy( tkt.dat, p, tkt.length );
-       p += tkt.length;
-
-       if (( rc = krb_rd_req( &tkt, "afpserver", obj->Obj, 0, &ad, "" ))
-               != RD_AP_OK ) {
-           syslog( LOG_ERR, "krb4_logincont: krb_rd_req: %s",
-                   krb_err_txt[ rc ] );
-           return( AFPERR_BADUAM );
-       }
-
-       syslog( LOG_INFO, "krb4_login: %s.%s@%s", ad.pname, ad.pinst,
-               ad.prealm );
-       memcpy(realm, ad.prealm, sizeof(realm));
-       memcpy(seskey, ad.session, sizeof( C_Block ));
-       key_sched((C_Block *) seskey, seskeysched );
-
-       strncpy(username, ad.pname, ulen);
+    if (uam_afpserver_option(obj, UAM_OPTION_HOSTNAME, &servername, &snlen) < 0)
+      return AFPERR_MISC;
 
-       p = rbuf;
+    ibuf++;
+    switch ( rc = *ibuf++ ) {
+       case KRB4CMD_TOKEN :
+#ifdef AFS
+           p = buf;
+           memcpy( &len, ibuf, sizeof( u_int16_t ) );
+           ibuf += sizeof( len );
+           len = ntohs( len );
+           aint = len;
+           memcpy( p, &aint, sizeof( int ) );
+           p += sizeof( int );
+           memcpy( p, ibuf, len );
+           pcbc_encrypt( (C_Block *)p, (C_Block *)p, len, seskeysched,
+               seskey, DECRYPT );
+           p += len;
+           ibuf += len;
+
+           memcpy( &len, ibuf, sizeof( u_int16_t ) );
+           ibuf += sizeof( u_int16_t ) );
+           len = ntohs( len );
+
+           if ( len != sizeof( struct ClearToken ) ) {
+               LOG(log_error, logtype_default, "krb4_logincont: token too short" );
+               *rbuflen = 0;
+               return( AFPERR_BADUAM );
+           }
+           memcpy( &ct, ibuf, len );
+
+           pcbc_encrypt( (C_Block *)&ct, (C_Block *)&ct, len, 
+               seskeysched, seskey, DECRYPT );
+
+           aint = sizeof( struct ClearToken );
+           memcpy( p, &aint, sizeof( int ) );
+           p += sizeof( int );
+           memcpy( p, &ct, sizeof( struct ClearToken ) );
+           p += sizeof( struct ClearToken );
+
+           aint = 0;
+           memcpy( p, &aint, sizeof( int ) );
+           p += sizeof( int );
+
+           lcase( realm );
+           strcpy( p, realm );
+           p += strlen( realm ) + 1;
+
+           vi.in = buf;
+           vi.in_size = p - buf;
+           vi.out = buf;
+           vi.out_size = sizeof( buf );
+
+           if ( pioctl( 0, VIOCSETTOK, &vi, 0 ) < 0 ) {
+               LOG(log_error, logtype_default, "krb4_logincont: pioctl: %s", strerror(errno) );
+               *rbuflen = 0;
+               return( AFPERR_BADUAM );
+           }
+           /* FALL THROUGH */
+
+       case KRB4CMD_SKIP:
+           p = rbuf;
+           *p = KRB4RPL_DONE;  /* XXX */
+           *rbuflen = 1;
+
+           if (( pwd = uam_getname( obj, username, strlen(username) ) ) == NULL ) {
+               return( AFPERR_NOTAUTH );
+           }
+/*
+           if (uam_checkuser(pwd) < 0) {
+               return AFPERR_NOTAUTH;
+           }
+*/
+           *uam_pwd = pwd;
+           return( AFP_OK );
+#endif /* AFS */
+       default:
+           /* read in the rest */
+           if (uam_afp_read(obj, rbuf, rbuflen, krb4_action) < 0)
+               return AFPERR_PARAM;
+
+           p = rbuf;
+           switch ( rc = *p++ ) {
+               case KRB4WRT_SESS :
+                   memcpy( &len, p, sizeof( len ));
+                   tkt.length = ntohs( len );
+                   p += sizeof( short );
+
+                   if ( tkt.length <= 0 || tkt.length > MAX_KTXT_LEN ) {
+                       return( AFPERR_BADUAM );
+                   }
+                   memcpy( tkt.dat, p, tkt.length );
+                   p += tkt.length;
+
+                   if (( rc = krb_rd_req( &tkt, "afpserver", servername, 
+                       0, &ad, "" )) != RD_AP_OK ) {
+                       LOG(log_error, logtype_default, "krb4_logincont: krb_rd_req(): %s", krb_err_txt[ rc ] );
+                       return( AFPERR_BADUAM );
+                   }
+
+                   LOG(log_info, logtype_default, "krb4_login: %s.%s@%s", ad.pname, 
+                       ad.pinst, ad.prealm );
+                   memcpy(realm, ad.prealm, sizeof(realm));
+                   memcpy(seskey, ad.session, sizeof( C_Block ));
+                   key_sched((C_Block *) seskey, seskeysched );
+
+                   strncpy(username, ad.pname, ulen);
+
+                   p = rbuf;
 #ifndef AFS
-       *p = KRB4RPL_DONE;      /* XXX */
-       *rbuflen = 1;
-
-       if (( pwd = uam_getname( ad.pname, strlen(ad.pname) )) == NULL ) {
-           return( AFPERR_PARAM );
-       }
-       *uam_pwd = pwd;
-       return AFP_OK;
-#else AFS
-       /* get principals */
-       *p++ = KRB4RPL_PRINC;
-       len = strlen( realm );
-       *p++ = len + 1;
-       *p++ = '@';
-       strcpy( p, realm );
-       p += len + 1;
-       *rbuflen = p - rbuf;
-       return( AFPERR_AUTHCONT );
-
-    case KRB4WRT_TOKEN :
-       memcpy( &len, p, sizeof( len ));
-       len = ntohs( len );
-       p += sizeof( len );
-       memcpy( &cr, p, len );
-
-       pcbc_encrypt((C_Block *)&cr, (C_Block *)&cr, len, seskeysched,
-               seskey, DES_DECRYPT );
-
-       p = buf;
-       cr.ticket_st.length = ntohl( cr.ticket_st.length );
-       memcpy( p, &cr.ticket_st.length, sizeof( int ));
-       p += sizeof( int );
-       memcpy( p, cr.ticket_st.dat, cr.ticket_st.length );
-       p += cr.ticket_st.length;
-
-       ct.AuthHandle = ntohl( cr.kvno );
-       memcpy( ct.HandShakeKey, cr.session, sizeof( cr.session ));
-       ct.ViceId = 0;
-       ct.BeginTimestamp = ntohl( cr.issue_date );
-       ct.EndTimestamp = krb_life_to_time( ntohl( cr.issue_date ),
-               ntohl( cr.lifetime ));
-
-       aint = sizeof( struct ClearToken );
-       memcpy( p, &aint, sizeof( int ));
-       p += sizeof( int );
-       memcpy( p, &ct, sizeof( struct ClearToken ));
-       p += sizeof( struct ClearToken );
-
-       aint = 0;
-       memcpy( p, &aint, sizeof( int ));
-       p += sizeof( int );
-
-       lcase( realm );
-       strcpy( p, realm );
-       p += strlen( realm ) + 1;
-
-       vi.in = buf;
-       vi.in_size = p - buf;
-       vi.out = buf;
-       vi.out_size = sizeof( buf );
-       if ( pioctl( 0, VIOCSETTOK, &vi, 0 ) < 0 ) {
-           syslog( LOG_ERR, "krb4_logincont: pioctl: %m" );
-           return( AFPERR_BADUAM );
-       }
-       /* FALL THROUGH */
-
-    case KRB4WRT_SKIP :
-       p = rbuf;
-       *p = KRB4RPL_DONE;      /* XXX */
-       *rbuflen = 1;
-
-       if (( pwd = uam_getname( ad.pname, strlen(ad.pname) )) == NULL ) {
-           return( AFPERR_PARAM );
-       }
-       *uam_pwd = pwd;
-       return AFP_OK;
+                   *p = KRB4RPL_DONE;  /* XXX */
+                   *rbuflen = 1;
+
+                   if (( pwd = uam_getname( obj, ad.pname, strlen(ad.pname) )) 
+                       == NULL ) {
+                       return( AFPERR_PARAM );
+                   }
+                   *uam_pwd = pwd;
+                   return AFP_OK;
+#else /* ! AFS */
+                   /* get principals */
+                   *p++ = KRB4RPL_PRINC;
+                   len = strlen( realm );
+                   *p++ = len + 1;
+                   *p++ = '@';
+                   strcpy( p, realm );
+                   p += len + 1;
+                   *rbuflen = p - rbuf;
+                   return( AFPERR_AUTHCONT );
+
+               case KRB4WRT_TOKEN :
+                   memcpy( &len, p, sizeof( len ));
+                   len = ntohs( len );
+                   p += sizeof( len );
+                   memcpy( &cr, p, len );
+
+                   pcbc_encrypt((C_Block *)&cr, (C_Block *)&cr, len, 
+                       seskeysched, seskey, DES_DECRYPT );
+
+                   p = buf;
+                   cr.ticket_st.length = ntohl( cr.ticket_st.length );
+                   memcpy( p, &cr.ticket_st.length, sizeof( int ));
+                   p += sizeof( int );
+                   memcpy( p, cr.ticket_st.dat, cr.ticket_st.length );
+                   p += cr.ticket_st.length;
+
+                   ct.AuthHandle = ntohl( cr.kvno );
+                   memcpy( ct.HandShakeKey, cr.session, sizeof( cr.session ));
+                   ct.ViceId = 0;
+                   ct.BeginTimestamp = ntohl( cr.issue_date );
+                   ct.EndTimestamp = krb_life_to_time( ntohl( cr.issue_date ),
+                   ntohl( cr.lifetime ));
+
+                   aint = sizeof( struct ClearToken );
+                   memcpy( p, &aint, sizeof( int ));
+                   p += sizeof( int );
+                   memcpy( p, &ct, sizeof( struct ClearToken ));
+                   p += sizeof( struct ClearToken );
+
+                   aint = 0;
+                   memcpy( p, &aint, sizeof( int ));
+                   p += sizeof( int );
+
+                   lcase( realm );
+                   strcpy( p, realm );
+                   p += strlen( realm ) + 1;
+
+                   vi.in = buf;
+                   vi.in_size = p - buf;
+                   vi.out = buf;
+                   vi.out_size = sizeof( buf );
+                   if ( pioctl( 0, VIOCSETTOK, &vi, 0 ) < 0 ) {
+                       LOG(log_error, logtype_default, "krb4_logincont: pioctl: %s", strerror(errno) );
+                       return( AFPERR_BADUAM );
+                   }
+                   /* FALL THROUGH */
+
+               case KRB4WRT_SKIP :
+                   p = rbuf;
+                   *p = KRB4RPL_DONE;  /* XXX */
+                   *rbuflen = 1;
+
+                   if (( pwd = uam_getname( obj, ad.pname, strlen(ad.pname) )) 
+                       == NULL ) {
+                       return( AFPERR_PARAM );
+                   }
+                   *uam_pwd = pwd;
+                   return AFP_OK;
 #endif /*AFS*/
 
-    default :
-       syslog( LOG_INFO, "krb4_logincont: bad command %d", rc );
-       return( AFPERR_NOTAUTH );
-       break;
+               default:
+                   LOG(log_info, logtype_default, "krb4_logincont: bad command %d", rc );
+                   *rbuflen = 0;
+                   return( AFPERR_NOTAUTH );
+                   break;
+           }
+           break;
     }
 }
 
-#endif /*KRB*/
+#endif /* KRB */
 
 
 #ifdef AFS
@@ -363,26 +564,26 @@ static void authenticate(cells,name,passwd)
                    passwd,/*setpag*/0,&errorstring);
        }
 }
-#endif /*AFS*/
+#endif /* AFS */
 
 #if defined( UAM_AFSKRB ) && defined( AFS )
 static int afskrb_login(void *obj, struct passwd *uam_pwd,
-                       char *ibuf, int ibuflen, 
-                       char *rbuf, int *rbuflen )
+                       char *ibuf, size_t ibuflen, 
+                       char *rbuf, size_t *rbuflen )
 {
     KTEXT_ST   authent, rpkt;
     CREDENTIALS        cr;
-    char       *p, *q, *username;
-    int                len, rc, whoserealm, ulen;
+    char       *p, *q, *username, servername;
+    int                len, rc, whoserealm, ulen, snlen;
     short      slen;
 
     *rbuflen = 0;
-    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username) < 0)
-      return AFPERR_MISC;
-    
-    if (uam_afpserver_option(obj, UAM_OPTION_USERNAMELEN, &ulen) < 0)
+    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username, &ulen) < 0)
       return AFPERR_MISC;
 
+    if (uam_afpserver_option(obj, UAM_OPTION_HOSTNAME, &servername, &snlen ) < 0)
+      return AFPERR_MISC;
+    
     len = (unsigned char) *ibuf++;
     ibuf[ len ] = '\0';
     if (( p = strchr( ibuf, '@' )) != NULL ) {
@@ -409,13 +610,13 @@ static int afskrb_login(void *obj, struct passwd *uam_pwd,
     p = rbuf;
     if ( validseskey == 0 ) {
        if ( setpag() < 0 ) {
-           syslog( LOG_ERR, "krb_login: setpag: %m" );
+           LOG(log_error, logtype_default, "krb_login: setpag: %s", strerror(errno) );
            return AFPERR_BADUAM;
        }
        krb_set_tkt_string(( tktfile = mktemp( _PATH_AFPTKT )));
-       if (( rc =  krb_get_svc_in_tkt( "afpserver", Obj, realm,
+       if (( rc =  krb_get_svc_in_tkt( "afpserver", servername, realm,
                TICKET_GRANTING_TICKET, realm, 255, KEYFILE )) != INTK_OK ) {
-           syslog( LOG_ERR, "krb_login: can't get ticket-granting-ticket" );
+           LOG(log_error, logtype_default, "krb_login: can't get ticket-granting-ticket" );
            return (( whoserealm ) ? AFPERR_BADUAM : AFPERR_PARAM );
        }
        if ( krb_mk_req( &authent, name, instance, realm, 0 ) != KSUCCESS ) {
@@ -426,7 +627,7 @@ static int afskrb_login(void *obj, struct passwd *uam_pwd,
        }
 
        if ( unlink( tktfile ) < 0 ) {
-           syslog( LOG_ERR, "krb_login: unlink %s: %m", tktfile );
+           LOG(log_error, logtype_default, "krb_login: unlink %s: %s", tktfile, strerror(errno) );
            return ( AFPERR_BADUAM );
        }
 
@@ -471,8 +672,8 @@ static int afskrb_login(void *obj, struct passwd *uam_pwd,
 }
 
 static int afskrb_logincont(void *obj, struct passwd *uam_pwd,
-                           char *ibuf, int ibuflen, 
-                           char *rbuf, int *rbuflen )
+                           char *ibuf, size_t ibuflen, 
+                           char *rbuf, size_t *rbuflen )
 {
     CREDENTIALS                cr;
     struct ViceIoctl   vi;
@@ -483,7 +684,7 @@ static int afskrb_logincont(void *obj, struct passwd *uam_pwd,
     short              clen;
 
     *rbuflen = 0;
-    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username) < 0)
+    if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, &username, NULL) < 0)
       return AFPERR_MISC;
     
     ibuf += 2;
@@ -537,45 +738,46 @@ static int afskrb_logincont(void *obj, struct passwd *uam_pwd,
     vi.out = buf;
     vi.out_size = sizeof( buf );
     if ( pioctl( 0, VIOCSETTOK, &vi, 0 ) < 0 ) {
-       syslog( LOG_ERR, "krb_logincont: pioctl: %m" );
+       LOG(log_error, logtype_default, "krb_logincont: pioctl: %s", strerror(errno) );
        return ( AFPERR_BADUAM );
     }
 
     if ( unlink( tktfile ) < 0 ) {
-       syslog( LOG_ERR, "krb_logincont: %s: %m", tktfile );
+       LOG(log_error, logtype_default, "krb_logincont: %s: %s", tktfile, strerror(errno) );
        return ( AFPERR_BADUAM );
     }
 
-    if (( pwd = uam_getname( username )) == NULL ) {
+    if (( pwd = uam_getname( obj, username, strlen(username) )) == NULL ) {
        return ( AFPERR_PARAM );
     }
 
     if ( logged == 0 ) {
        logged = 1;
-       syslog( LOG_INFO, "authenticated %s.%s@%s", name, instance, realm );
+       LOG(log_info, logtype_default, "authenticated %s.%s@%s", name, instance, realm );
        *uam_pwd = pwd;
        return AFP_OK;
     }
-    syslog( LOG_INFO, "re-authenticated %s.%s@%s", name, instance, realm );
+    LOG(log_info, logtype_default, "re-authenticated %s.%s@%s", name, instance, realm );
     return( AFP_OK );
 }
 #endif /* UAM_AFSKRB AFS */
 
-int uam_setup()
+static int uam_setup(const char *path)
 {
 #ifdef KRB
-   uam_register(UAM_SERVER_LOGIN, "Kerberos IV", krb4_login, 
+   uam_register(UAM_SERVER_LOGIN, path, "Kerberos IV", krb4_login, 
                krb4_logincont, NULL);
    /* uam_afpserver_action(); */
-#endif
+#endif /* KRB */
 #ifdef UAM_AFSKRB
-   uam_register(UAM_SERVER_LOGIN, "AFS Kerberos", afskrb_login, 
+   uam_register(UAM_SERVER_LOGIN, path, "AFS Kerberos", afskrb_login, 
                afskrb_logincont, NULL);
    /* uam_afpserver_action(); */
-#endif
+#endif /* UAM_AFSKRB */
+   return 0;
 }
 
-int uam_cleanup()
+static void uam_cleanup(void)
 {
 #ifdef KRB
    /* uam_afpserver_action(); */
@@ -587,4 +789,11 @@ int uam_cleanup()
 #endif
 }
 
+UAM_MODULE_EXPORT struct uam_export uams_krb4 = {
+  UAM_MODULE_SERVER,
+  UAM_MODULE_VERSION,
+  uam_setup, uam_cleanup
+};
+
 #endif /* KRB or UAM_AFSKRB */
+