diff --git a/auth-bsdauth.c b/auth-bsdauth.c
index 3732477..b70d48f 100644
--- a/auth-bsdauth.c
+++ b/auth-bsdauth.c
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include "includes.h"
-RCSID("$OpenBSD: auth-bsdauth.c,v 1.1 2001/05/18 14:13:28 markus Exp $");
+RCSID("$OpenBSD: auth-bsdauth.c,v 1.2 2001/12/19 07:18:56 deraadt Exp $");
 
 #ifdef BSD_AUTH
 #include "xmalloc.h"
@@ -36,74 +36,74 @@
 }
 
 static int
-bsdauth_query(void *ctx, char **name, char **infotxt, 
+bsdauth_query(void *ctx, char **name, char **infotxt,
    u_int *numprompts, char ***prompts, u_int **echo_on)
 {
-        Authctxt *authctxt = ctx;
-        char *challenge = NULL;
+	Authctxt *authctxt = ctx;
+	char *challenge = NULL;
 
-        if (authctxt->as != NULL) {
-                debug2("bsdauth_query: try reuse session");
-                challenge = auth_getitem(authctxt->as, AUTHV_CHALLENGE);
-                if (challenge == NULL) {
-                        auth_close(authctxt->as);
-                        authctxt->as = NULL;
-                }
-        }
+	if (authctxt->as != NULL) {
+		debug2("bsdauth_query: try reuse session");
+		challenge = auth_getitem(authctxt->as, AUTHV_CHALLENGE);
+		if (challenge == NULL) {
+			auth_close(authctxt->as);
+			authctxt->as = NULL;
+		}
+	}
 
-        if (challenge == NULL) {
-                debug2("bsdauth_query: new bsd auth session");
-                debug3("bsdauth_query: style %s",
+	if (challenge == NULL) {
+		debug2("bsdauth_query: new bsd auth session");
+		debug3("bsdauth_query: style %s",
 		    authctxt->style ? authctxt->style : "<default>");
-                authctxt->as = auth_userchallenge(authctxt->user,
+		authctxt->as = auth_userchallenge(authctxt->user,
 		     authctxt->style, "auth-ssh", &challenge);
-                if (authctxt->as == NULL)
-                        challenge = NULL;
-                debug2("bsdauth_query: <%s>", challenge ? challenge : "empty");
-        }
-        
-        if (challenge == NULL)
-                return -1;
+		if (authctxt->as == NULL)
+			challenge = NULL;
+		debug2("bsdauth_query: <%s>", challenge ? challenge : "empty");
+	}
 
-        *name       = xstrdup("");
-        *infotxt    = xstrdup("");
-        *numprompts = 1;
-        *prompts = xmalloc(*numprompts * sizeof(char*));
-        *echo_on = xmalloc(*numprompts * sizeof(u_int));
-        (*echo_on)[0] = 0;
-        (*prompts)[0] = xstrdup(challenge);
+	if (challenge == NULL)
+		return -1;
 
-        return 0;
+	*name       = xstrdup("");
+	*infotxt    = xstrdup("");
+	*numprompts = 1;
+	*prompts = xmalloc(*numprompts * sizeof(char*));
+	*echo_on = xmalloc(*numprompts * sizeof(u_int));
+	(*echo_on)[0] = 0;
+	(*prompts)[0] = xstrdup(challenge);
+
+	return 0;
 }
 
 static int
 bsdauth_respond(void *ctx, u_int numresponses, char **responses)
 {
-        Authctxt *authctxt = ctx;
-        int authok;
-        
-        if (authctxt->as == 0)
-                error("bsdauth_respond: no bsd auth session");
+	Authctxt *authctxt = ctx;
+	int authok;
 
-        if (numresponses != 1)
-                return -1;
+	if (authctxt->as == 0)
+		error("bsdauth_respond: no bsd auth session");
 
-        authok = auth_userresponse(authctxt->as, responses[0], 0);
-        authctxt->as = NULL;
-        debug3("bsdauth_respond: <%s> = <%d>", responses[0], authok);
+	if (numresponses != 1)
+		return -1;
 
-        return (authok == 0) ? -1 : 0;
+	authok = auth_userresponse(authctxt->as, responses[0], 0);
+	authctxt->as = NULL;
+	debug3("bsdauth_respond: <%s> = <%d>", responses[0], authok);
+
+	return (authok == 0) ? -1 : 0;
 }
 
 static void
 bsdauth_free_ctx(void *ctx)
 {
-        Authctxt *authctxt = ctx;
+	Authctxt *authctxt = ctx;
 
-        if (authctxt && authctxt->as) {
-                auth_close(authctxt->as);
-                authctxt->as = NULL;
-        }
+	if (authctxt && authctxt->as) {
+		auth_close(authctxt->as);
+		authctxt->as = NULL;
+	}
 }
 
 KbdintDevice bsdauth_device = {
