add to mksh the unique ability to spawn on a different VT
This commit is contained in:
parent
8d8e1fe56d
commit
582bb62b81
4
Makefile
4
Makefile
@ -1,8 +1,8 @@
|
|||||||
# $MirBSD: Makefile,v 1.8 2004/10/28 16:35:01 tg Exp $
|
# $MirBSD: Makefile,v 1.9 2004/10/31 22:28:41 tg Exp $
|
||||||
# $OpenBSD: Makefile,v 1.18 2004/02/16 19:07:19 deraadt Exp $
|
# $OpenBSD: Makefile,v 1.18 2004/02/16 19:07:19 deraadt Exp $
|
||||||
|
|
||||||
PROG= ksh
|
PROG= ksh
|
||||||
SRCS= alloc.c c_ksh.c c_sh.c c_test.c c_ulimit.c edit.c emacs.c \
|
SRCS= alloc.c c_ksh.c c_sh.c c_test.c c_ulimit.c chvt.c edit.c emacs.c \
|
||||||
eval.c exec.c expr.c history.c io.c jobs.c lex.c mail.c \
|
eval.c exec.c expr.c history.c io.c jobs.c lex.c mail.c \
|
||||||
main.c misc.c missing.c path.c rnd.c shf.c syn.c table.c \
|
main.c misc.c missing.c path.c rnd.c shf.c syn.c table.c \
|
||||||
trap.c tree.c tty.c var.c version.c vi.c
|
trap.c tree.c tty.c var.c version.c vi.c
|
||||||
|
66
chvt.c
Normal file
66
chvt.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/** $MirBSD: chvt.c,v 1.1 2004/10/31 22:28:41 tg Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 2004
|
||||||
|
* Thorsten "mirabile" Glaser <tg@66h.42h.de>
|
||||||
|
*
|
||||||
|
* Licensee is hereby permitted to deal in this work without restric-
|
||||||
|
* tion, including unlimited rights to use, publically perform, modi-
|
||||||
|
* fy, merge, distribute, sell, give away or sublicence, provided the
|
||||||
|
* above copyright notices, these terms and the disclaimer are retai-
|
||||||
|
* ned in all redistributions, or reproduced in accompanying documen-
|
||||||
|
* tation or other materials provided with binary redistributions.
|
||||||
|
*
|
||||||
|
* Licensor hereby provides this work "AS IS" and WITHOUT WARRANTY of
|
||||||
|
* any kind, expressed or implied, to the maximum extent permitted by
|
||||||
|
* applicable law, but with the warranty of being written without ma-
|
||||||
|
* licious intent or gross negligence; in no event shall licensor, an
|
||||||
|
* author or contributor be held liable for any damage, direct, indi-
|
||||||
|
* rect or other, however caused, arising in any way out of the usage
|
||||||
|
* of covered work, even if advised of the possibility of such damage.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sh.h"
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include "ksh_stat.h"
|
||||||
|
|
||||||
|
__RCSID("$MirBSD: chvt.c,v 1.1 2004/10/31 22:28:41 tg Exp $");
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
chvt(char *f)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if (chown(f, 0, 0))
|
||||||
|
return "chown";
|
||||||
|
if (chmod(f, 0600))
|
||||||
|
return "chmod";
|
||||||
|
if (revoke(f))
|
||||||
|
return "revoke";
|
||||||
|
|
||||||
|
if ((fd = open(f, O_RDWR)) == -1) {
|
||||||
|
sleep(1);
|
||||||
|
if ((fd = open(f, O_RDWR)) == -1)
|
||||||
|
return "open";
|
||||||
|
}
|
||||||
|
switch (fork()) {
|
||||||
|
case -1:
|
||||||
|
return "fork";
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_exit(0);
|
||||||
|
}
|
||||||
|
if (setsid() == -1)
|
||||||
|
return "setsid";
|
||||||
|
if (ioctl(fd, TIOCSCTTY, NULL) == -1)
|
||||||
|
return "ioctl";
|
||||||
|
dup2(fd, 0);
|
||||||
|
dup2(fd, 1);
|
||||||
|
dup2(fd, 2);
|
||||||
|
if (fd > 2)
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
24
ksh.1tbl
24
ksh.1tbl
@ -1,4 +1,4 @@
|
|||||||
.\" $MirBSD: ksh.1tbl,v 1.34 2004/10/28 16:49:13 tg Exp $
|
.\" $MirBSD: ksh.1tbl,v 1.35 2004/10/31 22:28:41 tg Exp $
|
||||||
.\" $OpenBSD: ksh.1tbl,v 1.72 2004/08/07 16:46:58 millert Exp $
|
.\" $OpenBSD: ksh.1tbl,v 1.72 2004/08/07 16:46:58 millert Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1980, 1990, 1993
|
.\" Copyright (c) 1980, 1990, 1993
|
||||||
@ -55,6 +55,7 @@
|
|||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl +abCefhiklmnprsuvxX
|
.Op Fl +abCefhiklmnprsuvxX
|
||||||
|
.Op Fl T Ar /dev/ttyCn
|
||||||
.Op Fl +o Ar option
|
.Op Fl +o Ar option
|
||||||
.Xo
|
.Xo
|
||||||
.Bk -words
|
.Bk -words
|
||||||
@ -88,6 +89,13 @@ The shell reads commands from standard input; all non-option arguments
|
|||||||
are positional parameters.
|
are positional parameters.
|
||||||
.It Fl r
|
.It Fl r
|
||||||
Restricted mode; see below.
|
Restricted mode; see below.
|
||||||
|
.It Fl T Ar tty
|
||||||
|
Spawn
|
||||||
|
.Nm
|
||||||
|
on
|
||||||
|
.Xr tty 4
|
||||||
|
device given.
|
||||||
|
Superuser only.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
In addition to the above, the options described in the
|
In addition to the above, the options described in the
|
||||||
@ -135,6 +143,20 @@ option is on by default (see the
|
|||||||
.Ic set
|
.Ic set
|
||||||
command below).
|
command below).
|
||||||
.Pp
|
.Pp
|
||||||
|
If the
|
||||||
|
.Fl T Ar ttydev
|
||||||
|
option is given, an interactive shell is spawned in the background
|
||||||
|
with the given device as controlling terminal.
|
||||||
|
The terminal devices are probed in the following order:
|
||||||
|
.Bl -enum -compact
|
||||||
|
.It
|
||||||
|
ttydev
|
||||||
|
.It
|
||||||
|
.Pa /dev/ttyC Ns ttydev
|
||||||
|
.It
|
||||||
|
.Pa /dev/tty Ns ttydev
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
A shell is
|
A shell is
|
||||||
.Dq restricted
|
.Dq restricted
|
||||||
if the
|
if the
|
||||||
|
56
misc.c
56
misc.c
@ -1,4 +1,4 @@
|
|||||||
/** $MirBSD: misc.c,v 1.12 2004/10/28 11:53:42 tg Exp $ */
|
/** $MirBSD: misc.c,v 1.13 2004/10/31 22:28:42 tg Exp $ */
|
||||||
/* $OpenBSD: misc.c,v 1.20 2003/10/22 07:40:38 jmc Exp $ */
|
/* $OpenBSD: misc.c,v 1.20 2003/10/22 07:40:38 jmc Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -11,7 +11,7 @@
|
|||||||
# include <limits.h>
|
# include <limits.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__RCSID("$MirBSD: misc.c,v 1.12 2004/10/28 11:53:42 tg Exp $");
|
__RCSID("$MirBSD: misc.c,v 1.13 2004/10/31 22:28:42 tg Exp $");
|
||||||
|
|
||||||
#ifndef UCHAR_MAX
|
#ifndef UCHAR_MAX
|
||||||
# define UCHAR_MAX 0xFF
|
# define UCHAR_MAX 0xFF
|
||||||
@ -24,6 +24,10 @@ static int do_gmatch(const unsigned char *s, const unsigned char *p,
|
|||||||
int isfile);
|
int isfile);
|
||||||
static const unsigned char *cclass(const unsigned char *p, int sub);
|
static const unsigned char *cclass(const unsigned char *p, int sub);
|
||||||
|
|
||||||
|
#ifdef KSH
|
||||||
|
static int parse_T(char *);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fast character classes
|
* Fast character classes
|
||||||
*/
|
*/
|
||||||
@ -319,7 +323,8 @@ change_flag(enum sh_flag f, int what, int newval)
|
|||||||
}
|
}
|
||||||
/* Changing interactive flag? */
|
/* Changing interactive flag? */
|
||||||
if (f == FTALKING) {
|
if (f == FTALKING) {
|
||||||
if ((what == OF_CMDLINE || what == OF_SET) && procpid == kshpid)
|
if ((what == OF_CMDLINE || what == OF_SET)
|
||||||
|
&& procpid == kshpid)
|
||||||
Flag(FTALKING_I) = newval;
|
Flag(FTALKING_I) = newval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -333,7 +338,7 @@ parse_args(char **argv, int what, int *setargsp)
|
|||||||
/* OF_CMDLINE or OF_SET */
|
/* OF_CMDLINE or OF_SET */
|
||||||
|
|
||||||
{
|
{
|
||||||
static char cmd_opts[NELEM(options) + 3]; /* o:\0 */
|
static char cmd_opts[NELEM(options) + 5]; /* o:T:\0 */
|
||||||
static char set_opts[NELEM(options) + 5]; /* Ao;s\0 */
|
static char set_opts[NELEM(options) + 5]; /* Ao;s\0 */
|
||||||
char *opts;
|
char *opts;
|
||||||
char *array = (char *) 0;
|
char *array = (char *) 0;
|
||||||
@ -346,7 +351,11 @@ parse_args(char **argv, int what, int *setargsp)
|
|||||||
char *p, *q;
|
char *p, *q;
|
||||||
|
|
||||||
/* see cmd_opts[] declaration */
|
/* see cmd_opts[] declaration */
|
||||||
|
#ifdef KSH
|
||||||
|
strlcpy(cmd_opts, "o:T:", sizeof cmd_opts);
|
||||||
|
#else
|
||||||
strlcpy(cmd_opts, "o:", sizeof cmd_opts);
|
strlcpy(cmd_opts, "o:", sizeof cmd_opts);
|
||||||
|
#endif
|
||||||
p = cmd_opts + strlen(cmd_opts);
|
p = cmd_opts + strlen(cmd_opts);
|
||||||
/* see set_opts[] declaration */
|
/* see set_opts[] declaration */
|
||||||
strlcpy(set_opts, "A:o;s", sizeof set_opts);
|
strlcpy(set_opts, "A:o;s", sizeof set_opts);
|
||||||
@ -383,6 +392,14 @@ parse_args(char **argv, int what, int *setargsp)
|
|||||||
array = go.optarg;
|
array = go.optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef KSH
|
||||||
|
case 'T':
|
||||||
|
if (parse_T(go.optarg))
|
||||||
|
return -1;
|
||||||
|
change_flag(FTALKING, OF_CMDLINE, 1);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
if (go.optarg == (char *) 0) {
|
if (go.optarg == (char *) 0) {
|
||||||
/* lone -o: print options
|
/* lone -o: print options
|
||||||
@ -1299,3 +1316,34 @@ ksh_get_wd(char *buf, int bsize)
|
|||||||
return b;
|
return b;
|
||||||
#endif /* HAVE_GETCWD */
|
#endif /* HAVE_GETCWD */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef KSH
|
||||||
|
#include "ksh_stat.h"
|
||||||
|
static int
|
||||||
|
parse_T(char *fn)
|
||||||
|
{
|
||||||
|
char *rv, dv[20];
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
strlcpy(dv, fn, 20);
|
||||||
|
if (stat(dv, &sb)) {
|
||||||
|
snprintf(dv, 20, "/dev/ttyC%s", fn);
|
||||||
|
if (stat(dv, &sb)) {
|
||||||
|
snprintf(dv, 20, "/dev/tty%s", fn);
|
||||||
|
if (stat(dv, &sb)) {
|
||||||
|
warningf(0, "chvt: can't find tty %s", fn);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(sb.st_mode & S_IFCHR)) {
|
||||||
|
warningf(0, "chvt: not a char device: %s", fn);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if ((rv = chvt(dv)) != NULL) {
|
||||||
|
warningf(0, "chvt: failed to %s: %s", rv, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
4
proto.h
4
proto.h
@ -1,4 +1,4 @@
|
|||||||
/** $MirBSD: proto.h,v 1.8 2004/10/28 11:53:43 tg Exp $ */
|
/** $MirBSD: proto.h,v 1.9 2004/10/31 22:28:43 tg Exp $ */
|
||||||
/* $OpenBSD: proto.h,v 1.11 2003/05/16 19:58:57 jsyn Exp $ */
|
/* $OpenBSD: proto.h,v 1.11 2003/05/16 19:58:57 jsyn Exp $ */
|
||||||
/* $From: proto.h,v 1.3 1994/05/19 18:32:40 michael Exp michael $ */
|
/* $From: proto.h,v 1.3 1994/05/19 18:32:40 michael Exp michael $ */
|
||||||
|
|
||||||
@ -54,6 +54,8 @@ int c_exec(char **wp);
|
|||||||
int c_builtin(char **wp);
|
int c_builtin(char **wp);
|
||||||
/* c_test.c */
|
/* c_test.c */
|
||||||
int c_test(char **wp);
|
int c_test(char **wp);
|
||||||
|
/* chvt.c */
|
||||||
|
char * chvt(char *);
|
||||||
/* edit.c: most prototypes in edit.h */
|
/* edit.c: most prototypes in edit.h */
|
||||||
void x_init(void);
|
void x_init(void);
|
||||||
int x_read(char *buf, size_t len);
|
int x_read(char *buf, size_t len);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user