1bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2000 Andre Lucas.  All rights reserved.
3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Redistribution and use in source and binary forms, with or without
5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * modification, are permitted provided that the following conditions
6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * are met:
7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 1. Redistributions of source code must retain the above copyright
8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *    notice, this list of conditions and the following disclaimer.
9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 2. Redistributions in binary form must reproduce the above copyright
10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *    notice, this list of conditions and the following disclaimer in the
11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *    documentation and/or other materials provided with the distribution.
12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/**
26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ** logintest.c:  simple test driver for platform-independent login recording
27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman **               and lastlog retrieval
28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman **/
29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h"
31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/types.h>
33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/wait.h>
34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/socket.h>
35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <netinet/in.h>
37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <unistd.h>
39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdlib.h>
40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdio.h>
41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <string.h>
42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <pwd.h>
43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <netdb.h>
44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef HAVE_TIME_H
45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <time.h>
46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "loginrec.h"
49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanextern char *__progname;
51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define PAUSE_BEFORE_LOGOUT 3
53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint nologtest = 0;
55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint compile_opts_only = 0;
56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint be_verbose = 0;
57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Dump a logininfo to stdout. Assumes a tab size of 8 chars. */
60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid
61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmandump_logininfo(struct logininfo *li, char *descname)
62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* yes I know how nasty this is */
64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("struct logininfo %s = {\n\t"
65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "progname\t'%s'\n\ttype\t\t%d\n\t"
66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "pid\t\t%d\n\tuid\t\t%d\n\t"
67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "line\t\t'%s'\n\tusername\t'%s'\n\t"
68bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "hostname\t'%s'\n\texit\t\t%d\n\ttermination\t%d\n\t"
69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "tv_sec\t%d\n\ttv_usec\t%d\n\t"
70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "struct login_netinfo hostaddr {\n\t\t"
71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "struct sockaddr sa {\n"
72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "\t\t\tfamily\t%d\n\t\t}\n"
73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "\t}\n"
74bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "}\n",
75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       descname, li->progname, li->type,
76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       li->pid, li->uid, li->line,
77bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       li->username, li->hostname, li->exit,
78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       li->termination, li->tv_sec, li->tv_usec,
79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       li->hostaddr.sa.sa_family);
80bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman}
81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
83bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg HartmantestAPI()
85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
86bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	struct logininfo *li1;
87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	struct passwd *pw;
88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	struct hostent *he;
89bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	struct sockaddr_in sa_in4;
90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char cmdstring[256], stripline[8];
91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char username[32];
92bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef HAVE_TIME_H
93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	time_t t0, t1, t2, logintime, logouttime;
94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char s_t0[64],s_t1[64],s_t2[64];
95bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char s_logintime[64], s_logouttime[64]; /* ctime() strings */
96bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
97bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
98bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("**\n** Testing the API...\n**\n");
99bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
100bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	pw = getpwuid(getuid());
101bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(username, pw->pw_name, sizeof(username));
102bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
103bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* gethostname(hostname, sizeof(hostname)); */
104bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
105bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("login_alloc_entry test (no host info):\n");
106bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
107bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* FIXME fake tty more effectively - this could upset some platforms */
108bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	li1 = login_alloc_entry((int)getpid(), username, NULL, ttyname(0));
109bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(li1->progname, "OpenSSH-logintest", sizeof(li1->progname));
110bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
111bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (be_verbose)
112bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		dump_logininfo(li1, "li1");
113bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
114bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("Setting host address info for 'localhost' (may call out):\n");
115bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (! (he = gethostbyname("localhost"))) {
116bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		printf("Couldn't set hostname(lookup failed)\n");
117bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	} else {
118bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		/* NOTE: this is messy, but typically a program wouldn't have to set
119bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		 *  any of this, a sockaddr_in* would be already prepared */
120bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		memcpy((void *)&(sa_in4.sin_addr), (void *)&(he->h_addr_list[0][0]),
121bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       sizeof(struct in_addr));
122bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		login_set_addr(li1, (struct sockaddr *) &sa_in4, sizeof(sa_in4));
123bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		strlcpy(li1->hostname, "localhost", sizeof(li1->hostname));
124bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
125bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (be_verbose)
126bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		dump_logininfo(li1, "li1");
127bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
128bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if ((int)geteuid() != 0) {
129bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		printf("NOT RUNNING LOGIN TESTS - you are not root!\n");
130bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 1;
131bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
132bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
133bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (nologtest)
134bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		return 1;
135bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
136bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	line_stripname(stripline, li1->line, sizeof(stripline));
137bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
138bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("Performing an invalid login attempt (no type field)\n--\n");
139bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	login_write(li1);
140bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("--\n(Should have written errors to stderr)\n");
141bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
142bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef HAVE_TIME_H
143bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	(void)time(&t0);
144bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(s_t0, ctime(&t0), sizeof(s_t0));
145bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	t1 = login_get_lastlog_time(getuid());
146bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(s_t1, ctime(&t1), sizeof(s_t1));
147bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("Before logging in:\n\tcurrent time is %d - %s\t"
148bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "lastlog time is %d - %s\n",
149bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       (int)t0, s_t0, (int)t1, s_t1);
150bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
151bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
152bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("Performing a login on line %s ", stripline);
153bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef HAVE_TIME_H
154bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	(void)time(&logintime);
155bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(s_logintime, ctime(&logintime), sizeof(s_logintime));
156bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("at %d - %s", (int)logintime, s_logintime);
157bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
158bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("--\n");
159bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	login_login(li1);
160bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
161bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	snprintf(cmdstring, sizeof(cmdstring), "who | grep '%s '",
162bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		 stripline);
163bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	system(cmdstring);
164bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
165bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("--\nPausing for %d second(s)...\n", PAUSE_BEFORE_LOGOUT);
166bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	sleep(PAUSE_BEFORE_LOGOUT);
167bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
168bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("Performing a logout ");
169bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef HAVE_TIME_H
170bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	(void)time(&logouttime);
171bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(s_logouttime, ctime(&logouttime), sizeof(s_logouttime));
172bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("at %d - %s", (int)logouttime, s_logouttime);
173bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
174bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\nThe root login shown above should be gone.\n"
175bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "If the root login hasn't gone, but another user on the same\n"
176bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "pty has, this is OK - we're hacking it here, and there\n"
177bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "shouldn't be two users on one pty in reality...\n"
178bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "-- ('who' output follows)\n");
179bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	login_logout(li1);
180bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
181bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	system(cmdstring);
182bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("-- ('who' output ends)\n");
183bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
184bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef HAVE_TIME_H
185bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	t2 = login_get_lastlog_time(getuid());
186bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	strlcpy(s_t2, ctime(&t2), sizeof(s_t2));
187bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("After logging in, lastlog time is %d - %s\n", (int)t2, s_t2);
188bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (t1 == t2)
189bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		printf("The lastlog times before and after logging in are the "
190bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       "same.\nThis indicates that lastlog is ** NOT WORKING "
191bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       "CORRECTLY **\n");
192bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	else if (t0 != t2)
193bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		/* We can be off by a second or so, even when recording works fine.
194bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		 * I'm not 100% sure why, but it's true. */
195bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		printf("** The login time and the lastlog time differ.\n"
196bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       "** This indicates that lastlog is either recording the "
197bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       "wrong time,\n** or retrieving the wrong entry.\n"
198bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       "If it's off by less than %d second(s) "
199bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		       "run the test again.\n", PAUSE_BEFORE_LOGOUT);
200bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	else
201bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		printf("lastlog agrees with the login time. This is a good thing.\n");
202bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
203bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
204bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
205bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("--\nThe output of 'last' shown next should have "
206bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       "an entry for root \n  on %s for the time shown above:\n--\n",
207bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	       stripline);
208bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	snprintf(cmdstring, sizeof(cmdstring), "last | grep '%s ' | head -3",
209bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		 stripline);
210bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	system(cmdstring);
211bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
212bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("--\nEnd of login test.\n");
213bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
214bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	login_free_entry(li1);
215bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
216bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 1;
217bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} /* testAPI() */
218bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
219bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
220bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid
221bd77cf78387b72b7b3ea870459077672bf75c3b5Greg HartmantestLineName(char *line)
222bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
223bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	/* have to null-terminate - these functions are designed for
224bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	 * structures with fixed-length char arrays, and don't null-term.*/
225bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char full[17], strip[9], abbrev[5];
226bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
227bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	memset(full, '\0', sizeof(full));
228bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	memset(strip, '\0', sizeof(strip));
229bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	memset(abbrev, '\0', sizeof(abbrev));
230bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
231bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	line_fullname(full, line, sizeof(full)-1);
232bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	line_stripname(strip, full, sizeof(strip)-1);
233bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	line_abbrevname(abbrev, full, sizeof(abbrev)-1);
234bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("%s: %s, %s, %s\n", line, full, strip, abbrev);
235bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
236bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} /* testLineName() */
237bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
238bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
239bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
240bd77cf78387b72b7b3ea870459077672bf75c3b5Greg HartmantestOutput()
241bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
242bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("**\n** Testing linename functions\n**\n");
243bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	testLineName("/dev/pts/1");
244bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	testLineName("pts/1");
245bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	testLineName("pts/999");
246bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	testLineName("/dev/ttyp00");
247bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	testLineName("ttyp00");
248bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
249bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 1;
250bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} /* testOutput() */
251bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
252bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
253bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* show which options got compiled in */
254bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid
255bd77cf78387b72b7b3ea870459077672bf75c3b5Greg HartmanshowOptions(void)
256bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
257bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("**\n** Compile-time options\n**\n");
258bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
259bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("login recording methods selected:\n");
260bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_LOGIN
261bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\tUSE_LOGIN\n");
262bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
263bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_UTMP
264bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\tUSE_UTMP (UTMP_FILE=%s)\n", UTMP_FILE);
265bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
266bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_UTMPX
267bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\tUSE_UTMPX\n");
268bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
269bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_WTMP
270bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\tUSE_WTMP (WTMP_FILE=%s)\n", WTMP_FILE);
271bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
272bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_WTMPX
273bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\tUSE_WTMPX (WTMPX_FILE=%s)\n", WTMPX_FILE);
274bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
275bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifdef USE_LASTLOG
276bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\tUSE_LASTLOG (LASTLOG_FILE=%s)\n", LASTLOG_FILE);
277bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
278bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("\n");
279bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
280bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} /* showOptions() */
281bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
282bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
283bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint
284bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanmain(int argc, char *argv[])
285bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{
286bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	printf("Platform-independent login recording test driver\n");
287bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
288bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	__progname = ssh_get_progname(argv[0]);
289bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (argc == 2) {
290bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		if (strncmp(argv[1], "-i", 3) == 0)
291bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman			compile_opts_only = 1;
292bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		else if (strncmp(argv[1], "-v", 3) == 0)
293bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman			be_verbose=1;
294bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
295bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
296bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	if (!compile_opts_only) {
297bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		if (be_verbose && !testOutput())
298bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman			return 1;
299bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
300bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman		if (!testAPI())
301bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman			return 1;
302bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	}
303bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
304bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	showOptions();
305bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
306bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	return 0;
307bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} /* main() */
308bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
309