[Lutz.Jaenicke at aet.TU-Cottbus.DE: 2.9p1: HP-UX 10.20 utmp/wtmp handling broken?]
Markus Friedl
Markus.Friedl at informatik.uni-erlangen.de
Wed Jun 20 23:49:26 EST 2001
On Wed, Jun 20, 2001 at 10:20:51AM +0200, Lutz Jaenicke wrote:
> I am resending the following message about problems with utmp handling.
thanks. your original message was somehow dropped due to
problems with the signal-to-noise ratio.
you can try this patch (against -current).
the patch does a little bit more, but all you
need is this:
+ channel_free_all();
+
signal(SIGCHLD, SIG_DFL);
while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
session_close_by_pid(pid, status);
- channel_stop_listening();
in serverloop.c and an implementation for channel_free_all().
(some interfaces in channel.c have been changed since 2.9).
Index: channels.c
===================================================================
RCS file: /home/markus/cvs/ssh/channels.c,v
retrieving revision 1.125
diff -u -r1.125 channels.c
--- channels.c 2001/06/07 20:23:04 1.125
+++ channels.c 2001/06/20 13:25:23
@@ -223,11 +223,7 @@
channels = xmalloc(channels_alloc * sizeof(Channel *));
for (i = 0; i < channels_alloc; i++)
channels[i] = NULL;
- /*
- * Kludge: arrange a call to channel_stop_listening if we
- * terminate with fatal().
- */
- fatal_add_cleanup((void (*) (void *)) channel_stop_listening, NULL);
+ fatal_add_cleanup((void (*) (void *)) channel_free_all, NULL);
}
/* Try to find a free slot where to put the new channel. */
for (found = -1, i = 0; i < channels_alloc; i++)
@@ -334,38 +330,15 @@
xfree(c);
}
-
-/*
- * Stops listening for channels, and removes any unix domain sockets that we
- * might have.
- */
-
void
-channel_stop_listening()
+channel_free_all(void)
{
int i;
- Channel *c;
- for (i = 0; i < channels_alloc; i++) {
- c = channels[i];
- if (c != NULL) {
- switch (c->type) {
- case SSH_CHANNEL_AUTH_SOCKET:
- close(c->sock);
- /* auth_sock_cleanup_proc deletes the socket */
- channel_free(c);
- break;
- case SSH_CHANNEL_PORT_LISTENER:
- case SSH_CHANNEL_RPORT_LISTENER:
- case SSH_CHANNEL_X11_LISTENER:
- close(c->sock);
- channel_free(c);
- break;
- default:
- break;
- }
- }
- }
+ debug("closing all channels");
+ for (i = 0; i < channels_alloc; i++)
+ if (channels[i] != NULL)
+ channel_free(channels[i]);
}
/*
Index: channels.h
===================================================================
RCS file: /home/markus/cvs/ssh/channels.h,v
retrieving revision 1.38
diff -u -r1.38 channels.h
--- channels.h 2001/06/16 08:50:39 1.38
+++ channels.h 2001/06/20 13:25:24
@@ -150,6 +150,7 @@
channel_set_fds(int id, int rfd, int wfd, int efd,
int extusage, int nonblock);
void channel_free(Channel *c);
+void channel_free_all(void);
void channel_send_open(int id);
void channel_request(int id, char *service, int wantconfirm);
@@ -182,8 +183,8 @@
void channel_output_poll(void);
int channel_not_very_much_buffered_data(void);
-void channel_stop_listening(void);
void channel_close_all(void);
+void channel_free_all(void);
int channel_still_open(void);
char *channel_open_message(void);
int channel_find_open(void);
Index: clientloop.c
===================================================================
RCS file: /home/markus/cvs/ssh/clientloop.c,v
retrieving revision 1.75
diff -u -r1.75 clientloop.c
--- clientloop.c 2001/06/04 23:07:20 1.75
+++ clientloop.c 2001/06/20 13:28:17
@@ -546,7 +546,7 @@
leave_raw_mode();
/* Stop listening for new connections. */
- channel_stop_listening();
+ channel_close_all(); /* proto1 only XXXX */
printf("%c& [backgrounded]\n", escape_char);
@@ -926,8 +926,7 @@
if (have_pty)
signal(SIGWINCH, SIG_DFL);
- /* Stop listening for connections. */
- channel_stop_listening();
+ channel_free_all();
if (have_pty)
leave_raw_mode();
Index: packet.c
===================================================================
RCS file: /home/markus/cvs/ssh/packet.c,v
retrieving revision 1.66
diff -u -r1.66 packet.c
--- packet.c 2001/06/12 16:11:26 1.66
+++ packet.c 2001/06/20 13:25:24
@@ -1085,7 +1085,7 @@
packet_write_wait();
/* Stop listening for connections. */
- channel_stop_listening();
+ channel_close_all();
/* Close the connection. */
packet_close();
Index: serverloop.c
===================================================================
RCS file: /home/markus/cvs/ssh/serverloop.c,v
retrieving revision 1.68
diff -u -r1.68 serverloop.c
--- serverloop.c 2001/06/04 23:07:20 1.68
+++ serverloop.c 2001/06/20 13:25:24
@@ -608,8 +608,7 @@
close(fdin);
fdin = -1;
- /* Stop listening for channels; this removes unix domain sockets. */
- channel_stop_listening();
+ channel_free_all();
/* We no longer want our SIGCHLD handler to be called. */
signal(SIGCHLD, SIG_DFL);
@@ -700,10 +699,11 @@
if (writeset)
xfree(writeset);
+ channel_free_all();
+
signal(SIGCHLD, SIG_DFL);
while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
session_close_by_pid(pid, status);
- channel_stop_listening();
}
void
More information about the openssh-unix-dev
mailing list