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