[auth1.c serverloop.c session.c session.h]
     don't use channel_input_channel_request and callback
     use new server_input_channel_req() instead:
     	server_input_channel_req does generic request parsing on server side
     	session_input_channel_req handles just session specific things now
     ok djm@
This commit is contained in:
Damien Miller 2002-02-05 12:21:42 +11:00
parent 664d6b9a8e
commit c7ef63dd41
5 changed files with 51 additions and 35 deletions

View File

@ -54,6 +54,13 @@
- markus@cvs.openbsd.org 2002/01/31 15:00:05
[serverloop.c]
no need for WNOHANG; ok stevesk@
- markus@cvs.openbsd.org 2002/02/03 17:53:25
[auth1.c serverloop.c session.c session.h]
don't use channel_input_channel_request and callback
use new server_input_channel_req() instead:
server_input_channel_req does generic request parsing on server side
session_input_channel_req handles just session specific things now
ok djm@
20020130
- (djm) Delay PRNG seeding until we need it in ssh-keygen, from markus@
@ -7456,4 +7463,4 @@
- Wrote replacements for strlcpy and mkdtemp
- Released 1.0pre1
$Id: ChangeLog,v 1.1814 2002/02/05 01:20:16 djm Exp $
$Id: ChangeLog,v 1.1815 2002/02/05 01:21:42 djm Exp $

View File

@ -10,7 +10,7 @@
*/
#include "includes.h"
RCSID("$OpenBSD: auth1.c,v 1.34 2001/12/28 14:50:54 markus Exp $");
RCSID("$OpenBSD: auth1.c,v 1.35 2002/02/03 17:53:25 markus Exp $");
#include "xmalloc.h"
#include "rsa.h"
@ -22,6 +22,7 @@ RCSID("$OpenBSD: auth1.c,v 1.34 2001/12/28 14:50:54 markus Exp $");
#include "servconf.h"
#include "compat.h"
#include "auth.h"
#include "channels.h"
#include "session.h"
#include "misc.h"
#include "uidswap.h"

View File

@ -35,7 +35,7 @@
*/
#include "includes.h"
RCSID("$OpenBSD: serverloop.c,v 1.96 2002/01/31 15:00:05 markus Exp $");
RCSID("$OpenBSD: serverloop.c,v 1.97 2002/02/03 17:53:25 markus Exp $");
#include "xmalloc.h"
#include "packet.h"
@ -902,8 +902,6 @@ server_request_session(char *ctype)
channel_free(c);
return NULL;
}
channel_register_callback(c->self, SSH2_MSG_CHANNEL_REQUEST,
session_input_channel_req, (void *)0);
channel_register_cleanup(c->self, session_close_by_channel);
return c;
}
@ -1004,6 +1002,33 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
}
xfree(rtype);
}
static void
server_input_channel_req(int type, u_int32_t seq, void *ctxt)
{
Channel *c;
int id, reply, success = 0;
char *rtype;
id = packet_get_int();
rtype = packet_get_string(NULL);
reply = packet_get_char();
debug("server_input_channel_req: channel %d request %s reply %d",
id, rtype, reply);
if ((c = channel_lookup(id)) == NULL)
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);
if (reply) {
packet_start(success ?
SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);
packet_put_int(c->remote_id);
packet_send();
}
xfree(rtype);
}
static void
server_init_dispatch_20(void)
@ -1017,7 +1042,7 @@ server_init_dispatch_20(void)
dispatch_set(SSH2_MSG_CHANNEL_OPEN, &server_input_channel_open);
dispatch_set(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
dispatch_set(SSH2_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
dispatch_set(SSH2_MSG_CHANNEL_REQUEST, &channel_input_channel_request);
dispatch_set(SSH2_MSG_CHANNEL_REQUEST, &server_input_channel_req);
dispatch_set(SSH2_MSG_CHANNEL_WINDOW_ADJUST, &channel_input_window_adjust);
dispatch_set(SSH2_MSG_GLOBAL_REQUEST, &server_input_global_request);
/* client_alive */

View File

@ -33,7 +33,7 @@
*/
#include "includes.h"
RCSID("$OpenBSD: session.c,v 1.122 2002/01/29 22:46:41 markus Exp $");
RCSID("$OpenBSD: session.c,v 1.123 2002/02/03 17:53:25 markus Exp $");
#include "ssh.h"
#include "ssh1.h"
@ -1729,28 +1729,18 @@ session_auth_agent_req(Session *s)
}
}
void
session_input_channel_req(int id, void *arg)
int
session_input_channel_req(Channel *c, const char *rtype)
{
u_int len;
int reply;
int success = 0;
char *rtype;
Session *s;
Channel *c;
rtype = packet_get_string(&len);
reply = packet_get_char();
s = session_by_channel(id);
if (s == NULL)
fatal("session_input_channel_req: channel %d: no session", id);
c = channel_lookup(id);
if (c == NULL)
fatal("session_input_channel_req: channel %d: bad channel", id);
debug("session_input_channel_req: session %d channel %d request %s reply %d",
s->self, id, rtype, reply);
if ((s = session_by_channel(c->self)) == NULL) {
log("session_input_channel_req: no session %d req %.100s",
c->self, rtype);
return 0;
}
debug("session_input_channel_req: session %d req %s", s->self, rtype);
/*
* a session is in LARVAL state until a shell, a command
@ -1774,14 +1764,7 @@ session_input_channel_req(int id, void *arg)
if (strcmp(rtype, "window-change") == 0) {
success = session_window_change_req(s);
}
if (reply) {
packet_start(success ?
SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);
packet_put_int(c->remote_id);
packet_send();
}
xfree(rtype);
return success;
}
void

View File

@ -1,4 +1,4 @@
/* $OpenBSD: session.h,v 1.13 2001/10/10 22:18:47 markus Exp $ */
/* $OpenBSD: session.h,v 1.14 2002/02/03 17:53:25 markus Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
@ -29,7 +29,7 @@
void do_authenticated(Authctxt *);
int session_open(Authctxt*, int);
void session_input_channel_req(int, void *);
int session_input_channel_req(Channel *, const char *);
void session_close_by_pid(pid_t, int);
void session_close_by_channel(int, void *);
void session_destroy_all(void);