mirror of
https://github.com/bstansell/conserver.git
synced 2024-12-21 05:43:10 +00:00
Imported from conserver-8.1.0.tar.gz
This commit is contained in:
parent
75cfd02f7a
commit
25a4dcb0fd
22
CHANGES
22
CHANGES
@ -1,6 +1,26 @@
|
|||||||
CHANGES
|
CHANGES
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
version 8.1.0 (Jan 18, 2004):
|
||||||
|
- fixes for HP-UX compilation - patch by Petter Reinholdtsen
|
||||||
|
<pere@hungry.com>
|
||||||
|
- fixes for compilation under various operating systems -
|
||||||
|
patch by Albert Chin <conserver-users@mlists.thewrittenword.com>
|
||||||
|
- added a 'protocol' option for either 'telnet' or 'raw' socket
|
||||||
|
communication - also reflected in -i output
|
||||||
|
- changed the client/server protocol to use 0xff as a command
|
||||||
|
character for sending control commands - similiar to the
|
||||||
|
telnet protocol - improves the ^Ec| interaction
|
||||||
|
- client -E option now disables ssl encryption attempts, useful
|
||||||
|
for broken SSL environents - suggested by Graydon Dodson
|
||||||
|
<grdodson@lexmark.com>
|
||||||
|
- bad error message connecting non-ssl client with ssl-required
|
||||||
|
server - reported by Graydon Dodson <grdodson@lexmark.com>
|
||||||
|
- added note about pam configuration to conserver.passwd.man -
|
||||||
|
suggested by Erik Sjolund <erik.sjolund@sbc.su.se>
|
||||||
|
- improved telnet protocol option handling such that connections
|
||||||
|
to standard telnet ports should work properly
|
||||||
|
|
||||||
version 8.0.9 (Dec 10, 2003):
|
version 8.0.9 (Dec 10, 2003):
|
||||||
- fixed major bug in connect() handling which causes most
|
- fixed major bug in connect() handling which causes most
|
||||||
socket-based consoles to timeout after 10 seconds - reported
|
socket-based consoles to timeout after 10 seconds - reported
|
||||||
@ -643,5 +663,5 @@ before version 6.05:
|
|||||||
and enhancements of various types were applied.
|
and enhancements of various types were applied.
|
||||||
|
|
||||||
#
|
#
|
||||||
# $Id: CHANGES,v 1.141 2003/12/10 18:33:40 bryan Exp $
|
# $Id: CHANGES,v 1.148 2004/01/18 17:28:31 bryan Exp $
|
||||||
#
|
#
|
||||||
|
10
INSTALL
10
INSTALL
@ -10,6 +10,14 @@ Upgrading?
|
|||||||
new features added to the client if you're considering *not*
|
new features added to the client if you're considering *not*
|
||||||
upgrading.
|
upgrading.
|
||||||
|
|
||||||
|
Version 8.1.0
|
||||||
|
|
||||||
|
- The client/server protocol has changed to better protect 8-bit
|
||||||
|
data and to allow programs invoked with '^Ec|' not have to
|
||||||
|
worry about accidentally sending the escape sequence to the
|
||||||
|
server. Though it will look like things are mostly
|
||||||
|
backward-compatible, don't count on it and just upgrade.
|
||||||
|
|
||||||
Version 8.0.2
|
Version 8.0.2
|
||||||
|
|
||||||
- I've added a '^Ec;' sequence to allow the client to signal the
|
- I've added a '^Ec;' sequence to allow the client to signal the
|
||||||
@ -255,5 +263,5 @@ Other Information And Gotchas
|
|||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# $Id: INSTALL,v 1.34 2003/10/03 17:52:31 bryan Exp $
|
# $Id: INSTALL,v 1.35 2003/12/25 19:21:59 bryan Exp $
|
||||||
#
|
#
|
||||||
|
4
config.guess
vendored
4
config.guess
vendored
@ -3,7 +3,7 @@
|
|||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2003-10-20'
|
timestamp='2004-01-05'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@ -1186,7 +1186,7 @@ EOF
|
|||||||
*:QNX:*:4*)
|
*:QNX:*:4*)
|
||||||
echo i386-pc-qnx
|
echo i386-pc-qnx
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*)
|
NSR-?:NONSTOP_KERNEL:*:*)
|
||||||
echo nsr-tandem-nsk${UNAME_RELEASE}
|
echo nsr-tandem-nsk${UNAME_RELEASE}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
*:NonStop-UX:*:*)
|
*:NonStop-UX:*:*)
|
||||||
|
@ -348,3 +348,6 @@
|
|||||||
|
|
||||||
/* Define if <signal.h> does not define sig_atomic_t */
|
/* Define if <signal.h> does not define sig_atomic_t */
|
||||||
#undef sig_atomic_t
|
#undef sig_atomic_t
|
||||||
|
|
||||||
|
/* Define to `unsigned' if <sys/types.h> does not define. */
|
||||||
|
#undef size_t
|
||||||
|
5
config.sub
vendored
5
config.sub
vendored
@ -3,7 +3,7 @@
|
|||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2003-11-20'
|
timestamp='2004-01-05'
|
||||||
|
|
||||||
# This file is (in principle) common to ALL GNU software.
|
# This file is (in principle) common to ALL GNU software.
|
||||||
# The presence of a machine in this file suggests that SOME GNU software
|
# The presence of a machine in this file suggests that SOME GNU software
|
||||||
@ -380,6 +380,9 @@ case $basic_machine in
|
|||||||
amd64)
|
amd64)
|
||||||
basic_machine=x86_64-pc
|
basic_machine=x86_64-pc
|
||||||
;;
|
;;
|
||||||
|
amd64-*)
|
||||||
|
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
amdahl)
|
amdahl)
|
||||||
basic_machine=580-amdahl
|
basic_machine=580-amdahl
|
||||||
os=-sysv
|
os=-sysv
|
||||||
|
57
configure
vendored
57
configure
vendored
@ -3973,6 +3973,63 @@ _ACEOF
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking for size_t" >&5
|
||||||
|
echo $ECHO_N "checking for size_t... $ECHO_C" >&6
|
||||||
|
if test "${ac_cv_type_size_t+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
#line $LINENO "configure"
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
$ac_includes_default
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
if ((size_t *) 0)
|
||||||
|
return 0;
|
||||||
|
if (sizeof (size_t))
|
||||||
|
return 0;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext
|
||||||
|
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||||
|
(eval $ac_compile) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } &&
|
||||||
|
{ ac_try='test -s conftest.$ac_objext'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }; then
|
||||||
|
ac_cv_type_size_t=yes
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
ac_cv_type_size_t=no
|
||||||
|
fi
|
||||||
|
rm -f conftest.$ac_objext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
|
||||||
|
echo "${ECHO_T}$ac_cv_type_size_t" >&6
|
||||||
|
if test $ac_cv_type_size_t = yes; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define size_t unsigned
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
echo "$as_me:$LINENO: checking for sig_atomic_t" >&5
|
echo "$as_me:$LINENO: checking for sig_atomic_t" >&5
|
||||||
echo $ECHO_N "checking for sig_atomic_t... $ECHO_C" >&6
|
echo $ECHO_N "checking for sig_atomic_t... $ECHO_C" >&6
|
||||||
|
@ -256,6 +256,7 @@ AC_HEADER_SYS_WAIT
|
|||||||
AC_TYPE_MODE_T
|
AC_TYPE_MODE_T
|
||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
AC_TYPE_PID_T
|
AC_TYPE_PID_T
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
AC_CHECK_TYPE([sig_atomic_t],,
|
AC_CHECK_TYPE([sig_atomic_t],,
|
||||||
AC_DEFINE(sig_atomic_t, volatile int,
|
AC_DEFINE(sig_atomic_t, volatile int,
|
||||||
|
@ -3,7 +3,7 @@ srcdir = @srcdir@
|
|||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
mandir = @mandir@
|
mandir = @mandir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
exampledir = $(prefix)/share/examples/conserver
|
exampledir = @datadir@/examples/conserver
|
||||||
|
|
||||||
### Installation programs and flags
|
### Installation programs and flags
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.\" $Id: conserver.cf.man,v 1.54 2003/12/10 18:33:56 bryan Exp $
|
.\" $Id: conserver.cf.man,v 1.55 2003/12/21 16:23:03 bryan Exp $
|
||||||
.TH CONSERVER.CF 5 "2003/12/10" "conserver-8.0.9" "conserver"
|
.TH CONSERVER.CF 5 "2003/12/21" "conserver-8.1.0" "conserver"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
conserver.cf \- console configuration file for
|
conserver.cf \- console configuration file for
|
||||||
.BR conserver (8)
|
.BR conserver (8)
|
||||||
@ -695,7 +695,7 @@ The conserver option
|
|||||||
.B \-7
|
.B \-7
|
||||||
will set this flag for all consoles.
|
will set this flag for all consoles.
|
||||||
Default is
|
Default is
|
||||||
.BR !stiphigh .
|
.BR !striphigh .
|
||||||
.TP
|
.TP
|
||||||
.B reinitoncc
|
.B reinitoncc
|
||||||
Automatically reinitialize (``bring up'') a downed console when a client
|
Automatically reinitialize (``bring up'') a downed console when a client
|
||||||
@ -798,6 +798,21 @@ See
|
|||||||
.B port
|
.B port
|
||||||
for the details of the formula.
|
for the details of the formula.
|
||||||
.TP
|
.TP
|
||||||
|
.B protocol
|
||||||
|
.RB [ " telnet " | " raw " ]
|
||||||
|
.br
|
||||||
|
Set the protocol used to send and receive data from the console.
|
||||||
|
If
|
||||||
|
.B raw
|
||||||
|
is used, all data is sent ``as is'', unprotected by any protocol specification.
|
||||||
|
If
|
||||||
|
.B telnet
|
||||||
|
is used (which is the default), data is encapsulated in the telnet protocol.
|
||||||
|
The
|
||||||
|
.B striphigh
|
||||||
|
console option still applies when data is read by the server, and if enabled,
|
||||||
|
can impact the encapsulation process.
|
||||||
|
.TP
|
||||||
.B ro
|
.B ro
|
||||||
.RI "[ [\fB!\fP]" username ,...
|
.RI "[ [\fB!\fP]" username ,...
|
||||||
| "" ]
|
| "" ]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.\" $Id: conserver.passwd.man,v 1.9 2003/07/04 20:20:52 bryan Exp $
|
.\" $Id: conserver.passwd.man,v 1.10 2004/01/08 16:12:33 bryan Exp $
|
||||||
.TH CONSERVER.PASSWD 5 "2003/07/04" "conserver-8.0.9" "conserver"
|
.TH CONSERVER.PASSWD 5 "2004/01/08" "conserver-8.1.0" "conserver"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
conserver.passwd \- user access information for
|
conserver.passwd \- user access information for
|
||||||
.BR conserver (8)
|
.BR conserver (8)
|
||||||
@ -59,7 +59,8 @@ in the system
|
|||||||
If PAM support has been enabled
|
If PAM support has been enabled
|
||||||
.RB ( --with-pam ),
|
.RB ( --with-pam ),
|
||||||
PAM lookups will be done instead of
|
PAM lookups will be done instead of
|
||||||
.BR passwd " (or " shadow ") lookups."
|
.BR passwd " (or " shadow ") lookups"
|
||||||
|
(you may need to edit /etc/pam.conf or create /etc/pam.d/conserver).
|
||||||
If this field is empty, password checking is bypassed for this user.
|
If this field is empty, password checking is bypassed for this user.
|
||||||
.SH EXAMPLE
|
.SH EXAMPLE
|
||||||
.TP 24
|
.TP 24
|
||||||
|
@ -183,11 +183,11 @@
|
|||||||
|
|
||||||
<H3>Downloading</H3>
|
<H3>Downloading</H3>
|
||||||
|
|
||||||
<P>The current version, released on Dec 10, 2003, is <A
|
<P>The current version, released on Jan 18, 2004, is <A
|
||||||
href="8.0.9.tar.gz">8.0.9.tar.gz</A>. You can get it via
|
href="8.1.0.tar.gz">8.1.0.tar.gz</A>. You can get it via
|
||||||
<A href=
|
<A href=
|
||||||
"ftp://ftp.conserver.com/conserver/8.0.9.tar.gz">FTP</A>
|
"ftp://ftp.conserver.com/conserver/8.1.0.tar.gz">FTP</A>
|
||||||
or <A href="8.0.9.tar.gz">HTTP</A>. See the <A href=
|
or <A href="8.1.0.tar.gz">HTTP</A>. See the <A href=
|
||||||
"CHANGES">CHANGES</A> file for information on the latest
|
"CHANGES">CHANGES</A> file for information on the latest
|
||||||
updates.</P>
|
updates.</P>
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ exec_prefix = @exec_prefix@
|
|||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
mandir = @mandir@
|
mandir = @mandir@
|
||||||
exampledir = $(prefix)/share/examples/conserver
|
exampledir = @datadir@/examples/conserver
|
||||||
|
|
||||||
### Installation programs and flags
|
### Installation programs and flags
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: client.h,v 5.35 2003/11/28 15:55:34 bryan Exp $
|
* $Id: client.h,v 5.36 2003/12/25 19:22:00 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -47,7 +47,8 @@ typedef enum clientState {
|
|||||||
S_PASSWD, /* still needs a passwd to connect */
|
S_PASSWD, /* still needs a passwd to connect */
|
||||||
S_QUOTE, /* send any character we can spell */
|
S_QUOTE, /* send any character we can spell */
|
||||||
S_BCAST, /* send a broadcast message to all clients */
|
S_BCAST, /* send a broadcast message to all clients */
|
||||||
S_CWAIT /* wait for client */
|
S_CWAIT, /* wait for client */
|
||||||
|
S_CEXEC /* client execing a program */
|
||||||
} CLIENTSTATE;
|
} CLIENTSTATE;
|
||||||
|
|
||||||
typedef struct client { /* Connection Information: */
|
typedef struct client { /* Connection Information: */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: consent.c,v 5.133 2003/12/10 18:33:47 bryan Exp $
|
* $Id: consent.c,v 5.134 2003/12/20 06:11:53 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -691,7 +691,7 @@ ConsInit(pCE)
|
|||||||
TagLogfile(pCE, "Console up");
|
TagLogfile(pCE, "Console up");
|
||||||
|
|
||||||
switch (pCE->type) {
|
switch (pCE->type) {
|
||||||
case UNKNOWN: /* shut up gcc */
|
case UNKNOWNTYPE: /* shut up gcc */
|
||||||
break;
|
break;
|
||||||
case EXEC:
|
case EXEC:
|
||||||
if ((cofile =
|
if ((cofile =
|
||||||
@ -826,7 +826,7 @@ ConsInit(pCE)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (pCE->type) {
|
switch (pCE->type) {
|
||||||
case UNKNOWN: /* shut up gcc */
|
case UNKNOWNTYPE: /* shut up gcc */
|
||||||
break;
|
break;
|
||||||
case EXEC:
|
case EXEC:
|
||||||
Verbose("[%s] pid %lu on %s", pCE->server, pCE->ipid,
|
Verbose("[%s] pid %lu on %s", pCE->server, pCE->ipid,
|
||||||
@ -857,9 +857,9 @@ ConsInit(pCE)
|
|||||||
if (pCE->ioState == ISNORMAL) {
|
if (pCE->ioState == ISNORMAL) {
|
||||||
pCE->lastWrite = tyme;
|
pCE->lastWrite = tyme;
|
||||||
if (pCE->idletimeout != (time_t)0 &&
|
if (pCE->idletimeout != (time_t)0 &&
|
||||||
(timers[T_IDLE] == (time_t)0 ||
|
(timers[T_CIDLE] == (time_t)0 ||
|
||||||
timers[T_IDLE] > pCE->lastWrite + pCE->idletimeout))
|
timers[T_CIDLE] > pCE->lastWrite + pCE->idletimeout))
|
||||||
timers[T_IDLE] = pCE->lastWrite + pCE->idletimeout;
|
timers[T_CIDLE] = pCE->lastWrite + pCE->idletimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we have marks, adjust the next one so that it's in the future */
|
/* If we have marks, adjust the next one so that it's in the future */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: consent.h,v 5.53 2003/11/28 23:36:02 bryan Exp $
|
* $Id: consent.h,v 5.55 2003/12/21 16:23:02 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -52,7 +52,7 @@ typedef struct parity { /* a parity bits table */
|
|||||||
} PARITY;
|
} PARITY;
|
||||||
|
|
||||||
typedef enum consType {
|
typedef enum consType {
|
||||||
UNKNOWN = 0,
|
UNKNOWNTYPE = 0,
|
||||||
DEVICE,
|
DEVICE,
|
||||||
EXEC,
|
EXEC,
|
||||||
HOST
|
HOST
|
||||||
@ -95,6 +95,7 @@ typedef struct consent { /* console information */
|
|||||||
unsigned short port; /* port number socket = portbase + */
|
unsigned short port; /* port number socket = portbase + */
|
||||||
unsigned short portbase; /* port base portinc * port */
|
unsigned short portbase; /* port base portinc * port */
|
||||||
unsigned short portinc; /* port increment */
|
unsigned short portinc; /* port increment */
|
||||||
|
unsigned short raw; /* raw or telnet protocol? */
|
||||||
/* type == EXEC */
|
/* type == EXEC */
|
||||||
char *exec; /* exec command */
|
char *exec; /* exec command */
|
||||||
char *execsubst; /* exec substitution pattern */
|
char *execsubst; /* exec substitution pattern */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.\" @(#)conserver.8 01/06/91 OSU CIS; Thomas A. Fine
|
.\" @(#)conserver.8 01/06/91 OSU CIS; Thomas A. Fine
|
||||||
.\" $Id: conserver.man,v 1.40 2003/11/10 15:37:24 bryan Exp $
|
.\" $Id: conserver.man,v 1.40 2003/11/10 15:37:24 bryan Exp $
|
||||||
.TH CONSERVER 8 "2003/11/10" "conserver-8.0.9" "conserver"
|
.TH CONSERVER 8 "2003/11/10" "conserver-8.1.0" "conserver"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
conserver \- console server daemon
|
conserver \- console server daemon
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: cutil.c,v 1.109 2003/12/02 16:21:43 bryan Exp $
|
* $Id: cutil.c,v 1.113 2004/01/18 13:05:43 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -238,6 +238,35 @@ BuildStringN(str, n, msg)
|
|||||||
return msg->string;
|
return msg->string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
#if PROTOTYPES
|
||||||
|
MemMove(void *dest, void *src, size_t n)
|
||||||
|
#else
|
||||||
|
MemMove(void *dest, void *src, size_t n)
|
||||||
|
void *dest;
|
||||||
|
void *src;
|
||||||
|
size_t n;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#if HAVE_MEMMOVE
|
||||||
|
return memmove(dest, src, n);
|
||||||
|
#else
|
||||||
|
char *s = src;
|
||||||
|
char *d = dest;
|
||||||
|
|
||||||
|
if (s < d) {
|
||||||
|
/* Moving from low mem to hi mem; start at end. */
|
||||||
|
for (s += n, d += n; n > 0; --n)
|
||||||
|
*--d = *--s;
|
||||||
|
} else if (s != d) {
|
||||||
|
/* Moving from hi mem to low mem; start at beginning. */
|
||||||
|
for (; n > 0; --n)
|
||||||
|
*d++ = *s++;
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
#if PROTOTYPES
|
#if PROTOTYPES
|
||||||
ShiftString(STRING *msg, int n)
|
ShiftString(STRING *msg, int n)
|
||||||
@ -250,17 +279,8 @@ ShiftString(msg, n)
|
|||||||
if (msg == (STRING *)0 || n <= 0 || n > msg->used - 1)
|
if (msg == (STRING *)0 || n <= 0 || n > msg->used - 1)
|
||||||
return (char *)0;
|
return (char *)0;
|
||||||
|
|
||||||
#if HAVE_MEMMOVE
|
MemMove(msg->string, msg->string + n, msg->used - n);
|
||||||
memmove(msg->string, msg->string + n, msg->used - n);
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
char *s, *e;
|
|
||||||
int len;
|
|
||||||
for (s = msg->string, e = s + n, len = msg->used - n; len > 0;
|
|
||||||
len--)
|
|
||||||
*s++ = *e++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
msg->used -= n;
|
msg->used -= n;
|
||||||
return msg->string;
|
return msg->string;
|
||||||
}
|
}
|
||||||
@ -730,6 +750,27 @@ FileOpenFD(fd, type)
|
|||||||
cfp->ssl = (SSL *)0;
|
cfp->ssl = (SSL *)0;
|
||||||
cfp->waitForRead = cfp->waitForWrite = FLAGFALSE;
|
cfp->waitForRead = cfp->waitForWrite = FLAGFALSE;
|
||||||
#endif
|
#endif
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
sprintf(buf, "CONSFILE-%s-%lu-%d.w", progname,
|
||||||
|
(unsigned long)thepid, fd);
|
||||||
|
if ((cfp->debugwfd =
|
||||||
|
open(buf, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) {
|
||||||
|
sprintf(buf, "[---- STARTED - %s ----]\n",
|
||||||
|
StrTime((time_t *)0));
|
||||||
|
write(cfp->debugwfd, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
sprintf(buf, "CONSFILE-%s-%lu-%d.r", progname,
|
||||||
|
(unsigned long)thepid, fd);
|
||||||
|
if ((cfp->debugrfd =
|
||||||
|
open(buf, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) {
|
||||||
|
sprintf(buf, "[---- STARTED - %s ----]\n",
|
||||||
|
StrTime((time_t *)0));
|
||||||
|
write(cfp->debugrfd, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CONDDEBUG((2, "FileOpenFD(): encapsulated fd %d type %d", fd, type));
|
CONDDEBUG((2, "FileOpenFD(): encapsulated fd %d type %d", fd, type));
|
||||||
return cfp;
|
return cfp;
|
||||||
@ -760,6 +801,27 @@ FileOpenPipe(fd, fdout)
|
|||||||
cfp->ssl = (SSL *)0;
|
cfp->ssl = (SSL *)0;
|
||||||
cfp->waitForRead = cfp->waitForWrite = FLAGFALSE;
|
cfp->waitForRead = cfp->waitForWrite = FLAGFALSE;
|
||||||
#endif
|
#endif
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
sprintf(buf, "CONSFILE-%s-%lu-%d.w", progname,
|
||||||
|
(unsigned long)thepid, fdout);
|
||||||
|
if ((cfp->debugwfd =
|
||||||
|
open(buf, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) {
|
||||||
|
sprintf(buf, "[---- STARTED - %s ----]\n",
|
||||||
|
StrTime((time_t *)0));
|
||||||
|
write(cfp->debugwfd, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
sprintf(buf, "CONSFILE-%s-%lu-%d.r", progname,
|
||||||
|
(unsigned long)thepid, fd);
|
||||||
|
if ((cfp->debugrfd =
|
||||||
|
open(buf, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) {
|
||||||
|
sprintf(buf, "[---- STARTED - %s ----]\n",
|
||||||
|
StrTime((time_t *)0));
|
||||||
|
write(cfp->debugrfd, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CONDDEBUG((2, "FileOpenPipe(): encapsulated pipe pair fd %d and fd %d",
|
CONDDEBUG((2, "FileOpenPipe(): encapsulated pipe pair fd %d and fd %d",
|
||||||
fd, fdout));
|
fd, fdout));
|
||||||
@ -798,6 +860,12 @@ FileUnopen(cfp)
|
|||||||
}
|
}
|
||||||
CONDDEBUG((2, "FileUnopen(): unopened fd %d", cfp->fd));
|
CONDDEBUG((2, "FileUnopen(): unopened fd %d", cfp->fd));
|
||||||
DestroyString(cfp->wbuf);
|
DestroyString(cfp->wbuf);
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
if (cfp->debugwfd != -1)
|
||||||
|
close(cfp->debugwfd);
|
||||||
|
if (cfp->debugrfd != -1)
|
||||||
|
close(cfp->debugrfd);
|
||||||
|
#endif
|
||||||
free(cfp);
|
free(cfp);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
@ -833,6 +901,27 @@ FileOpen(path, flag, mode)
|
|||||||
cfp->ssl = (SSL *)0;
|
cfp->ssl = (SSL *)0;
|
||||||
cfp->waitForRead = cfp->waitForWrite = FLAGFALSE;
|
cfp->waitForRead = cfp->waitForWrite = FLAGFALSE;
|
||||||
#endif
|
#endif
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
sprintf(buf, "CONSFILE-%s-%lu-%d.w", progname,
|
||||||
|
(unsigned long)thepid, fd);
|
||||||
|
if ((cfp->debugwfd =
|
||||||
|
open(buf, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) {
|
||||||
|
sprintf(buf, "[---- STARTED - %s ----]\n",
|
||||||
|
StrTime((time_t *)0));
|
||||||
|
write(cfp->debugwfd, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
sprintf(buf, "CONSFILE-%s-%lu-%d.r", progname,
|
||||||
|
(unsigned long)thepid, fd);
|
||||||
|
if ((cfp->debugrfd =
|
||||||
|
open(buf, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) {
|
||||||
|
sprintf(buf, "[---- STARTED - %s ----]\n",
|
||||||
|
StrTime((time_t *)0));
|
||||||
|
write(cfp->debugrfd, buf, strlen(buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CONDDEBUG((2, "FileOpen(): opened `%s' as fd %d", path, fd));
|
CONDDEBUG((2, "FileOpen(): opened `%s' as fd %d", path, fd));
|
||||||
return cfp;
|
return cfp;
|
||||||
@ -928,6 +1017,12 @@ FileClose(pcfp)
|
|||||||
CONDDEBUG((2, "FileClose(): closed fd %d", cfp->fd));
|
CONDDEBUG((2, "FileClose(): closed fd %d", cfp->fd));
|
||||||
}
|
}
|
||||||
DestroyString(cfp->wbuf);
|
DestroyString(cfp->wbuf);
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
if (cfp->debugwfd != -1)
|
||||||
|
close(cfp->debugwfd);
|
||||||
|
if (cfp->debugrfd != -1)
|
||||||
|
close(cfp->debugrfd);
|
||||||
|
#endif
|
||||||
free(cfp);
|
free(cfp);
|
||||||
*pcfp = (CONSFILE *)0;
|
*pcfp = (CONSFILE *)0;
|
||||||
|
|
||||||
@ -969,6 +1064,10 @@ FileRead(cfp, buf, len)
|
|||||||
retval = -1;
|
retval = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
if (cfp->debugrfd != -1)
|
||||||
|
write(cfp->debugrfd, buf, retval);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
@ -1007,6 +1106,10 @@ FileRead(cfp, buf, len)
|
|||||||
cfp->ftype = simpleSocket;
|
cfp->ftype = simpleSocket;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
if (cfp->debugrfd != -1)
|
||||||
|
write(cfp->debugrfd, buf, retval);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
@ -1080,9 +1183,23 @@ FileWrite(cfp, bufferonly, buf, len)
|
|||||||
tmpString->string, fdout));
|
tmpString->string, fdout));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save the data */
|
/* save the data */
|
||||||
if (len > 0 && buf != (char *)0)
|
if (len > 0 && buf != (char *)0) {
|
||||||
BuildStringN(buf, len, cfp->wbuf);
|
if (cfp->quoteiac == FLAGTRUE) {
|
||||||
|
int l, o;
|
||||||
|
for (o = l = 0; l < len; l++) {
|
||||||
|
if (buf[l] == (char)OB_IAC) {
|
||||||
|
BuildStringN(buf + o, l + 1 - o, cfp->wbuf);
|
||||||
|
BuildStringChar((char)OB_IAC, cfp->wbuf);
|
||||||
|
o = l + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (o < len)
|
||||||
|
BuildStringN(buf + o, len - o, cfp->wbuf);
|
||||||
|
} else
|
||||||
|
BuildStringN(buf, len, cfp->wbuf);
|
||||||
|
}
|
||||||
|
|
||||||
if (bufferonly == FLAGTRUE)
|
if (bufferonly == FLAGTRUE)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1132,6 +1249,10 @@ FileWrite(cfp, bufferonly, buf, len)
|
|||||||
strerror(errno));
|
strerror(errno));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
if (cfp->debugwfd != -1)
|
||||||
|
write(cfp->debugwfd, buf, retval);
|
||||||
|
#endif
|
||||||
buf += retval;
|
buf += retval;
|
||||||
len -= retval;
|
len -= retval;
|
||||||
len_out += retval;
|
len_out += retval;
|
||||||
@ -1176,6 +1297,10 @@ FileWrite(cfp, bufferonly, buf, len)
|
|||||||
}
|
}
|
||||||
if (retval <= 0)
|
if (retval <= 0)
|
||||||
break;
|
break;
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
if (cfp->debugwfd != -1)
|
||||||
|
write(cfp->debugwfd, buf, retval);
|
||||||
|
#endif
|
||||||
buf += retval;
|
buf += retval;
|
||||||
len -= retval;
|
len -= retval;
|
||||||
len_out += retval;
|
len_out += retval;
|
||||||
@ -1757,6 +1882,58 @@ FileSetType(cfp, type)
|
|||||||
cfp->ftype = type;
|
cfp->ftype = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Sets the file quoting method */
|
||||||
|
void
|
||||||
|
#if PROTOTYPES
|
||||||
|
FileSetQuoteIAC(CONSFILE *cfp, FLAG flag)
|
||||||
|
#else
|
||||||
|
FileSetQuoteIAC(cfp, flag)
|
||||||
|
CONSFILE *cfp;
|
||||||
|
FLAG flag;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
cfp->quoteiac = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAG
|
||||||
|
#if PROTOTYPES
|
||||||
|
FileSawQuoteSusp(CONSFILE *cfp)
|
||||||
|
#else
|
||||||
|
FileSawQuoteSusp(cfp)
|
||||||
|
CONSFILE *cfp;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FLAG r = cfp->sawiacsusp;
|
||||||
|
cfp->sawiacsusp = FLAGFALSE;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAG
|
||||||
|
#if PROTOTYPES
|
||||||
|
FileSawQuoteExec(CONSFILE *cfp)
|
||||||
|
#else
|
||||||
|
FileSawQuoteExec(cfp)
|
||||||
|
CONSFILE *cfp;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FLAG r = cfp->sawiacexec;
|
||||||
|
cfp->sawiacexec = FLAGFALSE;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAG
|
||||||
|
#if PROTOTYPES
|
||||||
|
FileSawQuoteAbrt(CONSFILE *cfp)
|
||||||
|
#else
|
||||||
|
FileSawQuoteAbrt(cfp)
|
||||||
|
CONSFILE *cfp;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FLAG r = cfp->sawiacabrt;
|
||||||
|
cfp->sawiacabrt = FLAGFALSE;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
/* Get the SSL instance */
|
/* Get the SSL instance */
|
||||||
SSL *
|
SSL *
|
||||||
@ -2088,3 +2265,106 @@ StrDup(msg)
|
|||||||
#endif
|
#endif
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
#if PROTOTYPES
|
||||||
|
StringChar(STRING *msg, int offset, char c)
|
||||||
|
#else
|
||||||
|
StringChar(msg, offset, c)
|
||||||
|
STRING *msg;
|
||||||
|
int offset;
|
||||||
|
char c;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int o;
|
||||||
|
|
||||||
|
if (msg == (STRING *)0 || msg->used <= 1 || offset < 0 ||
|
||||||
|
offset > msg->used)
|
||||||
|
return (char *)0;
|
||||||
|
|
||||||
|
for (o = offset; o != msg->used; o++) {
|
||||||
|
if (msg->string[o] == c)
|
||||||
|
return &(msg->string[o]);
|
||||||
|
}
|
||||||
|
return (char *)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this takes a buffer, and returns the number of characters to use,
|
||||||
|
* which goes up to the first OB_IAC character sequence (that isn't
|
||||||
|
* OB_IAC/OB_IAC). if it is an OB_IAC sequence, it sets the flag and
|
||||||
|
* returns zero. if it's invalid args, we return -1.
|
||||||
|
* so <0 == no data, 0 == check flags, >0 number of chars to use
|
||||||
|
* this *WILL* modify the buffer (OB_IAC sequences get extracted/shrunk)
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
#if PROTOTYPES
|
||||||
|
ParseIACBuf(CONSFILE *cfp, void *msg, int *len)
|
||||||
|
#else
|
||||||
|
ParseIACBuf(cfp, msg, len)
|
||||||
|
CONSFILE *cfp;
|
||||||
|
void *msg;
|
||||||
|
int *len;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int l = 0;
|
||||||
|
unsigned char *b = msg;
|
||||||
|
|
||||||
|
if (*len <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (cfp->quoteiac != FLAGTRUE)
|
||||||
|
return *len;
|
||||||
|
|
||||||
|
/* split OB_IAC/char pair OR OB_IAC at start */
|
||||||
|
if (cfp->sawiac == FLAGTRUE || b[0] == OB_IAC) {
|
||||||
|
int i = 1;
|
||||||
|
|
||||||
|
if (cfp->sawiac == FLAGTRUE) {
|
||||||
|
i = 0;
|
||||||
|
cfp->sawiac = FLAGFALSE;
|
||||||
|
}
|
||||||
|
if (i == *len) { /* only thing is OB_IAC */
|
||||||
|
cfp->sawiac = FLAGTRUE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b[i] == OB_SUSP)
|
||||||
|
cfp->sawiacsusp = FLAGTRUE;
|
||||||
|
else if (b[i] == OB_EXEC)
|
||||||
|
cfp->sawiacexec = FLAGTRUE;
|
||||||
|
else if (b[i] == OB_ABRT)
|
||||||
|
cfp->sawiacabrt = FLAGTRUE;
|
||||||
|
else {
|
||||||
|
if (b[i] != OB_IAC)
|
||||||
|
Error
|
||||||
|
("ParseIACBuf(): fd %d: unrecognized quoted-OB_IAC char",
|
||||||
|
cfp->fd, strerror(errno));
|
||||||
|
l = 1;
|
||||||
|
}
|
||||||
|
*len = *len - i - 1 + l;
|
||||||
|
MemMove(b, b + i + 1 - l, *len);
|
||||||
|
if (l == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (; l < *len; l++) {
|
||||||
|
if (b[l] == OB_IAC) {
|
||||||
|
if (l + 1 == *len)
|
||||||
|
return l;
|
||||||
|
else if (b[l + 1] == OB_SUSP)
|
||||||
|
return l;
|
||||||
|
else if (b[l + 1] == OB_EXEC)
|
||||||
|
return l;
|
||||||
|
else if (b[l + 1] == OB_ABRT)
|
||||||
|
return l;
|
||||||
|
else {
|
||||||
|
if (b[l + 1] != OB_IAC)
|
||||||
|
Error
|
||||||
|
("ParseIACBuf(): fd %d: unrecognized quoted-OB_IAC char",
|
||||||
|
cfp->fd, strerror(errno));
|
||||||
|
--(*len);
|
||||||
|
MemMove(b + l, b + l + 1, *len - l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: cutil.h,v 1.57 2003/11/28 00:47:29 bryan Exp $
|
* $Id: cutil.h,v 1.60 2004/01/18 13:05:43 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -18,9 +18,10 @@
|
|||||||
|
|
||||||
/* communication constants
|
/* communication constants
|
||||||
*/
|
*/
|
||||||
|
#define OB_IAC 0xff /* quote char */
|
||||||
#define OB_EXEC 'E' /* exec a command on the client */
|
#define OB_EXEC 'E' /* exec a command on the client */
|
||||||
#define OB_SUSP 'Z' /* suspended by server */
|
#define OB_SUSP 'Z' /* suspended by server */
|
||||||
#define OB_DROP '.' /* dropped by server */
|
#define OB_ABRT '.' /* abort */
|
||||||
|
|
||||||
/* Struct to wrap information about a "file"...
|
/* Struct to wrap information about a "file"...
|
||||||
* This can be a socket, local file, whatever. We do this so
|
* This can be a socket, local file, whatever. We do this so
|
||||||
@ -68,6 +69,11 @@ typedef struct consFile {
|
|||||||
int fd;
|
int fd;
|
||||||
int fdout; /* only used when a simplePipe */
|
int fdout; /* only used when a simplePipe */
|
||||||
STRING *wbuf;
|
STRING *wbuf;
|
||||||
|
FLAG quoteiac;
|
||||||
|
FLAG sawiac;
|
||||||
|
FLAG sawiacsusp;
|
||||||
|
FLAG sawiacexec;
|
||||||
|
FLAG sawiacabrt;
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
/* SSL stuff */
|
/* SSL stuff */
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
@ -75,6 +81,10 @@ typedef struct consFile {
|
|||||||
FLAG waitForRead;
|
FLAG waitForRead;
|
||||||
#endif
|
#endif
|
||||||
/* Add crypto stuff to suit */
|
/* Add crypto stuff to suit */
|
||||||
|
#if DEBUG_CONSFILE_IO
|
||||||
|
int debugrfd;
|
||||||
|
int debugwfd;
|
||||||
|
#endif
|
||||||
} CONSFILE;
|
} CONSFILE;
|
||||||
|
|
||||||
extern int isMultiProc, fDebug, fVerbose, fErrorPrinted;
|
extern int isMultiProc, fDebug, fVerbose, fErrorPrinted;
|
||||||
@ -128,6 +138,10 @@ extern STRING *AllocString PARAMS((void));
|
|||||||
extern char *ReadLine PARAMS((FILE *, STRING *, int *));
|
extern char *ReadLine PARAMS((FILE *, STRING *, int *));
|
||||||
extern enum consFileType FileGetType PARAMS((CONSFILE *));
|
extern enum consFileType FileGetType PARAMS((CONSFILE *));
|
||||||
extern void FileSetType PARAMS((CONSFILE *, enum consFileType));
|
extern void FileSetType PARAMS((CONSFILE *, enum consFileType));
|
||||||
|
extern void FileSetQuoteIAC PARAMS((CONSFILE *, FLAG));
|
||||||
|
extern FLAG FileSawQuoteSusp PARAMS((CONSFILE *));
|
||||||
|
extern FLAG FileSawQuoteExec PARAMS((CONSFILE *));
|
||||||
|
extern FLAG FileSawQuoteAbrt PARAMS((CONSFILE *));
|
||||||
extern void Bye PARAMS((int));
|
extern void Bye PARAMS((int));
|
||||||
extern void DestroyDataStructures PARAMS((void));
|
extern void DestroyDataStructures PARAMS((void));
|
||||||
extern int IsMe PARAMS((char *));
|
extern int IsMe PARAMS((char *));
|
||||||
@ -137,6 +151,9 @@ extern int FileCanWrite PARAMS((CONSFILE *, fd_set *, fd_set *));
|
|||||||
extern int FileBufEmpty PARAMS((CONSFILE *));
|
extern int FileBufEmpty PARAMS((CONSFILE *));
|
||||||
extern int SetFlags PARAMS((int, int, int));
|
extern int SetFlags PARAMS((int, int, int));
|
||||||
extern char *StrDup PARAMS((char *));
|
extern char *StrDup PARAMS((char *));
|
||||||
|
extern int ParseIACBuf PARAMS((CONSFILE *, void *, int *));
|
||||||
|
extern void *MemMove PARAMS((void *, void *, size_t));
|
||||||
|
extern char *StringChar PARAMS((STRING *, int, char));
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
extern SSL *FileGetSSL PARAMS((CONSFILE *));
|
extern SSL *FileGetSSL PARAMS((CONSFILE *));
|
||||||
extern void FileSetSSL PARAMS((CONSFILE *, SSL *));
|
extern void FileSetSSL PARAMS((CONSFILE *, SSL *));
|
||||||
|
2247
conserver/group.c
2247
conserver/group.c
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: group.h,v 5.42 2003/11/28 23:36:02 bryan Exp $
|
* $Id: group.h,v 5.43 2003/12/20 06:11:53 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
/* timers used to have various things happen */
|
/* timers used to have various things happen */
|
||||||
#define T_STATE 0
|
#define T_STATE 0
|
||||||
#define T_IDLE 1
|
#define T_CIDLE 1
|
||||||
#define T_MARK 2
|
#define T_MARK 2
|
||||||
#define T_REINIT 3
|
#define T_REINIT 3
|
||||||
#define T_AUTOUP 4
|
#define T_AUTOUP 4
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: main.c,v 5.172 2003/11/20 13:56:39 bryan Exp $
|
* $Id: main.c,v 5.174 2003/12/21 16:23:02 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -883,13 +883,13 @@ DumpDataStructures()
|
|||||||
"DumpDataStructures(): server=%s, type=HOST",
|
"DumpDataStructures(): server=%s, type=HOST",
|
||||||
EMPTYSTR(pCE->server)));
|
EMPTYSTR(pCE->server)));
|
||||||
CONDDEBUG((1,
|
CONDDEBUG((1,
|
||||||
"DumpDataStructures(): host=%s, port=%hu, telnetState=%d",
|
"DumpDataStructures(): host=%s, raw=%hu, port=%hu, telnetState=%d",
|
||||||
EMPTYSTR(pCE->host), pCE->port,
|
EMPTYSTR(pCE->host), pCE->raw, pCE->port,
|
||||||
pCE->telnetState));
|
pCE->telnetState));
|
||||||
break;
|
break;
|
||||||
case UNKNOWN:
|
case UNKNOWNTYPE:
|
||||||
CONDDEBUG((1,
|
CONDDEBUG((1,
|
||||||
"DumpDataStructures(): server=%s, type=UNKNOWN",
|
"DumpDataStructures(): server=%s, type=UNKNOWNTYPE",
|
||||||
EMPTYSTR(pCE->server)));
|
EMPTYSTR(pCE->server)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: master.c,v 5.123 2003/11/20 13:56:39 bryan Exp $
|
* $Id: master.c,v 5.124 2003/12/25 19:22:00 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -433,7 +433,7 @@ DoNormalRead(pCLServing)
|
|||||||
{
|
{
|
||||||
char *pcCmd;
|
char *pcCmd;
|
||||||
char *pcArgs;
|
char *pcArgs;
|
||||||
int nr, i;
|
int nr, i, l;
|
||||||
unsigned char acIn[BUFSIZ];
|
unsigned char acIn[BUFSIZ];
|
||||||
|
|
||||||
/* read connection */
|
/* read connection */
|
||||||
@ -442,208 +442,221 @@ DoNormalRead(pCLServing)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nr; ++i) {
|
while ((l = ParseIACBuf(pCLServing->fd, acIn, &nr)) >= 0) {
|
||||||
if ('\n' != acIn[i]) {
|
if (l == 0) /* we ignore special OB_IAC stuff */
|
||||||
BuildStringChar(acIn[i], pCLServing->accmd);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
for (i = 0; i < l; ++i) {
|
||||||
if ((pCLServing->accmd->used > 1) &&
|
if ('\n' != acIn[i]) {
|
||||||
('\r' ==
|
BuildStringChar(acIn[i], pCLServing->accmd);
|
||||||
pCLServing->accmd->string[pCLServing->accmd->used - 2])) {
|
continue;
|
||||||
pCLServing->accmd->string[pCLServing->accmd->used - 2] =
|
}
|
||||||
'\000';
|
if ((pCLServing->accmd->used > 1) &&
|
||||||
pCLServing->accmd->used--;
|
('\r' ==
|
||||||
}
|
pCLServing->accmd->string[pCLServing->accmd->used - 2])) {
|
||||||
|
pCLServing->accmd->string[pCLServing->accmd->used - 2] =
|
||||||
|
'\000';
|
||||||
|
pCLServing->accmd->used--;
|
||||||
|
}
|
||||||
|
|
||||||
/* process password here...before we corrupt accmd */
|
/* process password here...before we corrupt accmd */
|
||||||
if (pCLServing->iState == S_PASSWD) {
|
if (pCLServing->iState == S_PASSWD) {
|
||||||
if (CheckPasswd(pCLServing, pCLServing->accmd->string) !=
|
if (CheckPasswd(pCLServing, pCLServing->accmd->string) !=
|
||||||
AUTH_SUCCESS) {
|
AUTH_SUCCESS) {
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
"invalid password\r\n", -1);
|
"invalid password\r\n", -1);
|
||||||
|
BuildString((char *)0, pCLServing->accmd);
|
||||||
|
DropMasterClient(pCLServing, FLAGFALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Verbose("<master> login %s", pCLServing->acid->string);
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE, "ok\r\n", 4);
|
||||||
|
pCLServing->iState = S_NORMAL;
|
||||||
BuildString((char *)0, pCLServing->accmd);
|
BuildString((char *)0, pCLServing->accmd);
|
||||||
DropMasterClient(pCLServing, FLAGFALSE);
|
continue;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
Verbose("<master> login %s", pCLServing->acid->string);
|
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "ok\r\n", 4);
|
|
||||||
pCLServing->iState = S_NORMAL;
|
|
||||||
BuildString((char *)0, pCLServing->accmd);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((char *)0 != (pcArgs = strchr(pCLServing->accmd->string, ':'))) {
|
if ((char *)0 !=
|
||||||
*pcArgs++ = '\000';
|
(pcArgs = strchr(pCLServing->accmd->string, ':'))) {
|
||||||
} else if ((char *)0 !=
|
*pcArgs++ = '\000';
|
||||||
(pcArgs = strchr(pCLServing->accmd->string, ' '))) {
|
} else if ((char *)0 !=
|
||||||
*pcArgs++ = '\000';
|
(pcArgs = strchr(pCLServing->accmd->string, ' '))) {
|
||||||
}
|
*pcArgs++ = '\000';
|
||||||
if (pcArgs != (char *)0)
|
|
||||||
pcArgs = PruneSpace(pcArgs);
|
|
||||||
pcCmd = PruneSpace(pCLServing->accmd->string);
|
|
||||||
if (strcmp(pcCmd, "help") == 0) {
|
|
||||||
static char *apcHelp1[] = {
|
|
||||||
"exit disconnect\r\n",
|
|
||||||
"help this help message\r\n",
|
|
||||||
"login log in\r\n",
|
|
||||||
#if HAVE_OPENSSL
|
|
||||||
"ssl start ssl session\r\n",
|
|
||||||
#endif
|
|
||||||
(char *)0
|
|
||||||
};
|
|
||||||
static char *apcHelp2[] = {
|
|
||||||
"call provide port for given console\r\n",
|
|
||||||
"exit disconnect\r\n",
|
|
||||||
"groups provide ports for group leaders\r\n",
|
|
||||||
"help this help message\r\n",
|
|
||||||
"master provide a list of master servers\r\n",
|
|
||||||
"pid provide pid of master process\r\n",
|
|
||||||
"quit* terminate conserver (SIGTERM)\r\n",
|
|
||||||
"restart* restart conserver (SIGHUP)\r\n",
|
|
||||||
"version provide version info for server\r\n",
|
|
||||||
"* = requires admin privileges\r\n",
|
|
||||||
(char *)0
|
|
||||||
};
|
|
||||||
char **ppc;
|
|
||||||
for (ppc =
|
|
||||||
(pCLServing->iState == S_IDENT ? apcHelp1 : apcHelp2);
|
|
||||||
(char *)0 != *ppc; ++ppc) {
|
|
||||||
FileWrite(pCLServing->fd, FLAGTRUE, *ppc, -1);
|
|
||||||
}
|
}
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, (char *)0, 0);
|
if (pcArgs != (char *)0)
|
||||||
} else if (strcmp(pcCmd, "exit") == 0) {
|
pcArgs = PruneSpace(pcArgs);
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "goodbye\r\n", -1);
|
pcCmd = PruneSpace(pCLServing->accmd->string);
|
||||||
DropMasterClient(pCLServing, FLAGFALSE);
|
if (strcmp(pcCmd, "help") == 0) {
|
||||||
return;
|
static char *apcHelp1[] = {
|
||||||
|
"exit disconnect\r\n",
|
||||||
|
"help this help message\r\n",
|
||||||
|
"login log in\r\n",
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
} else if (pCLServing->iState == S_IDENT &&
|
"ssl start ssl session\r\n",
|
||||||
strcmp(pcCmd, "ssl") == 0) {
|
#endif
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "ok\r\n", -1);
|
(char *)0
|
||||||
if (!AttemptSSL(pCLServing)) {
|
};
|
||||||
|
static char *apcHelp2[] = {
|
||||||
|
"call provide port for given console\r\n",
|
||||||
|
"exit disconnect\r\n",
|
||||||
|
"groups provide ports for group leaders\r\n",
|
||||||
|
"help this help message\r\n",
|
||||||
|
"master provide a list of master servers\r\n",
|
||||||
|
"pid provide pid of master process\r\n",
|
||||||
|
"quit* terminate conserver (SIGTERM)\r\n",
|
||||||
|
"restart* restart conserver (SIGHUP)\r\n",
|
||||||
|
"version provide version info for server\r\n",
|
||||||
|
"* = requires admin privileges\r\n",
|
||||||
|
(char *)0
|
||||||
|
};
|
||||||
|
char **ppc;
|
||||||
|
for (ppc =
|
||||||
|
(pCLServing->iState == S_IDENT ? apcHelp1 : apcHelp2);
|
||||||
|
(char *)0 != *ppc; ++ppc) {
|
||||||
|
FileWrite(pCLServing->fd, FLAGTRUE, *ppc, -1);
|
||||||
|
}
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE, (char *)0, 0);
|
||||||
|
} else if (strcmp(pcCmd, "exit") == 0) {
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE, "goodbye\r\n", -1);
|
||||||
DropMasterClient(pCLServing, FLAGFALSE);
|
DropMasterClient(pCLServing, FLAGFALSE);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else if (pCLServing->iState == S_IDENT &&
|
|
||||||
strcmp(pcCmd, "login") == 0) {
|
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
if (config->sslrequired == FLAGTRUE &&
|
} else if (pCLServing->iState == S_IDENT &&
|
||||||
FileGetType(pCLServing->fd) != SSLSocket) {
|
strcmp(pcCmd, "ssl") == 0) {
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
FileWrite(pCLServing->fd, FLAGFALSE, "ok\r\n", -1);
|
||||||
"encryption required\r\n", -1);
|
if (!AttemptSSL(pCLServing)) {
|
||||||
} else {
|
DropMasterClient(pCLServing, FLAGFALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (pcArgs == (char *)0) {
|
} else if (pCLServing->iState == S_IDENT &&
|
||||||
|
strcmp(pcCmd, "login") == 0) {
|
||||||
|
#if HAVE_OPENSSL
|
||||||
|
if (config->sslrequired == FLAGTRUE &&
|
||||||
|
FileGetType(pCLServing->fd) != SSLSocket) {
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
"login requires argument\r\n", -1);
|
"encryption required\r\n", -1);
|
||||||
} else {
|
} else {
|
||||||
BuildString((char *)0, pCLServing->username);
|
|
||||||
BuildString((char *)0, pCLServing->acid);
|
|
||||||
BuildString(pcArgs, pCLServing->username);
|
|
||||||
BuildString(pcArgs, pCLServing->acid);
|
|
||||||
BuildStringChar('@', pCLServing->acid);
|
|
||||||
BuildString(pCLServing->peername->string,
|
|
||||||
pCLServing->acid);
|
|
||||||
if (pCLServing->caccess == 't' ||
|
|
||||||
CheckPasswd(pCLServing, "") == AUTH_SUCCESS) {
|
|
||||||
pCLServing->iState = S_NORMAL;
|
|
||||||
Verbose("<master> login %s",
|
|
||||||
pCLServing->acid->string);
|
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "ok\r\n", 4);
|
|
||||||
} else {
|
|
||||||
FilePrint(pCLServing->fd, FLAGFALSE,
|
|
||||||
"passwd? %s\r\n", myHostname);
|
|
||||||
pCLServing->iState = S_PASSWD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if HAVE_OPENSSL
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
if (pcArgs == (char *)0) {
|
||||||
strcmp(pcCmd, "master") == 0) {
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
int iSep = 1;
|
"login requires argument\r\n", -1);
|
||||||
|
} else {
|
||||||
if ((GRPENT *)0 != pGroups) {
|
BuildString((char *)0, pCLServing->username);
|
||||||
struct sockaddr_in lcl;
|
BuildString((char *)0, pCLServing->acid);
|
||||||
socklen_t so = sizeof(lcl);
|
BuildString(pcArgs, pCLServing->username);
|
||||||
if (-1 ==
|
BuildString(pcArgs, pCLServing->acid);
|
||||||
getsockname(FileFDNum(pCLServing->fd),
|
BuildStringChar('@', pCLServing->acid);
|
||||||
(struct sockaddr *)&lcl, &so)) {
|
BuildString(pCLServing->peername->string,
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
pCLServing->acid);
|
||||||
"getsockname failed, try again later\r\n",
|
if (pCLServing->caccess == 't' ||
|
||||||
-1);
|
CheckPasswd(pCLServing, "") == AUTH_SUCCESS) {
|
||||||
Error("Master(): getsockname(%u): %s",
|
pCLServing->iState = S_NORMAL;
|
||||||
FileFDNum(pCLServing->fd), strerror(errno));
|
Verbose("<master> login %s",
|
||||||
Bye(EX_OSERR);
|
pCLServing->acid->string);
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE, "ok\r\n",
|
||||||
|
4);
|
||||||
|
} else {
|
||||||
|
FilePrint(pCLServing->fd, FLAGFALSE,
|
||||||
|
"passwd? %s\r\n", myHostname);
|
||||||
|
pCLServing->iState = S_PASSWD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if HAVE_OPENSSL
|
||||||
}
|
}
|
||||||
FilePrint(pCLServing->fd, FLAGTRUE, "@%s",
|
#endif
|
||||||
inet_ntoa(lcl.sin_addr));
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
iSep = 0;
|
strcmp(pcCmd, "master") == 0) {
|
||||||
}
|
int iSep = 1;
|
||||||
if (config->redirect == FLAGTRUE) {
|
|
||||||
REMOTE *pRC;
|
if ((GRPENT *)0 != pGroups) {
|
||||||
for (pRC = pRCUniq; (REMOTE *)0 != pRC; pRC = pRC->pRCuniq) {
|
struct sockaddr_in lcl;
|
||||||
FilePrint(pCLServing->fd, FLAGTRUE, ":@%s" + iSep,
|
socklen_t so = sizeof(lcl);
|
||||||
pRC->rhost);
|
if (-1 ==
|
||||||
|
getsockname(FileFDNum(pCLServing->fd),
|
||||||
|
(struct sockaddr *)&lcl, &so)) {
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
|
"getsockname failed, try again later\r\n",
|
||||||
|
-1);
|
||||||
|
Error("Master(): getsockname(%u): %s",
|
||||||
|
FileFDNum(pCLServing->fd), strerror(errno));
|
||||||
|
Bye(EX_OSERR);
|
||||||
|
}
|
||||||
|
FilePrint(pCLServing->fd, FLAGTRUE, "@%s",
|
||||||
|
inet_ntoa(lcl.sin_addr));
|
||||||
iSep = 0;
|
iSep = 0;
|
||||||
}
|
}
|
||||||
}
|
if (config->redirect == FLAGTRUE) {
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "\r\n", -1);
|
REMOTE *pRC;
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
for (pRC = pRCUniq; (REMOTE *)0 != pRC;
|
||||||
strcmp(pcCmd, "pid") == 0) {
|
pRC = pRC->pRCuniq) {
|
||||||
FilePrint(pCLServing->fd, FLAGFALSE, "%lu\r\n",
|
FilePrint(pCLServing->fd, FLAGTRUE, ":@%s" + iSep,
|
||||||
(unsigned long)thepid);
|
pRC->rhost);
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
iSep = 0;
|
||||||
strcmp(pcCmd, "version") == 0) {
|
}
|
||||||
FilePrint(pCLServing->fd, FLAGFALSE, "version `%s'\r\n",
|
}
|
||||||
THIS_VERSION);
|
FileWrite(pCLServing->fd, FLAGFALSE, "\r\n", -1);
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
strcmp(pcCmd, "quit") == 0) {
|
strcmp(pcCmd, "pid") == 0) {
|
||||||
if (ConsentUserOk(pADList, pCLServing->username->string) == 1) {
|
FilePrint(pCLServing->fd, FLAGFALSE, "%lu\r\n",
|
||||||
Verbose("quit command by %s", pCLServing->acid->string);
|
(unsigned long)thepid);
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
"ok -- terminated\r\n", -1);
|
strcmp(pcCmd, "version") == 0) {
|
||||||
DropMasterClient(pCLServing, FLAGFALSE);
|
FilePrint(pCLServing->fd, FLAGFALSE, "version `%s'\r\n",
|
||||||
kill(thepid, SIGTERM);
|
THIS_VERSION);
|
||||||
return;
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
} else
|
strcmp(pcCmd, "quit") == 0) {
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
if (ConsentUserOk(pADList, pCLServing->username->string) ==
|
||||||
"unauthorized command\r\n", -1);
|
1) {
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
Verbose("quit command by %s",
|
||||||
strcmp(pcCmd, "restart") == 0) {
|
pCLServing->acid->string);
|
||||||
if (ConsentUserOk(pADList, pCLServing->username->string) == 1) {
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
"ok -- terminated\r\n", -1);
|
||||||
"ok -- restarting\r\n", -1);
|
DropMasterClient(pCLServing, FLAGFALSE);
|
||||||
Verbose("restart command by %s", pCLServing->acid->string);
|
kill(thepid, SIGTERM);
|
||||||
kill(thepid, SIGHUP);
|
return;
|
||||||
} else
|
} else
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
"unauthorized command\r\n", -1);
|
"unauthorized command\r\n", -1);
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
strcmp(pcCmd, "groups") == 0) {
|
strcmp(pcCmd, "restart") == 0) {
|
||||||
int iSep = 1;
|
if (ConsentUserOk(pADList, pCLServing->username->string) ==
|
||||||
GRPENT *pGE;
|
1) {
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
|
"ok -- restarting\r\n", -1);
|
||||||
|
Verbose("restart command by %s",
|
||||||
|
pCLServing->acid->string);
|
||||||
|
kill(thepid, SIGHUP);
|
||||||
|
} else
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
|
"unauthorized command\r\n", -1);
|
||||||
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
|
strcmp(pcCmd, "groups") == 0) {
|
||||||
|
int iSep = 1;
|
||||||
|
GRPENT *pGE;
|
||||||
|
|
||||||
for (pGE = pGroups; pGE != (GRPENT *)0; pGE = pGE->pGEnext) {
|
for (pGE = pGroups; pGE != (GRPENT *)0; pGE = pGE->pGEnext) {
|
||||||
if (0 == pGE->imembers)
|
if (0 == pGE->imembers)
|
||||||
continue;
|
continue;
|
||||||
FilePrint(pCLServing->fd, FLAGTRUE, ":%hu" + iSep,
|
FilePrint(pCLServing->fd, FLAGTRUE, ":%hu" + iSep,
|
||||||
pGE->port);
|
pGE->port);
|
||||||
iSep = 0;
|
iSep = 0;
|
||||||
|
}
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE, "\r\n", 2);
|
||||||
|
} else if (pCLServing->iState == S_NORMAL &&
|
||||||
|
strcmp(pcCmd, "call") == 0) {
|
||||||
|
if (pcArgs == (char *)0)
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE,
|
||||||
|
"call requires argument\r\n", -1);
|
||||||
|
else
|
||||||
|
CommandCall(pCLServing, pcArgs);
|
||||||
|
} else {
|
||||||
|
FileWrite(pCLServing->fd, FLAGFALSE, "unknown command\r\n",
|
||||||
|
-1);
|
||||||
}
|
}
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "\r\n", 2);
|
BuildString((char *)0, pCLServing->accmd);
|
||||||
} else if (pCLServing->iState == S_NORMAL &&
|
|
||||||
strcmp(pcCmd, "call") == 0) {
|
|
||||||
if (pcArgs == (char *)0)
|
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE,
|
|
||||||
"call requires argument\r\n", -1);
|
|
||||||
else
|
|
||||||
CommandCall(pCLServing, pcArgs);
|
|
||||||
} else {
|
|
||||||
FileWrite(pCLServing->fd, FLAGFALSE, "unknown command\r\n",
|
|
||||||
-1);
|
|
||||||
}
|
}
|
||||||
BuildString((char *)0, pCLServing->accmd);
|
nr -= l;
|
||||||
|
MemMove(acIn, acIn + l, nr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,9 +885,10 @@ Master()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set to non-blocking and wrap in a File object */
|
/* set to non-blocking and wrap in a File object */
|
||||||
if (SetFlags(cfd, O_NONBLOCK, 0))
|
if (SetFlags(cfd, O_NONBLOCK, 0)) {
|
||||||
pCLmfree->fd = FileOpenFD(cfd, simpleSocket);
|
pCLmfree->fd = FileOpenFD(cfd, simpleSocket);
|
||||||
else
|
FileSetQuoteIAC(pCLmfree->fd, FLAGTRUE);
|
||||||
|
} else
|
||||||
pCLmfree->fd = (CONSFILE *)0;
|
pCLmfree->fd = (CONSFILE *)0;
|
||||||
|
|
||||||
if ((CONSFILE *)0 == pCLmfree->fd) {
|
if ((CONSFILE *)0 == pCLmfree->fd) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: readcfg.c,v 5.160 2003/12/01 02:15:18 bryan Exp $
|
* $Id: readcfg.c,v 5.162 2003/12/21 16:23:02 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -653,7 +653,7 @@ ApplyDefault(d, c)
|
|||||||
CONSENT *c;
|
CONSENT *c;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (d->type != UNKNOWN)
|
if (d->type != UNKNOWNTYPE)
|
||||||
c->type = d->type;
|
c->type = d->type;
|
||||||
if (d->breakNum != 0)
|
if (d->breakNum != 0)
|
||||||
c->breakNum = d->breakNum;
|
c->breakNum = d->breakNum;
|
||||||
@ -1684,6 +1684,41 @@ DefaultItemPortinc(id)
|
|||||||
ProcessPortinc(parserDefaultTemp, id);
|
ProcessPortinc(parserDefaultTemp, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
#if PROTOTYPES
|
||||||
|
ProcessProtocol(CONSENT *c, char *id)
|
||||||
|
#else
|
||||||
|
ProcessProtocol(c, id)
|
||||||
|
CONSENT *c;
|
||||||
|
char *id;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
c->raw = 0;
|
||||||
|
if ((id == (char *)0) || (*id == '\000'))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (strcmp(id, "telnet") == 0)
|
||||||
|
return;
|
||||||
|
if (strcmp(id, "raw") == 0) {
|
||||||
|
c->raw = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isMaster)
|
||||||
|
Error("invalid protocol name `%s' [%s:%d]", id, file, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
#if PROTOTYPES
|
||||||
|
DefaultItemProtocol(char *id)
|
||||||
|
#else
|
||||||
|
DefaultItemProtocol(id)
|
||||||
|
char *id;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
CONDDEBUG((1, "DefaultItemProtocol(%s) [%s:%d]", id, file, line));
|
||||||
|
ProcessProtocol(parserDefaultTemp, id);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
#if PROTOTYPES
|
#if PROTOTYPES
|
||||||
ProcessIdletimeout(CONSENT *c, char *id)
|
ProcessIdletimeout(CONSENT *c, char *id)
|
||||||
@ -1953,7 +1988,7 @@ ProcessType(c, id)
|
|||||||
char *id;
|
char *id;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
CONSTYPE t = UNKNOWN;
|
CONSTYPE t = UNKNOWNTYPE;
|
||||||
if ((id == (char *)0) || (*id == '\000')) {
|
if ((id == (char *)0) || (*id == '\000')) {
|
||||||
c->type = t;
|
c->type = t;
|
||||||
return;
|
return;
|
||||||
@ -1964,7 +1999,7 @@ ProcessType(c, id)
|
|||||||
t = EXEC;
|
t = EXEC;
|
||||||
else if (strcasecmp("host", id) == 0)
|
else if (strcasecmp("host", id) == 0)
|
||||||
t = HOST;
|
t = HOST;
|
||||||
if (t == UNKNOWN) {
|
if (t == UNKNOWNTYPE) {
|
||||||
if (isMaster)
|
if (isMaster)
|
||||||
Error("invalid console type `%s' [%s:%d]", id, file, line);
|
Error("invalid console type `%s' [%s:%d]", id, file, line);
|
||||||
} else
|
} else
|
||||||
@ -2119,7 +2154,7 @@ ConsoleEnd()
|
|||||||
invalid = 1;
|
invalid = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UNKNOWN:
|
case UNKNOWNTYPE:
|
||||||
if (isMaster)
|
if (isMaster)
|
||||||
Error("[%s] console type unknown [%s:%d]",
|
Error("[%s] console type unknown [%s:%d]",
|
||||||
parserConsoleTemp->server, file, line);
|
parserConsoleTemp->server, file, line);
|
||||||
@ -2697,16 +2732,17 @@ ConsoleAdd(c)
|
|||||||
closeMatch = 0;
|
closeMatch = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UNKNOWN:
|
case UNKNOWNTYPE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* and now the rest (minus the "runtime" members - see below) */
|
/* and now the rest (minus the "runtime" members - see below) */
|
||||||
pCEmatch->idletimeout = c->idletimeout;
|
pCEmatch->idletimeout = c->idletimeout;
|
||||||
if (pCEmatch->idletimeout != (time_t)0 &&
|
if (pCEmatch->idletimeout != (time_t)0 &&
|
||||||
(timers[T_IDLE] == (time_t)0 ||
|
(timers[T_CIDLE] == (time_t)0 ||
|
||||||
timers[T_IDLE] > pCEmatch->lastWrite + pCEmatch->idletimeout))
|
timers[T_CIDLE] >
|
||||||
timers[T_IDLE] = pCEmatch->lastWrite + pCEmatch->idletimeout;
|
pCEmatch->lastWrite + pCEmatch->idletimeout))
|
||||||
|
timers[T_CIDLE] = pCEmatch->lastWrite + pCEmatch->idletimeout;
|
||||||
|
|
||||||
pCEmatch->logfilemax = c->logfilemax;
|
pCEmatch->logfilemax = c->logfilemax;
|
||||||
if (pCEmatch->logfilemax != (off_t) 0 &&
|
if (pCEmatch->logfilemax != (off_t) 0 &&
|
||||||
@ -3278,6 +3314,18 @@ ConsoleItemPortinc(id)
|
|||||||
ProcessPortinc(parserConsoleTemp, id);
|
ProcessPortinc(parserConsoleTemp, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
#if PROTOTYPES
|
||||||
|
ConsoleItemProtocol(char *id)
|
||||||
|
#else
|
||||||
|
ConsoleItemProtocol(id)
|
||||||
|
char *id;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
CONDDEBUG((1, "ConsoleItemProtocol(%s) [%s:%d]", id, file, line));
|
||||||
|
ProcessProtocol(parserConsoleTemp, id);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
#if PROTOTYPES
|
#if PROTOTYPES
|
||||||
ConsoleItemIdletimeout(char *id)
|
ConsoleItemIdletimeout(char *id)
|
||||||
@ -4263,6 +4311,7 @@ ITEM keyDefault[] = {
|
|||||||
{"port", DefaultItemPort},
|
{"port", DefaultItemPort},
|
||||||
{"portbase", DefaultItemPortbase},
|
{"portbase", DefaultItemPortbase},
|
||||||
{"portinc", DefaultItemPortinc},
|
{"portinc", DefaultItemPortinc},
|
||||||
|
{"protocol", DefaultItemProtocol},
|
||||||
{"ro", DefaultItemRo},
|
{"ro", DefaultItemRo},
|
||||||
{"rw", DefaultItemRw},
|
{"rw", DefaultItemRw},
|
||||||
{"timestamp", DefaultItemTimestamp},
|
{"timestamp", DefaultItemTimestamp},
|
||||||
@ -4293,6 +4342,7 @@ ITEM keyConsole[] = {
|
|||||||
{"port", ConsoleItemPort},
|
{"port", ConsoleItemPort},
|
||||||
{"portbase", ConsoleItemPortbase},
|
{"portbase", ConsoleItemPortbase},
|
||||||
{"portinc", ConsoleItemPortinc},
|
{"portinc", ConsoleItemPortinc},
|
||||||
|
{"protocol", ConsoleItemProtocol},
|
||||||
{"ro", ConsoleItemRo},
|
{"ro", ConsoleItemRo},
|
||||||
{"rw", ConsoleItemRw},
|
{"rw", ConsoleItemRw},
|
||||||
{"timestamp", ConsoleItemTimestamp},
|
{"timestamp", ConsoleItemTimestamp},
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: version.h,v 1.55 2003/12/10 18:33:48 bryan Exp $
|
* $Id: version.h,v 1.56 2003/12/20 06:11:53 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -14,4 +14,4 @@
|
|||||||
@(#) Copyright 2000 conserver.com.\n\
|
@(#) Copyright 2000 conserver.com.\n\
|
||||||
All rights reserved.\n"
|
All rights reserved.\n"
|
||||||
|
|
||||||
#define THIS_VERSION "conserver.com version 8.0.9"
|
#define THIS_VERSION "conserver.com version 8.1.0"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: console.c,v 5.152 2003/11/28 00:47:30 bryan Exp $
|
* $Id: console.c,v 5.155 2004/01/08 16:12:46 bryan Exp $
|
||||||
*
|
*
|
||||||
* Copyright conserver.com, 2000
|
* Copyright conserver.com, 2000
|
||||||
*
|
*
|
||||||
@ -193,7 +193,7 @@ Usage(wantfull)
|
|||||||
"D enable debug output, sent to stderr",
|
"D enable debug output, sent to stderr",
|
||||||
"e esc set the initial escape characters",
|
"e esc set the initial escape characters",
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
"E don't require encrypted connections",
|
"E don't attempt encrypted connections",
|
||||||
#else
|
#else
|
||||||
"E ignored - encryption not compiled into code",
|
"E ignored - encryption not compiled into code",
|
||||||
#endif
|
#endif
|
||||||
@ -573,6 +573,7 @@ ReadReply(fd)
|
|||||||
BuildString((char *)0, result);
|
BuildString((char *)0, result);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
int l;
|
||||||
switch (nr = FileRead(fd, buf, sizeof(buf))) {
|
switch (nr = FileRead(fd, buf, sizeof(buf))) {
|
||||||
case 0:
|
case 0:
|
||||||
/* fall through */
|
/* fall through */
|
||||||
@ -583,6 +584,13 @@ ReadReply(fd)
|
|||||||
Error("lost connection");
|
Error("lost connection");
|
||||||
Bye(EX_UNAVAILABLE);
|
Bye(EX_UNAVAILABLE);
|
||||||
default:
|
default:
|
||||||
|
while ((l = ParseIACBuf(fd, buf, &nr)) >= 0) {
|
||||||
|
if (l == 0)
|
||||||
|
continue;
|
||||||
|
BuildStringN(buf, l, result);
|
||||||
|
nr -= l;
|
||||||
|
MemMove(buf, buf + l, nr);
|
||||||
|
}
|
||||||
BuildStringN(buf, nr, result);
|
BuildStringN(buf, nr, result);
|
||||||
if (toEOF) /* if toEOF, read until EOF */
|
if (toEOF) /* if toEOF, read until EOF */
|
||||||
continue;
|
continue;
|
||||||
@ -604,119 +612,6 @@ ReadReply(fd)
|
|||||||
return result->string;
|
return result->string;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int SawUrg = 0;
|
|
||||||
|
|
||||||
/* when the conserver program gets the suspend sequence it will send us
|
|
||||||
* an out of band command to suspend ourself. We just tell the reader
|
|
||||||
* routine we saw one
|
|
||||||
*/
|
|
||||||
RETSIGTYPE
|
|
||||||
#if PROTOTYPES
|
|
||||||
OOB(int sig)
|
|
||||||
#else
|
|
||||||
OOB(sig)
|
|
||||||
int sig;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
++SawUrg;
|
|
||||||
#if !HAVE_SIGACTION
|
|
||||||
#if defined(SIGURG)
|
|
||||||
SimpleSignal(SIGURG, OOB);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
#if PROTOTYPES
|
|
||||||
ProcessUrgentData(CONSFILE *pcf)
|
|
||||||
#else
|
|
||||||
ProcessUrgentData(pcf)
|
|
||||||
CONSFILE *pcf;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
static char acCmd;
|
|
||||||
int s;
|
|
||||||
|
|
||||||
SawUrg = 0;
|
|
||||||
s = FileFDNum(pcf);
|
|
||||||
|
|
||||||
/* get the pending urgent message
|
|
||||||
*/
|
|
||||||
while (recv(s, &acCmd, 1, MSG_OOB) < 0) {
|
|
||||||
switch (errno) {
|
|
||||||
case EWOULDBLOCK:
|
|
||||||
/* clear any pending input to make room */
|
|
||||||
read(s, &acCmd, 1);
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, ".", 1);
|
|
||||||
continue;
|
|
||||||
case EINVAL:
|
|
||||||
default:
|
|
||||||
Error("recv(%d): %s\r", s, strerror(errno));
|
|
||||||
sleep(1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (acCmd) {
|
|
||||||
case OB_EXEC:
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, "exec: ", 6);
|
|
||||||
BuildString((char *)0, execCmd);
|
|
||||||
for (;;) {
|
|
||||||
char c;
|
|
||||||
if (read(0, &c, 1) == 0)
|
|
||||||
break;
|
|
||||||
if (c == '\n' || c == '\r') {
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, "]\r\n", 3);
|
|
||||||
if (execCmd->used <= 1) {
|
|
||||||
char s = OB_DROP;
|
|
||||||
FileWrite(pcf, FLAGFALSE, &s, 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (c == '\a' || (c >= ' ' && c <= '~')) {
|
|
||||||
BuildStringChar(c, execCmd);
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, &c, 1);
|
|
||||||
} else if ((c == '\b' || c == 0x7f) && execCmd->used > 1) {
|
|
||||||
if (execCmd->string[execCmd->used - 2] != '\a') {
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, "\b \b", 3);
|
|
||||||
}
|
|
||||||
execCmd->string[execCmd->used - 2] = '\000';
|
|
||||||
execCmd->used--;
|
|
||||||
} else if ((c == 0x15) && execCmd->used > 1) {
|
|
||||||
while (execCmd->used > 1) {
|
|
||||||
if (execCmd->string[execCmd->used - 2] != '\a') {
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, "\b \b", 3);
|
|
||||||
}
|
|
||||||
execCmd->string[execCmd->used - 2] = '\000';
|
|
||||||
execCmd->used--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OB_SUSP:
|
|
||||||
#if defined(SIGSTOP)
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, "stop]", 5);
|
|
||||||
C2Cooked();
|
|
||||||
kill(getpid(), SIGSTOP);
|
|
||||||
C2Raw();
|
|
||||||
FileWrite(cfstdout, FLAGFALSE,
|
|
||||||
"[press any character to continue", 32);
|
|
||||||
#else
|
|
||||||
FileWrite(cfstdout, FLAGFALSE,
|
|
||||||
"stop not supported -- press any character to continue",
|
|
||||||
53);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case OB_DROP:
|
|
||||||
FileWrite(cfstdout, FLAGFALSE, "dropped by server]\r\n", 20);
|
|
||||||
C2Cooked();
|
|
||||||
Bye(EX_UNAVAILABLE);
|
|
||||||
/*NOTREACHED*/ default:
|
|
||||||
Error("unknown out of band command `%c\'\r", acCmd);
|
|
||||||
fflush(stderr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
#if PROTOTYPES
|
#if PROTOTYPES
|
||||||
ReapVirt(void)
|
ReapVirt(void)
|
||||||
@ -846,9 +741,6 @@ ExecCmd()
|
|||||||
|
|
||||||
/* put the signals back that we ignore (trapped auto-reset to default)
|
/* put the signals back that we ignore (trapped auto-reset to default)
|
||||||
*/
|
*/
|
||||||
#if defined(SIGURG)
|
|
||||||
SimpleSignal(SIGURG, SIG_DFL);
|
|
||||||
#endif
|
|
||||||
SimpleSignal(SIGPIPE, SIG_DFL);
|
SimpleSignal(SIGPIPE, SIG_DFL);
|
||||||
SimpleSignal(SIGCHLD, SIG_DFL);
|
SimpleSignal(SIGCHLD, SIG_DFL);
|
||||||
|
|
||||||
@ -867,10 +759,10 @@ ExecCmd()
|
|||||||
iNewGrp = setsid();
|
iNewGrp = setsid();
|
||||||
if (-1 == iNewGrp) {
|
if (-1 == iNewGrp) {
|
||||||
Error("ExecCmd(): setsid(): %s", strerror(errno));
|
Error("ExecCmd(): setsid(): %s", strerror(errno));
|
||||||
iNewGrp = getpid();
|
iNewGrp = thepid;
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
iNewGrp = getpid();
|
iNewGrp = thepid;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (dup(pout[0]) != 0 || dup(pin[1]) != 1) {
|
if (dup(pout[0]) != 0 || dup(pin[1]) != 1) {
|
||||||
@ -890,6 +782,84 @@ ExecCmd()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
#if PROTOTYPES
|
||||||
|
DoExec(CONSFILE *pcf)
|
||||||
|
#else
|
||||||
|
DoExec(pcf)
|
||||||
|
CONSFILE *pcf;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, "exec: ", 6);
|
||||||
|
BuildString((char *)0, execCmd);
|
||||||
|
for (;;) {
|
||||||
|
char c;
|
||||||
|
if (read(0, &c, 1) == 0)
|
||||||
|
break;
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, "]\r\n", 3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c == '\a' || (c >= ' ' && c <= '~')) {
|
||||||
|
BuildStringChar(c, execCmd);
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, &c, 1);
|
||||||
|
} else if ((c == '\b' || c == 0x7f) && execCmd->used > 1) {
|
||||||
|
if (execCmd->string[execCmd->used - 2] != '\a') {
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, "\b \b", 3);
|
||||||
|
}
|
||||||
|
execCmd->string[execCmd->used - 2] = '\000';
|
||||||
|
execCmd->used--;
|
||||||
|
} else if ((c == 0x15) && execCmd->used > 1) {
|
||||||
|
while (execCmd->used > 1) {
|
||||||
|
if (execCmd->string[execCmd->used - 2] != '\a') {
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, "\b \b", 3);
|
||||||
|
}
|
||||||
|
execCmd->string[execCmd->used - 2] = '\000';
|
||||||
|
execCmd->used--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (execCmd != (STRING *)0 && execCmd->used > 1) {
|
||||||
|
ExecCmd();
|
||||||
|
BuildString((char *)0, execCmd);
|
||||||
|
if (execCmdFile == (CONSFILE *)0) { /* exec failed */
|
||||||
|
/* say forget it */
|
||||||
|
FileSetQuoteIAC(pcf, FLAGFALSE);
|
||||||
|
FilePrint(pcf, FLAGFALSE, "%c%c", OB_IAC, OB_ABRT);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGTRUE);
|
||||||
|
} else {
|
||||||
|
char *r;
|
||||||
|
/* go back to blocking mode */
|
||||||
|
SetFlags(FileFDNum(pcf), 0, O_NONBLOCK);
|
||||||
|
/* say we're ready */
|
||||||
|
FileSetQuoteIAC(pcf, FLAGFALSE);
|
||||||
|
FilePrint(pcf, FLAGFALSE, "%c%c", OB_IAC, OB_EXEC);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGTRUE);
|
||||||
|
r = ReadReply(pcf, 0);
|
||||||
|
/* now back to non-blocking, now that we've got reply */
|
||||||
|
SetFlags(FileFDNum(pcf), O_NONBLOCK, 0);
|
||||||
|
/* if we aren't still r/w, abort */
|
||||||
|
if (strncmp(r, "[rw]", 4) != 0) {
|
||||||
|
FileWrite(cfstdout, FLAGFALSE,
|
||||||
|
"[no longer read-write - aborting command]\r\n",
|
||||||
|
-1);
|
||||||
|
FD_CLR(FileFDNum(execCmdFile), &rinit);
|
||||||
|
FD_CLR(FileFDOutNum(execCmdFile), &winit);
|
||||||
|
FileClose(&execCmdFile);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGFALSE);
|
||||||
|
FilePrint(pcf, FLAGFALSE, "%c%c", OB_IAC, OB_ABRT);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGTRUE);
|
||||||
|
kill(execCmdPid, SIGHUP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* say forget it */
|
||||||
|
FileSetQuoteIAC(pcf, FLAGFALSE);
|
||||||
|
FilePrint(pcf, FLAGFALSE, "%c%c", OB_IAC, OB_ABRT);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGTRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* interact with a group server (ksb)
|
/* interact with a group server (ksb)
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
@ -906,7 +876,7 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
int fIn = '-';
|
int fIn = '-';
|
||||||
fd_set rmask, wmask;
|
fd_set rmask, wmask;
|
||||||
int i;
|
int i;
|
||||||
int justProcessedUrg = 0;
|
int justSuspended = 0;
|
||||||
char *r = (char *)0;
|
char *r = (char *)0;
|
||||||
static char acMesg[8192];
|
static char acMesg[8192];
|
||||||
|
|
||||||
@ -915,9 +885,9 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
}
|
}
|
||||||
#if !defined(__CYGWIN__)
|
#if !defined(__CYGWIN__)
|
||||||
# if defined(F_SETOWN)
|
# if defined(F_SETOWN)
|
||||||
if (fcntl(FileFDNum(pcf), F_SETOWN, getpid()) == -1) {
|
if (fcntl(FileFDNum(pcf), F_SETOWN, thepid) == -1) {
|
||||||
Error("fcntl(F_SETOWN,%d): %d: %s", getpid(), FileFDNum(pcf),
|
Error("fcntl(F_SETOWN,%lu): %d: %s", (unsigned long)thepid,
|
||||||
strerror(errno));
|
FileFDNum(pcf), strerror(errno));
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
# if defined(SIOCSPGRP)
|
# if defined(SIOCSPGRP)
|
||||||
@ -925,7 +895,7 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
int iTemp;
|
int iTemp;
|
||||||
/* on the HP-UX systems if different
|
/* on the HP-UX systems if different
|
||||||
*/
|
*/
|
||||||
iTemp = -getpid();
|
iTemp = -thepid;
|
||||||
if (ioctl(FileFDNum(pcf), SIOCSPGRP, &iTemp) == -1) {
|
if (ioctl(FileFDNum(pcf), SIOCSPGRP, &iTemp) == -1) {
|
||||||
Error("ioctl(%d,SIOCSPGRP): %s", FileFDNum(pcf),
|
Error("ioctl(%d,SIOCSPGRP): %s", FileFDNum(pcf),
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
@ -933,9 +903,6 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
|
||||||
#if defined(SIGURG)
|
|
||||||
SimpleSignal(SIGURG, OOB);
|
|
||||||
#endif
|
#endif
|
||||||
SimpleSignal(SIGCHLD, FlagReapVirt);
|
SimpleSignal(SIGCHLD, FlagReapVirt);
|
||||||
|
|
||||||
@ -1048,38 +1015,7 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
if (maxfd < FileFDNum(pcf) + 1)
|
if (maxfd < FileFDNum(pcf) + 1)
|
||||||
maxfd = FileFDNum(pcf) + 1;
|
maxfd = FileFDNum(pcf) + 1;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
justProcessedUrg = 0;
|
justSuspended = 0;
|
||||||
if (SawUrg) {
|
|
||||||
ProcessUrgentData(pcf);
|
|
||||||
justProcessedUrg = 1;
|
|
||||||
}
|
|
||||||
if (execCmd != (STRING *)0 && execCmd->used > 1) {
|
|
||||||
char *r;
|
|
||||||
char s = OB_EXEC;
|
|
||||||
ExecCmd();
|
|
||||||
BuildString((char *)0, execCmd);
|
|
||||||
if (execCmdFile == (CONSFILE *)0) { /* exec failed */
|
|
||||||
s = OB_DROP;
|
|
||||||
FileWrite(pcf, FLAGFALSE, &s, 1); /* say forget it */
|
|
||||||
} else {
|
|
||||||
/* go back to blocking mode */
|
|
||||||
SetFlags(FileFDNum(pcf), 0, O_NONBLOCK);
|
|
||||||
FileWrite(pcf, FLAGFALSE, &s, 1); /* say we're ready */
|
|
||||||
r = ReadReply(pcf, 0);
|
|
||||||
/* now back to non-blocking now that we've got reply */
|
|
||||||
SetFlags(FileFDNum(pcf), O_NONBLOCK, 0);
|
|
||||||
/* if we aren't still r/w, abort */
|
|
||||||
if (strncmp(r, "[rw]", 4) != 0) {
|
|
||||||
FileWrite(cfstdout, FLAGFALSE,
|
|
||||||
"[no longer read-write - aborting command]\r\n",
|
|
||||||
-1);
|
|
||||||
FD_CLR(FileFDNum(execCmdFile), &rinit);
|
|
||||||
FD_CLR(FileFDOutNum(execCmdFile), &winit);
|
|
||||||
FileClose(&execCmdFile);
|
|
||||||
kill(execCmdPid, SIGHUP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fSawReapVirt) {
|
if (fSawReapVirt) {
|
||||||
fSawReapVirt = 0;
|
fSawReapVirt = 0;
|
||||||
ReapVirt();
|
ReapVirt();
|
||||||
@ -1106,6 +1042,9 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
FD_CLR(FileFDNum(execCmdFile), &rinit);
|
FD_CLR(FileFDNum(execCmdFile), &rinit);
|
||||||
FD_CLR(FileFDOutNum(execCmdFile), &winit);
|
FD_CLR(FileFDOutNum(execCmdFile), &winit);
|
||||||
FileClose(&execCmdFile);
|
FileClose(&execCmdFile);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGFALSE);
|
||||||
|
FilePrint(pcf, FLAGFALSE, "%c%c", OB_IAC, OB_ABRT);
|
||||||
|
FileSetQuoteIAC(pcf, FLAGTRUE);
|
||||||
} else {
|
} else {
|
||||||
if (fStrip) {
|
if (fStrip) {
|
||||||
for (i = 0; i < nc; ++i)
|
for (i = 0; i < nc; ++i)
|
||||||
@ -1126,21 +1065,46 @@ CallUp(pcf, pcMaster, pcMach, pcHow, result)
|
|||||||
|
|
||||||
/* anything from socket? */
|
/* anything from socket? */
|
||||||
if (FileCanRead(pcf, &rmask, &wmask)) {
|
if (FileCanRead(pcf, &rmask, &wmask)) {
|
||||||
|
int l;
|
||||||
if ((nc = FileRead(pcf, acMesg, sizeof(acMesg))) < 0) {
|
if ((nc = FileRead(pcf, acMesg, sizeof(acMesg))) < 0) {
|
||||||
/* if we got an error/eof after returning from suspend */
|
/* if we got an error/eof after returning from suspend */
|
||||||
if (justProcessedUrg) {
|
if (justSuspended) {
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
Error("lost connection");
|
Error("lost connection");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (fStrip) {
|
while ((l = ParseIACBuf(pcf, acMesg, &nc)) >= 0) {
|
||||||
for (i = 0; i < nc; ++i)
|
if (l == 0) {
|
||||||
acMesg[i] &= 127;
|
if (FileSawQuoteExec(pcf) == FLAGTRUE)
|
||||||
}
|
DoExec(pcf);
|
||||||
FileWrite(cfstdout, FLAGFALSE, acMesg, nc);
|
if (FileSawQuoteSusp(pcf) == FLAGTRUE) {
|
||||||
if (execCmdFile != (CONSFILE *)0) {
|
justSuspended = 1;
|
||||||
FileWrite(execCmdFile, FLAGFALSE, acMesg, nc);
|
#if defined(SIGSTOP)
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, "stop]", 5);
|
||||||
|
C2Cooked();
|
||||||
|
kill(thepid, SIGSTOP);
|
||||||
|
C2Raw();
|
||||||
|
FileWrite(cfstdout, FLAGFALSE,
|
||||||
|
"[press any character to continue", 32);
|
||||||
|
#else
|
||||||
|
FileWrite(cfstdout, FLAGFALSE,
|
||||||
|
"stop not supported -- press any character to continue",
|
||||||
|
53);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (fStrip) {
|
||||||
|
for (i = 0; i < l; ++i)
|
||||||
|
acMesg[i] &= 127;
|
||||||
|
}
|
||||||
|
FileWrite(cfstdout, FLAGFALSE, acMesg, l);
|
||||||
|
if (execCmdFile != (CONSFILE *)0) {
|
||||||
|
FileWrite(execCmdFile, FLAGFALSE, acMesg, l);
|
||||||
|
}
|
||||||
|
nc -= l;
|
||||||
|
MemMove(acMesg, acMesg + l, nc);
|
||||||
}
|
}
|
||||||
} else if (!FileBufEmpty(pcf) && FileCanWrite(pcf, &rmask, &wmask)) {
|
} else if (!FileBufEmpty(pcf) && FileCanWrite(pcf, &rmask, &wmask)) {
|
||||||
CONDDEBUG((1, "CallUp(): flushing fd %d", FileFDNum(pcf)));
|
CONDDEBUG((1, "CallUp(): flushing fd %d", FileFDNum(pcf)));
|
||||||
@ -1255,6 +1219,8 @@ DoCmds(master, ports, cmdi)
|
|||||||
if ((pcf = GetPort(server, port)) == (CONSFILE *)0)
|
if ((pcf = GetPort(server, port)) == (CONSFILE *)0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
FileSetQuoteIAC(pcf, FLAGTRUE);
|
||||||
|
|
||||||
t = ReadReply(pcf, 0);
|
t = ReadReply(pcf, 0);
|
||||||
if (strcmp(t, "ok\r\n") != 0) {
|
if (strcmp(t, "ok\r\n") != 0) {
|
||||||
FileClose(&pcf);
|
FileClose(&pcf);
|
||||||
@ -1262,15 +1228,17 @@ DoCmds(master, ports, cmdi)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
FileWrite(pcf, FLAGFALSE, "ssl\r\n", 5);
|
if (fReqEncryption) {
|
||||||
t = ReadReply(pcf, 0);
|
FileWrite(pcf, FLAGFALSE, "ssl\r\n", 5);
|
||||||
if (strcmp(t, "ok\r\n") == 0) {
|
t = ReadReply(pcf, 0);
|
||||||
AttemptSSL(pcf);
|
if (strcmp(t, "ok\r\n") == 0) {
|
||||||
}
|
AttemptSSL(pcf);
|
||||||
if (fReqEncryption && FileGetType(pcf) != SSLSocket) {
|
}
|
||||||
Error("Encryption not supported by server `%s'", server);
|
if (FileGetType(pcf) != SSLSocket) {
|
||||||
FileClose(&pcf);
|
Error("Encryption not supported by server `%s'", server);
|
||||||
continue;
|
FileClose(&pcf);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1320,6 +1288,10 @@ DoCmds(master, ports, cmdi)
|
|||||||
continue;
|
continue;
|
||||||
} else
|
} else
|
||||||
count = 0;
|
count = 0;
|
||||||
|
} else if (strcmp(t, "ok\r\n") != 0) {
|
||||||
|
FileClose(&pcf);
|
||||||
|
FilePrint(cfstdout, FLAGFALSE, "%s: %s", server, t);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now that we're logged in, we can do something */
|
/* now that we're logged in, we can do something */
|
||||||
@ -1457,6 +1429,8 @@ main(argc, argv)
|
|||||||
|
|
||||||
isMultiProc = 0; /* make sure stuff DOESN'T have the pid */
|
isMultiProc = 0; /* make sure stuff DOESN'T have the pid */
|
||||||
|
|
||||||
|
thepid = getpid();
|
||||||
|
|
||||||
if (textMsg == (STRING *)0)
|
if (textMsg == (STRING *)0)
|
||||||
textMsg = AllocString();
|
textMsg = AllocString();
|
||||||
if (acPorts == (STRING *)0)
|
if (acPorts == (STRING *)0)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.\" $Id: console.man,v 1.41 2003/11/28 00:47:30 bryan Exp $
|
.\" $Id: console.man,v 1.42 2003/12/25 19:22:02 bryan Exp $
|
||||||
.TH CONSOLE 1 "2003/11/28" "conserver-8.0.9" "conserver"
|
.TH CONSOLE 1 "2003/12/25" "conserver-8.1.0" "conserver"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
console \- console server client program
|
console \- console server client program
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@ -324,7 +324,7 @@ file descriptor for the device.
|
|||||||
Commands will have values of the command, the command's pid, the
|
Commands will have values of the command, the command's pid, the
|
||||||
pseudo-tty, and file descriptor for the pseudo-tty.
|
pseudo-tty, and file descriptor for the pseudo-tty.
|
||||||
Remote ports will have values of the remote hostname, remote port number,
|
Remote ports will have values of the remote hostname, remote port number,
|
||||||
and file descriptor for the socket connection.
|
``raw'' or ``telnet'' protocol, and file descriptor for the socket connection.
|
||||||
.TP
|
.TP
|
||||||
.I users-list
|
.I users-list
|
||||||
The details of each user connected to the console.
|
The details of each user connected to the console.
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
%define pkg conserver
|
%define pkg conserver
|
||||||
%define ver 8.0.9
|
%define ver 8.1.0
|
||||||
|
|
||||||
# define the name of the machine on which the main conserver
|
# define the name of the machine on which the main conserver
|
||||||
# daemon will be running if you don't want to use the default
|
# daemon will be running if you don't want to use the default
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
PKG="conserver"
|
PKG="conserver"
|
||||||
NAME="Console server and client"
|
NAME="Console server and client"
|
||||||
CATEGORY="system"
|
CATEGORY="system"
|
||||||
VERSION="8.0.9"
|
VERSION="8.1.0"
|
||||||
DESC="Console server and client"
|
DESC="Console server and client"
|
||||||
CLASSES=none
|
CLASSES=none
|
||||||
ARCH=sparc
|
ARCH=sparc
|
||||||
|
Loading…
Reference in New Issue
Block a user