functions : server_input_channel_req userauth_pubkey
Vikash Badal / PCS
VikashB at ComparexAfrica.co.za
Thu May 9 20:45:15 EST 2002
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Greetings,
I am not sure if this is the correct place to ask these question,
if I am at the wrong place please advise.
I am currently working on some modifications to openssh
which record the users rsa/dsa identity comment file to
a log file when the user logs in (password authentication
is disabled).
The ssh1 portion of the modification works perfectly
but the ssh2 portion has me completely lost.
in userauth_pubkey() [ in auth2.c ]
i defined a variable realname (char 40).
which gets set after user_key_allowed2 is processed.
i want to pass this variable to server_input_channel_req
but i can not find where these two functions are being called
from.
vix at osr5: openssh-3.1p1 > grep -l "userauth_pubkey" *.c
auth2.c
sshconnect2.c
vix at osr5: openssh-3.1p1 > grep -l server_input_channel_req *.c
serverloop.c
I can not determine where these two functions are called from.
please advise
the diffs are attached . I am not much of a programmer, I ported
these
mod from some-one elses mods (ssh1-1.2.17). there probabably are a
lot
of ugliness to them and if you could point out any idiotic things
that
i have done, i will greatly appreciate it.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~
diff -ru openssh-3.1p1/auth-rsa.c openssh-3.1p1-mods/auth-rsa.c
- --- openssh-3.1p1/auth-rsa.c Thu May 9 12:18:25 2002
+++ openssh-3.1p1-mods/auth-rsa.c Thu May 9 12:19:54 2002
@@ -123,8 +123,11 @@
* successful. This may exit if there is a serious protocol
violation.
*/
int
- -auth_rsa(struct passwd *pw, BIGNUM *client_n)
+auth_rsa(struct passwd *pw, BIGNUM *client_n, char *realname, int
realnamesize)
{
char line[8192], *file;
int authenticated;
@@ -134,6 +137,8 @@
struct stat st;
Key *key;
char *fp;
+ char *comment;
+ int commentlen;
/* no user given */
if (pw == NULL)
@@ -219,6 +224,11 @@
continue;
}
/* cp now points to the comment part. */
+ /* NaTIS */
+ comment = cp;
+ commentlen = strlen(comment);
+ if (commentlen > 0 && comment[commentlen -1] == '\n')
+ comment[commentlen - 1] = '\0';
/* Check if the we have found the desired key
(identified by its
modulus). */
if (BN_cmp(key->rsa->n, client_n) != 0)
@@ -231,6 +241,8 @@
file, linenum, BN_num_bits(key->rsa->n),
bits);
/* We have found the desired key. */
+ debug("Found desired key for %s", comment); /* NaTIS
*/
+
/*
* If our options do not allow this key to be used,
* do not send challenge.
@@ -241,7 +253,10 @@
/* Perform the challenge-response dialog for this
key. */
if (!auth_rsa_challenge_dialog(key->rsa)) {
/* Wrong response. */
- - verbose("Wrong response to RSA authentication
challenge.
");
+ /*
+ * added identity (comment)
+ */
+ verbose("Wrong response to RSA authentication
challenge
for %s.", comment);
packet_send_debug("Wrong response to RSA
authentication
challenge.");
/*
* Break out of the loop. Otherwise we might
send
@@ -264,6 +279,12 @@
key_type(key), fp);
xfree(fp);
+ strncpy(realname, comment, commentlen - 1);
break;
}
@@ -276,8 +297,14 @@
key_free(key);
- - if (authenticated)
- - packet_send_debug("RSA authentication accepted.");
+ if (authenticated) {
+ /*
+ * Assume that the comment field contains the real name of
the
+ * person who owns the key.
+ */
+ packet_send_debug("RSA authentication of %s as user %s
accepted.",
+ comment, pw->pw_name);
+ }
else
auth_clear_options();
diff -ru openssh-3.1p1/auth.h openssh-3.1p1-mods/auth.h
- --- openssh-3.1p1/auth.h Thu May 9 12:18:26 2002
+++ openssh-3.1p1-mods/auth.h Thu May 9 12:19:54 2002
@@ -94,7 +94,7 @@
int auth_rhosts_rsa(struct passwd *, const char *, Key *);
int auth_password(Authctxt *, const char *);
- -int auth_rsa(struct passwd *, BIGNUM *);
+int auth_rsa(struct passwd *, BIGNUM *, char *realname, int
realnamesize);
int auth_rsa_challenge_dialog(RSA *);
#ifdef KRB4
diff -ru openssh-3.1p1/auth1.c openssh-3.1p1-mods/auth1.c
- --- openssh-3.1p1/auth1.c Thu May 9 12:18:26 2002
+++ openssh-3.1p1-mods/auth1.c Thu May 9 12:19:54 2002
@@ -63,7 +63,7 @@
* return only if authentication is successful
*/
static void
- -do_authloop(Authctxt *authctxt)
+do_authloop(Authctxt *authctxt, const char *realname)
{
int authenticated = 0;
u_int bits;
@@ -229,7 +229,7 @@
fatal("do_authloop: BN_new failed");
packet_get_bignum(n);
packet_check_eom();
- - authenticated = auth_rsa(pw, n);
+ authenticated = auth_rsa(pw, n, realname,
sizeof(realname));
BN_clear_free(n);
break;
@@ -363,6 +363,12 @@
u_int ulen;
char *p, *user, *style = NULL;
+ /* Added the following so that the real ID of the owner of
the
+ * public key used for successful authentication, can be
returned by
+ * auth_rsa.
+ */
+ char realname[40] = "unknown";
+
/* Get the name of the user that we wish to log in as. */
packet_read_expect(SSH_CMSG_USER);
@@ -411,7 +417,7 @@
* Loop until the user has been authenticated or the
connection is
* closed, do_authloop() returns only if authentication is
successful
*/
- - do_authloop(authctxt);
+ do_authloop(authctxt, realname);
/* The user has been authenticated and accepted. */
packet_start(SSH_SMSG_SUCCESS);
@@ -419,5 +425,5 @@
packet_write_wait();
/* Perform session preparation. */
- - do_authenticated(authctxt);
+ do_authenticated(authctxt, realname);
}
diff -ru openssh-3.1p1/auth2.c openssh-3.1p1-mods/auth2.c
- --- openssh-3.1p1/auth2.c Thu May 9 12:18:26 2002
+++ openssh-3.1p1-mods/auth2.c Thu May 9 12:19:55 2002
@@ -75,7 +75,7 @@
/* helper */
static Authmethod *authmethod_lookup(const char *);
static char *authmethods_get(void);
- -static int user_key_allowed(struct passwd *, Key *);
+static int user_key_allowed(struct passwd *, Key *, char *realname);
static int hostbased_key_allowed(struct passwd *, const char *, char
*, Key *);
/* auth */
@@ -105,6 +105,28 @@
{NULL, NULL, NULL}
};
+/* VIX
+ * this piece is my attempt to pass the value of realname from
userauth_pubkey
+ * to server_input_channel_req but i have no idea what is really
happening
+ * the value gets passed in from userauthkey but gets destroyed by
+ * server_input_channel_req wtf ???
+ */
+char sshid(char *realname, int oopt, char temprealname[40])
+{
+ int lengrn;
+
+ debug("realname passed in %s var is %d ", realname, oopt);
+ if (oopt == 1) {
+ /* write value to realname */
+ debug("writing temp value for realname");
+ lengrn = strlen(realname);
+ strncpy(temprealname, realname, lengrn );
+ debug(" VIX tempvar is %s", temprealname);
+ } else {
+ /* rewrite realname from temprealname */
+ debug("reading temp value for realname");
+ lengrn = strlen(temprealname);
+ strncpy(realname,&temprealname,lengrn);
+ }
+ debug(" VIX realname passed out is %s", realname);
+ debug(" VIX tempvar passed out %s", temprealname);
+}
+
/*
* loop until authctxt->success == TRUE
*/
@@ -114,8 +136,11 @@
{
Authctxt *authctxt = authctxt_new();
+ char realname[40] = "unknown";
+
x_authctxt = authctxt; /*XXX*/
+
/* challenge-response is implemented via keyboard interactive
*/
if (options.challenge_response_authentication)
options.kbd_interactive_authentication = 1;
@@ -125,7 +150,7 @@
dispatch_init(&dispatch_protocol_error);
dispatch_set(SSH2_MSG_SERVICE_REQUEST,
&input_service_request);
dispatch_run(DISPATCH_BLOCK, &authctxt->success, authctxt);
- - do_authenticated(authctxt);
+ do_authenticated(authctxt, realname);
}
static void
@@ -403,6 +428,13 @@
u_int alen, blen, slen;
int have_sig, pktype;
int authenticated = 0;
+
+ char realname[40] = "UNKNOWN" ;
+ char tempreal[40] = "UNKNOWN" ;
+
+ debug("**************************");
+ debug("VIX userauth_pubkey called");
+ debug("**************************");
if (!authctxt->valid) {
debug2("userauth_pubkey: disabled because of invalid
user");
@@ -467,7 +499,7 @@
buffer_dump(&b);
#endif
/* test for correct signature */
- - if (user_key_allowed(authctxt->pw, key) &&
+ if (user_key_allowed(authctxt->pw, key, realname) &&
key_verify(key, sig, slen, buffer_ptr(&b),
buffer_len(&b)) =
= 1)
authenticated = 1;
buffer_clear(&b);
@@ -484,7 +516,7 @@
* if a user is not allowed to login. is this an
* issue? -markus
*/
- - if (user_key_allowed(authctxt->pw, key)) {
+ if (user_key_allowed(authctxt->pw, key, realname)) {
packet_start(SSH2_MSG_USERAUTH_PK_OK);
packet_put_string(pkalg, alen);
packet_put_string(pkblob, blen);
@@ -505,6 +537,10 @@
if (check_nt_auth(0, authctxt->pw) == 0)
return(0);
#endif
+ sshid(realname, 1, tempreal);
+ debug("**************************");
+ debug("VIX userauth_pubkey done");
+ debug("**************************");
return authenticated;
}
@@ -638,7 +674,7 @@
/* return 1 if user allows given key */
static int
- -user_key_allowed2(struct passwd *pw, Key *key, char *file)
+user_key_allowed2(struct passwd *pw, Key *key, char *file, char
*realname)
{
char line[8192];
int found_key = 0;
@@ -647,6 +683,8 @@
struct stat st;
Key *found;
char *fp;
+ char *comment;
+ int commentlen;
if (pw == NULL)
return 0;
@@ -714,6 +752,12 @@
found_key = 1;
debug("matching key found: file %s, line
%lu",
file, linenum);
+
+ comment = cp;
+ commentlen = strlen(comment);
+ if (commentlen > 0 && comment[commentlen -1]
== '\n')
+ comment[commentlen - 1] = '\0';
+
fp = key_fingerprint(found, SSH_FP_MD5,
SSH_FP_HEX);
verbose("Found matching %s key: %s",
key_type(found), fp);
@@ -721,6 +765,9 @@
break;
}
}
+
+ strncpy(realname, comment, commentlen);
+
restore_uid();
fclose(f);
key_free(found);
@@ -731,20 +778,19 @@
/* check whether given key is in .ssh/authorized_keys* */
static int
- -user_key_allowed(struct passwd *pw, Key *key)
+user_key_allowed(struct passwd *pw, Key *key, char *realname)
{
int success;
char *file;
file = authorized_keys_file(pw);
- - success = user_key_allowed2(pw, key, file);
+ success = user_key_allowed2(pw, key, file, realname);
xfree(file);
if (success)
return success;
- -
/* try suffix "2" for backward compat, too */
file = authorized_keys_file2(pw);
- - success = user_key_allowed2(pw, key, file);
+ success = user_key_allowed2(pw, key, file, realname);
xfree(file);
return success;
}
diff -ru openssh-3.1p1/serverloop.c openssh-3.1p1-mods/serverloop.c
- --- openssh-3.1p1/serverloop.c Thu May 9 12:18:34 2002
+++ openssh-3.1p1-mods/serverloop.c Thu May 9 12:20:03 2002
@@ -734,12 +734,13 @@
}
void
- -server_loop2(Authctxt *authctxt)
+server_loop2(Authctxt *authctxt, const char *realname)
{
fd_set *readset = NULL, *writeset = NULL;
int rekeying = 0, max_fd, nalloc = 0;
debug("Entering interactive session for SSH2.");
+ debug("VIX realname is %s ", realname);
mysignal(SIGCHLD, sigchld_handler);
child_terminated = 0;
@@ -996,10 +997,20 @@
}
static void
server_input_channel_req(int type, u_int32_t seq, void *ctxt)
+/*
+ * VIX expected to get realname from calling funtion
+ * but i can't find the calling function !!!!!!
+server_input_channel_req(int type, u_int32_t seq, void *ctxt, const
char *realn
ame)
+*/
{
Channel *c;
int id, reply, success = 0;
char *rtype;
+ char realname[40] = "UNDEFINED";
+ char tempreal[40] = "UNDEFINED";
+
+ debug("*******************************");
+ debug("server_input_channel_req called");
+ debug("*******************************");
id = packet_get_int();
rtype = packet_get_string(NULL);
@@ -1012,7 +1023,7 @@
packet_disconnect("server_input_channel_req: "
"unknown channel %d", id);
if (c->type == SSH_CHANNEL_LARVAL || c->type ==
SSH_CHANNEL_OPEN)
- - success = session_input_channel_req(c, rtype);
+ success = session_input_channel_req(c, rtype,
realname);
if (reply) {
packet_start(success ?
SSH2_MSG_CHANNEL_SUCCESS :
SSH2_MSG_CHANNEL_FAILURE);
@@ -1020,6 +1031,10 @@
packet_send();
}
xfree(rtype);
+ sshid(realname, 0, tempreal);
+ debug("*****************************");
+ debug("server_input_channel_req done");
+ debug("*****************************");
}
static void
diff -ru openssh-3.1p1/serverloop.h openssh-3.1p1-mods/serverloop.h
- --- openssh-3.1p1/serverloop.h Thu May 9 12:18:34 2002
+++ openssh-3.1p1-mods/serverloop.h Thu May 9 12:20:03 2002
@@ -22,6 +22,6 @@
#define SERVERLOOP_H
void server_loop(pid_t, int, int, int);
- -void server_loop2(Authctxt *);
+void server_loop2(Authctxt *, const char *realname);
#endif
diff -ru openssh-3.1p1/session.c openssh-3.1p1-mods/session.c
- --- openssh-3.1p1/session.c Thu May 9 12:18:34 2002
+++ openssh-3.1p1-mods/session.c Thu May 9 12:20:03 2002
@@ -98,10 +98,10 @@
static void session_pty_cleanup(void *);
void session_proctitle(Session *);
int session_setup_x11fwd(Session *);
- -void do_exec_pty(Session *, const char *);
+void do_exec_pty(Session *, const char *, const char *realname);
void do_exec_no_pty(Session *, const char *);
- -void do_exec(Session *, const char *);
- -void do_login(Session *, const char *);
+void do_exec(Session *, const char *, const char *realname);
+void do_login(Session *, const char *, const char *realname);
#ifdef LOGIN_NEEDS_UTMPX
static void do_pre_login(Session *s);
#endif
@@ -109,8 +109,8 @@
void do_motd(void);
int check_quietlogin(Session *, const char *);
- -static void do_authenticated1(Authctxt *);
- -static void do_authenticated2(Authctxt *);
+static void do_authenticated1(Authctxt *, const char *realname);
+static void do_authenticated2(Authctxt *, const char *realname);
static void session_close(Session *);
static int session_pty_req(Session *);
@@ -140,7 +140,7 @@
#endif
void
- -do_authenticated(Authctxt *authctxt)
+do_authenticated(Authctxt *authctxt, const char *realname)
{
/*
* Cancel the alarm we set to limit the time taken for
@@ -176,9 +176,9 @@
channel_permit_all_opens();
if (compat20)
- - do_authenticated2(authctxt);
+ do_authenticated2(authctxt, realname);
else
- - do_authenticated1(authctxt);
+ do_authenticated1(authctxt, realname);
/* remove agent socket */
if (auth_get_socket_name())
@@ -200,7 +200,7 @@
* are requested, etc.
*/
static void
- -do_authenticated1(Authctxt *authctxt)
+do_authenticated1(Authctxt *authctxt, const char *realname)
{
Session *s;
char *command;
@@ -352,10 +352,10 @@
if (type == SSH_CMSG_EXEC_CMD) {
command = packet_get_string(&dlen);
debug("Exec command '%.500s'",
command);
- - do_exec(s, command);
+ do_exec(s, command, realname);
xfree(command);
} else {
- - do_exec(s, NULL);
+ do_exec(s, NULL, realname);
}
packet_check_eom();
session_close(s);
@@ -517,7 +517,7 @@
* lastlog, and other such operations.
*/
void
- -do_exec_pty(Session *s, const char *command)
+do_exec_pty(Session *s, const char *command, const char *realname)
{
int fdout, ptyfd, ttyfd, ptymaster;
pid_t pid;
@@ -557,7 +557,7 @@
/* record login, etc. similar to login(1) */
#ifndef HAVE_OSF_SIA
if (!(options.use_login && command == NULL))
- - do_login(s, command);
+ do_login(s, command, realname);
# ifdef LOGIN_NEEDS_UTMPX
else
do_pre_login(s);
@@ -637,7 +637,7 @@
* to be forced, execute that instead.
*/
void
- -do_exec(Session *s, const char *command)
+do_exec(Session *s, const char *command, const char *realname)
{
if (forced_command) {
original_command = command;
@@ -646,7 +646,7 @@
}
if (s->ttyfd != -1)
- - do_exec_pty(s, command);
+ do_exec_pty(s, command, realname);
else
do_exec_no_pty(s, command);
@@ -656,7 +656,7 @@
/* administrative, login(1)-like work */
void
- -do_login(Session *s, const char *command)
+do_login(Session *s, const char *command, const char *realname)
{
char *time_string;
char hostname[MAXHOSTNAMELEN];
@@ -690,7 +690,7 @@
/* Record that there was a login on that tty from the remote
host. */
record_login(pid, s->tty, pw->pw_name, pw->pw_uid,
get_remote_name_or_ip(utmp_len,
options.verify_reverse_mapping),
- - (struct sockaddr *)&from);
+ (struct sockaddr *)&from, realname);
#ifdef USE_PAM
/*
@@ -1509,7 +1509,7 @@
}
static int
- -session_subsystem_req(Session *s)
+session_subsystem_req(Session *s, const char *realname)
{
struct stat st;
u_int len;
@@ -1530,7 +1530,7 @@
}
debug("subsystem: exec() %s", cmd);
s->is_subsystem = 1;
- - do_exec(s, cmd);
+ do_exec(s, cmd, realname);
success = 1;
break;
}
@@ -1566,20 +1566,22 @@
}
static int
- -session_shell_req(Session *s)
+session_shell_req(Session *s, const char *realname)
{
+ char test1111[40] = "Unknown" ;
+
packet_check_eom();
- - do_exec(s, NULL);
+ do_exec(s, NULL, realname);
return 1;
}
static int
- -session_exec_req(Session *s)
+session_exec_req(Session *s, const char *realname)
{
u_int len;
char *command = packet_get_string(&len);
packet_check_eom();
- - do_exec(s, command);
+ do_exec(s, command, realname);
xfree(command);
return 1;
}
@@ -1602,7 +1604,7 @@
}
int
- -session_input_channel_req(Channel *c, const char *rtype)
+session_input_channel_req(Channel *c, const char *rtype, const char
*realname)
{
int success = 0;
Session *s;
@@ -1620,9 +1622,9 @@
*/
if (c->type == SSH_CHANNEL_LARVAL) {
if (strcmp(rtype, "shell") == 0) {
- - success = session_shell_req(s);
+ success = session_shell_req(s, realname);
} else if (strcmp(rtype, "exec") == 0) {
- - success = session_exec_req(s);
+ success = session_exec_req(s, realname);
} else if (strcmp(rtype, "pty-req") == 0) {
success = session_pty_req(s);
} else if (strcmp(rtype, "x11-req") == 0) {
@@ -1630,7 +1632,7 @@
} else if (strcmp(rtype,
"auth-agent-req at openssh.com") == 0) {
success = session_auth_agent_req(s);
} else if (strcmp(rtype, "subsystem") == 0) {
- - success = session_subsystem_req(s);
+ success = session_subsystem_req(s, realname);
}
}
if (strcmp(rtype, "window-change") == 0) {
@@ -1679,6 +1681,18 @@
if (s->pid != 0)
record_logout(s->pid, s->tty, s->pw->pw_name);
+ /* Remove the file which contains login info. */
+ {
+ char filename[80];
+ char *cp;
+
+ cp = strrchr(s->tty, '/');
+ if (cp != NULL) {
+ sprintf(filename, "/usr/adm/sshd/%s", cp);
+ unlink(filename);
+ }
+ }
+
/* Release the pseudo-tty. */
pty_release(s->tty);
@@ -1921,7 +1935,7 @@
}
static void
- -do_authenticated2(Authctxt *authctxt)
+do_authenticated2(Authctxt *authctxt, const char *realname)
{
- - server_loop2(authctxt);
+ server_loop2(authctxt, realname);
}
diff -ru openssh-3.1p1/session.h openssh-3.1p1-mods/session.h
- --- openssh-3.1p1/session.h Thu May 9 12:18:34 2002
+++ openssh-3.1p1-mods/session.h Thu May 9 12:20:03 2002
@@ -26,10 +26,10 @@
#ifndef SESSION_H
#define SESSION_H
- -void do_authenticated(Authctxt *);
+void do_authenticated(Authctxt *, const char *realname);
int session_open(Authctxt*, int);
- -int session_input_channel_req(Channel *, const char *);
+int session_input_channel_req(Channel *, const char *, const
char *realname
);
void session_close_by_pid(pid_t, int);
void session_close_by_channel(int, void *);
void session_destroy_all(void);
diff -ru openssh-3.1p1/sshd.c openssh-3.1p1-mods/sshd.c
- --- openssh-3.1p1/sshd.c Thu May 9 12:18:37 2002
+++ openssh-3.1p1-mods/sshd.c Thu May 9 12:20:06 2002
@@ -1519,3 +1519,4 @@
#endif
debug("KEX done");
}
+
diff -ru openssh-3.1p1/sshlogin.c openssh-3.1p1-mods/sshlogin.c
- --- openssh-3.1p1/sshlogin.c Thu May 9 12:18:37 2002
+++ openssh-3.1p1-mods/sshlogin.c Thu May 9 12:20:07 2002
@@ -67,14 +67,64 @@
void
record_login(pid_t pid, const char *ttyname, const char *user, uid_t
uid,
- - const char *host, struct sockaddr * addr)
+ const char *host, struct sockaddr * addr, const char
*realname)
{
struct logininfo *li;
+ char filename[80], line[132];
+ char *cp;
+ time_t Now;
+ struct tm *tp;
+ int fd;
li = login_alloc_entry(pid, user, host, ttyname);
login_set_addr(li, addr, sizeof(struct sockaddr));
login_login(li);
login_free_entry(li);
+
+ /* We will create a separate file in "/usr/adm/sshd" for each user
+ ** who logs in. The filename will be the same as the ttyname.
The
+ ** file will contain only one line, showing:
+ ** username
+ ** ttyname
+ ** Date and time when login started
+ ** PID
+ ** hostname of client.
+ ** Real name of public key's owner
+ */
+ cp = strrchr(ttyname, '/');
+ if (cp != NULL)
+ {
+ cp++;
+ sprintf(filename, "/usr/adm/sshd/%s", cp);
+ if (strcmp(user, "") != 0)
+ {
+ /* We are recording a login, not a logout */
+ fd = open(filename, O_WRONLY|O_CREAT, 0644);
+ chmod(filename, 0644); /* to make sure */
+ if (fd >= 0)
+ {
+ char namebuffer[21];
+
+ time(&Now);
+ tp = localtime(&Now);
+ strncpy(namebuffer, realname, 20);
+ namebuffer[20] = '\0'; /* prevent overruning line buffer */
+ sprintf(line, "%-12s %-8s %02d/%02d %02d:%02d:%02d %-5u
%-12s %-20s\n",
+ user, cp, tp->tm_mon, tp->tm_mday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec,
+ pid, host, namebuffer);
+ if (write(fd, line, strlen(line)) != strlen(line))
+ verbose("Could not write to %s", filename);
+ close(fd);
+ }
+ else
+ verbose("Could not open %s: %s", filename, strerror(errno));
+ }
+ else /* This is a logout, not a login */
+ {
+ unlink(filename);
+ }
+ }
}
#ifdef LOGIN_NEEDS_UTMPX
diff -ru openssh-3.1p1/sshlogin.h openssh-3.1p1-mods/sshlogin.h
- --- openssh-3.1p1/sshlogin.h Thu May 9 12:18:37 2002
+++ openssh-3.1p1-mods/sshlogin.h Thu May 9 12:20:07 2002
@@ -16,7 +16,7 @@
void
record_login(pid_t, const char *, const char *, uid_t,
- - const char *, struct sockaddr *);
+ const char *, struct sockaddr *, const char *realname);
void record_logout(pid_t, const char *, const char *);
u_long get_last_login_time(uid_t, const char *, char *,
u_int);
Thanks
Vikash
-----BEGIN PGP SIGNATURE-----
Version: PGP 6.5.1i for non-commercial use <http://www.pgpi.com/>
iQA/AwUBPNo3XhvA3JmlEONgEQLeDACg6WjQR6l77RQ5PpXt2S9G5Ta08QAAoPNy
2S4TWi5B3YXtr61j8g03sJHk
=fJSw
-----END PGP SIGNATURE-----
More information about the openssh-unix-dev
mailing list