xref: /freebsd/crypto/openssh/loginrec.h (revision 761efaa7)
183d2307dSDag-Erling Smørgrav #ifndef _HAVE_LOGINREC_H_
283d2307dSDag-Erling Smørgrav #define _HAVE_LOGINREC_H_
383d2307dSDag-Erling Smørgrav 
483d2307dSDag-Erling Smørgrav /*
583d2307dSDag-Erling Smørgrav  * Copyright (c) 2000 Andre Lucas.  All rights reserved.
683d2307dSDag-Erling Smørgrav  *
783d2307dSDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
883d2307dSDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
983d2307dSDag-Erling Smørgrav  * are met:
1083d2307dSDag-Erling Smørgrav  * 1. Redistributions of source code must retain the above copyright
1183d2307dSDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer.
1283d2307dSDag-Erling Smørgrav  * 2. Redistributions in binary form must reproduce the above copyright
1383d2307dSDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer in the
1483d2307dSDag-Erling Smørgrav  *    documentation and/or other materials provided with the distribution.
1583d2307dSDag-Erling Smørgrav  *
1683d2307dSDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1783d2307dSDag-Erling Smørgrav  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1883d2307dSDag-Erling Smørgrav  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1983d2307dSDag-Erling Smørgrav  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2083d2307dSDag-Erling Smørgrav  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2183d2307dSDag-Erling Smørgrav  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2283d2307dSDag-Erling Smørgrav  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2383d2307dSDag-Erling Smørgrav  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2483d2307dSDag-Erling Smørgrav  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2583d2307dSDag-Erling Smørgrav  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2683d2307dSDag-Erling Smørgrav  */
2783d2307dSDag-Erling Smørgrav 
2883d2307dSDag-Erling Smørgrav /**
2983d2307dSDag-Erling Smørgrav  ** loginrec.h:  platform-independent login recording and lastlog retrieval
3083d2307dSDag-Erling Smørgrav  **/
3183d2307dSDag-Erling Smørgrav 
3283d2307dSDag-Erling Smørgrav #include "includes.h"
3383d2307dSDag-Erling Smørgrav 
3483d2307dSDag-Erling Smørgrav struct ssh;
3583d2307dSDag-Erling Smørgrav 
3683d2307dSDag-Erling Smørgrav /**
3783d2307dSDag-Erling Smørgrav  ** you should use the login_* calls to work around platform dependencies
3883d2307dSDag-Erling Smørgrav  **/
3983d2307dSDag-Erling Smørgrav 
4083d2307dSDag-Erling Smørgrav /*
4183d2307dSDag-Erling Smørgrav  * login_netinfo structure
4283d2307dSDag-Erling Smørgrav  */
4383d2307dSDag-Erling Smørgrav 
4483d2307dSDag-Erling Smørgrav union login_netinfo {
4583d2307dSDag-Erling Smørgrav 	struct sockaddr sa;
4683d2307dSDag-Erling Smørgrav 	struct sockaddr_in sa_in;
4783d2307dSDag-Erling Smørgrav 	struct sockaddr_storage sa_storage;
4883d2307dSDag-Erling Smørgrav };
4983d2307dSDag-Erling Smørgrav 
5083d2307dSDag-Erling Smørgrav /*
5183d2307dSDag-Erling Smørgrav  *   * logininfo structure  *
5283d2307dSDag-Erling Smørgrav  */
5383d2307dSDag-Erling Smørgrav /* types - different to utmp.h 'type' macros */
5483d2307dSDag-Erling Smørgrav /* (though set to the same value as linux, openbsd and others...) */
5583d2307dSDag-Erling Smørgrav #define LTYPE_LOGIN    7
5683d2307dSDag-Erling Smørgrav #define LTYPE_LOGOUT   8
5783d2307dSDag-Erling Smørgrav 
5883d2307dSDag-Erling Smørgrav /* string lengths - set very long */
595e8dbd04SDag-Erling Smørgrav #define LINFO_PROGSIZE 64
6083d2307dSDag-Erling Smørgrav #define LINFO_LINESIZE 64
6183d2307dSDag-Erling Smørgrav #define LINFO_NAMESIZE 512
6283d2307dSDag-Erling Smørgrav #define LINFO_HOSTSIZE 256
6383d2307dSDag-Erling Smørgrav 
6483d2307dSDag-Erling Smørgrav struct logininfo {
6583d2307dSDag-Erling Smørgrav 	char       progname[LINFO_PROGSIZE];     /* name of program (for PAM) */
6683d2307dSDag-Erling Smørgrav 	int        progname_null;
6783d2307dSDag-Erling Smørgrav 	short int  type;                         /* type of login (LTYPE_*) */
6883d2307dSDag-Erling Smørgrav 	pid_t      pid;                          /* PID of login process */
6983d2307dSDag-Erling Smørgrav 	uid_t      uid;                          /* UID of this user */
7083d2307dSDag-Erling Smørgrav 	char       line[LINFO_LINESIZE];         /* tty/pty name */
7183d2307dSDag-Erling Smørgrav 	char       username[LINFO_NAMESIZE];     /* login username */
7283d2307dSDag-Erling Smørgrav 	char       hostname[LINFO_HOSTSIZE];     /* remote hostname */
7383d2307dSDag-Erling Smørgrav 	/* 'exit_status' structure components */
7483d2307dSDag-Erling Smørgrav 	int        exit;                        /* process exit status */
7583d2307dSDag-Erling Smørgrav 	int        termination;                 /* process termination status */
7683d2307dSDag-Erling Smørgrav 	/* struct timeval (sys/time.h) isn't always available, if it isn't we'll
7783d2307dSDag-Erling Smørgrav 	 * use time_t's value as tv_sec and set tv_usec to 0
7883d2307dSDag-Erling Smørgrav 	 */
7983d2307dSDag-Erling Smørgrav 	unsigned int tv_sec;
8083d2307dSDag-Erling Smørgrav 	unsigned int tv_usec;
8183d2307dSDag-Erling Smørgrav 	union login_netinfo hostaddr;       /* caller's host address(es) */
8283d2307dSDag-Erling Smørgrav }; /* struct logininfo */
8383d2307dSDag-Erling Smørgrav 
8483d2307dSDag-Erling Smørgrav /*
8583d2307dSDag-Erling Smørgrav  * login recording functions
8683d2307dSDag-Erling Smørgrav  */
8783d2307dSDag-Erling Smørgrav 
8883d2307dSDag-Erling Smørgrav /** 'public' functions */
8983d2307dSDag-Erling Smørgrav 
9083d2307dSDag-Erling Smørgrav /* construct a new login entry */
9183d2307dSDag-Erling Smørgrav struct logininfo *login_alloc_entry(pid_t pid, const char *username,
9283d2307dSDag-Erling Smørgrav 				    const char *hostname, const char *line);
9383d2307dSDag-Erling Smørgrav /* free a structure */
9483d2307dSDag-Erling Smørgrav void login_free_entry(struct logininfo *li);
9583d2307dSDag-Erling Smørgrav /* fill out a pre-allocated structure with useful information */
9683d2307dSDag-Erling Smørgrav int login_init_entry(struct logininfo *li, pid_t pid, const char *username,
9783d2307dSDag-Erling Smørgrav     const char *hostname, const char *line);
9883d2307dSDag-Erling Smørgrav /* place the current time in a logininfo struct */
9983d2307dSDag-Erling Smørgrav void login_set_current_time(struct logininfo *li);
10083d2307dSDag-Erling Smørgrav 
10183d2307dSDag-Erling Smørgrav /* record the entry */
10283d2307dSDag-Erling Smørgrav int login_login (struct logininfo *li);
10383d2307dSDag-Erling Smørgrav int login_logout(struct logininfo *li);
10483d2307dSDag-Erling Smørgrav #ifdef LOGIN_NEEDS_UTMPX
10583d2307dSDag-Erling Smørgrav int login_utmp_only(struct logininfo *li);
10683d2307dSDag-Erling Smørgrav #endif
10783d2307dSDag-Erling Smørgrav 
10883d2307dSDag-Erling Smørgrav /** End of public functions */
10983d2307dSDag-Erling Smørgrav 
11083d2307dSDag-Erling Smørgrav /* record the entry */
11183d2307dSDag-Erling Smørgrav int login_write (struct logininfo *li);
11283d2307dSDag-Erling Smørgrav int login_log_entry(struct logininfo *li);
11383d2307dSDag-Erling Smørgrav 
11483d2307dSDag-Erling Smørgrav /* set the network address based on network address type */
11583d2307dSDag-Erling Smørgrav void login_set_addr(struct logininfo *li, const struct sockaddr *sa,
11683d2307dSDag-Erling Smørgrav 		    const unsigned int sa_size);
11783d2307dSDag-Erling Smørgrav 
11883d2307dSDag-Erling Smørgrav /*
11983d2307dSDag-Erling Smørgrav  * lastlog retrieval functions
12083d2307dSDag-Erling Smørgrav  */
12183d2307dSDag-Erling Smørgrav /* lastlog *entry* functions fill out a logininfo */
12283d2307dSDag-Erling Smørgrav struct logininfo *login_get_lastlog(struct logininfo *li, const uid_t uid);
12383d2307dSDag-Erling Smørgrav /* lastlog *time* functions return time_t equivalent (uint) */
12483d2307dSDag-Erling Smørgrav unsigned int login_get_lastlog_time(const uid_t uid);
125043840dfSDag-Erling Smørgrav 
12683d2307dSDag-Erling Smørgrav /* produce various forms of the line filename */
12783d2307dSDag-Erling Smørgrav char *line_fullname(char *dst, const char *src, u_int dstsize);
12883d2307dSDag-Erling Smørgrav char *line_stripname(char *dst, const char *src, int dstsize);
1295e8dbd04SDag-Erling Smørgrav char *line_abbrevname(char *dst, const char *src, int dstsize);
1305e8dbd04SDag-Erling Smørgrav 
13183d2307dSDag-Erling Smørgrav void record_failed_login(struct ssh *, const char *, const char *,
132     const char *);
133 
134 #endif /* _HAVE_LOGINREC_H_ */
135