Deleted Added
full compact
sshlogin.c (92559) sshlogin.c (98941)
1/*
2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved
5 * This file performs some of the things login(1) normally does. We cannot
6 * easily use something like login -p -h host -f user, because there are
7 * several different logins around, and it is hard to determined what kind of
8 * login the current system has. Also, we want to be able to execute commands

--- 26 unchanged lines hidden (view full) ---

35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
38 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 */
40
41#include "includes.h"
42RCSID("$OpenBSD: sshlogin.c,v 1.3 2001/12/19 07:18:56 deraadt Exp $");
1/*
2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved
5 * This file performs some of the things login(1) normally does. We cannot
6 * easily use something like login -p -h host -f user, because there are
7 * several different logins around, and it is hard to determined what kind of
8 * login the current system has. Also, we want to be able to execute commands

--- 26 unchanged lines hidden (view full) ---

35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
38 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 */
40
41#include "includes.h"
42RCSID("$OpenBSD: sshlogin.c,v 1.3 2001/12/19 07:18:56 deraadt Exp $");
43RCSID("$FreeBSD: head/crypto/openssh/sshlogin.c 92559 2002-03-18 10:09:43Z des $");
44
43
45#include <libutil.h>
46#include <utmp.h>
47#include "sshlogin.h"
48#include "log.h"
44#include "loginrec.h"
49
50/*
51 * Returns the time when the user last logged in. Returns 0 if the
52 * information is not available. This must be called before record_login.
53 * The host the user logged in from will be returned in buf.
54 */
55
56u_long
57get_last_login_time(uid_t uid, const char *logname,
58 char *buf, u_int bufsize)
59{
45
46/*
47 * Returns the time when the user last logged in. Returns 0 if the
48 * information is not available. This must be called before record_login.
49 * The host the user logged in from will be returned in buf.
50 */
51
52u_long
53get_last_login_time(uid_t uid, const char *logname,
54 char *buf, u_int bufsize)
55{
60 struct lastlog ll;
61 char *lastlog;
62 int fd;
56 struct logininfo li;
63
57
64 lastlog = _PATH_LASTLOG;
65 buf[0] = '\0';
66
67 fd = open(lastlog, O_RDONLY);
68 if (fd < 0)
69 return 0;
70 lseek(fd, (off_t) ((long) uid * sizeof(ll)), SEEK_SET);
71 if (read(fd, &ll, sizeof(ll)) != sizeof(ll)) {
72 close(fd);
73 return 0;
74 }
75 close(fd);
76 if (bufsize > sizeof(ll.ll_host) + 1)
77 bufsize = sizeof(ll.ll_host) + 1;
78 strncpy(buf, ll.ll_host, bufsize - 1);
79 buf[bufsize - 1] = 0;
80 return ll.ll_time;
58 login_get_lastlog(&li, uid);
59 strlcpy(buf, li.hostname, bufsize);
60 return li.tv_sec;
81}
82
83/*
84 * Records that the user has logged in. I these parts of operating systems
85 * were more standardized.
86 */
87
88void
89record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
90 const char *host, struct sockaddr * addr)
91{
61}
62
63/*
64 * Records that the user has logged in. I these parts of operating systems
65 * were more standardized.
66 */
67
68void
69record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
70 const char *host, struct sockaddr * addr)
71{
92 int fd;
93 struct lastlog ll;
94 char *lastlog;
95 struct utmp u;
72 struct logininfo *li;
96
73
97 /* Construct an utmp/wtmp entry. */
98 memset(&u, 0, sizeof(u));
99 strncpy(u.ut_line, ttyname + 5, sizeof(u.ut_line));
100 u.ut_time = time(NULL);
101 strncpy(u.ut_name, user, sizeof(u.ut_name));
102 strncpy(u.ut_host, host, sizeof(u.ut_host));
74 li = login_alloc_entry(pid, user, host, ttyname);
75 login_set_addr(li, addr, sizeof(struct sockaddr));
76 login_login(li);
77 login_free_entry(li);
78}
103
79
104 login(&u);
105 lastlog = _PATH_LASTLOG;
80#ifdef LOGIN_NEEDS_UTMPX
81void
82record_utmp_only(pid_t pid, const char *ttyname, const char *user,
83 const char *host, struct sockaddr * addr)
84{
85 struct logininfo *li;
106
86
107 /* Update lastlog unless actually recording a logout. */
108 if (strcmp(user, "") != 0) {
109 /*
110 * It is safer to bzero the lastlog structure first because
111 * some systems might have some extra fields in it (e.g. SGI)
112 */
113 memset(&ll, 0, sizeof(ll));
114
115 /* Update lastlog. */
116 ll.ll_time = time(NULL);
117 strncpy(ll.ll_line, ttyname + 5, sizeof(ll.ll_line));
118 strncpy(ll.ll_host, host, sizeof(ll.ll_host));
119 fd = open(lastlog, O_RDWR);
120 if (fd >= 0) {
121 lseek(fd, (off_t) ((long) uid * sizeof(ll)), SEEK_SET);
122 if (write(fd, &ll, sizeof(ll)) != sizeof(ll))
123 log("Could not write %.100s: %.100s", lastlog, strerror(errno));
124 close(fd);
125 }
126 }
87 li = login_alloc_entry(pid, user, host, ttyname);
88 login_set_addr(li, addr, sizeof(struct sockaddr));
89 login_utmp_only(li);
90 login_free_entry(li);
127}
91}
92#endif
128
129/* Records that the user has logged out. */
130
131void
93
94/* Records that the user has logged out. */
95
96void
132record_logout(pid_t pid, const char *ttyname)
97record_logout(pid_t pid, const char *ttyname, const char *user)
133{
98{
134 const char *line = ttyname + 5; /* /dev/ttyq8 -> ttyq8 */
135 if (logout(line))
136 logwtmp(line, "", "");
99 struct logininfo *li;
100
101 li = login_alloc_entry(pid, user, NULL, ttyname);
102 login_logout(li);
103 login_free_entry(li);
137}
104}