Added forkpty() code for Solaris experimentally

SVN revision: 1656
This commit is contained in:
Stefan Ritt 2006-02-10 12:55:58 +00:00
parent 7d37837644
commit 907b46a04e
2 changed files with 100 additions and 14 deletions

View File

@ -39,10 +39,11 @@ RM = /bin/rm -f
OSTYPE = $(shell uname) OSTYPE = $(shell uname)
# -lutil needed for forkpty()
LIBS += -lutil
ifeq ($(OSTYPE),solaris) ifeq ($(OSTYPE),solaris)
OSTYPE=SOLARIS
endif
ifeq ($(OSTYPE),SOLARIS)
CC = gcc CC = gcc
LIBS += -lsocket -lnsl LIBS += -lsocket -lnsl
CFLAGS = CFLAGS =
@ -55,17 +56,24 @@ OSTYPE=darwin
endif endif
ifeq ($(OSTYPE),darwin) ifeq ($(OSTYPE),darwin)
LIBS += -lutil
CC = cc CC = cc
BINOWNER = root BINOWNER = root
BINGROUP = admin BINGROUP = admin
endif endif
ifeq ($(OSTYPE),FreeBSD) ifeq ($(OSTYPE),FreeBSD)
LIBS += -lutil
CC = gcc CC = gcc
BINOWNER = root BINOWNER = root
BINGROUP = wheel BINGROUP = wheel
endif endif
ifeq ($(OSTYPE),Linux)
LIBS += -lutil
CC = gcc
endif
CFLAGS += -DOS_$(OSTYPE) CFLAGS += -DOS_$(OSTYPE)
all: $(EXECS) all: $(EXECS)

View File

@ -899,6 +899,85 @@ void redirect_to_stderr(void)
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
#ifdef OS_SOLARIS /* Solaris does not have forkpty(), so emaulate it */
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/stream.h>
#include <sys/stropts.h>
/* fork_pty() remplacement for Solaris.
* This ignore the last two arguments
* for the moment
*/
int forkpty(int *amaster, char *name, void *unused1, void *unused2)
{
int master, slave;
char *slave_name;
pid_t pid;
master = open("/dev/ptmx", O_RDWR);
if (master & lt; 0)
return -1;
if (grantpt(master) & lt; 0) {
close(master);
return -1;
}
if (unlockpt(master) & lt; 0) {
close(master);
return -1;
}
slave_name = ptsname(master);
if (slave_name == NULL) {
close(master);
return -1;
}
slave = open(slave_name, O_RDWR);
if (slave & lt; 0) {
close(master);
return -1;
}
if (ioctl(slave, I_PUSH, "ptem") & lt; 0 || ioctl(slave, I_PUSH, "ldterm") & lt; 0) {
close(slave);
close(master);
return -1;
}
if (amaster)
*amaster = master;
if (name)
strcpy(name, slave_name);
pid = fork();
switch (pid) {
case -1: /* Error */
return -1;
case 0: /* Child */
close(master);
dup2(slave, STDIN_FILENO);
dup2(slave, STDOUT_FILENO);
dup2(slave, STDERR_FILENO);
return 0;
default: /* Parent */
close(slave);
return pid;
}
return -1;
}
#endif /* OS_SOLARIS */
/*------------------------------------------------------------------*/
int subst_shell(char *cmd, char *result, int size) int subst_shell(char *cmd, char *result, int size)
{ {
#ifdef OS_WINNT #ifdef OS_WINNT
@ -11438,8 +11517,7 @@ void show_config_page(LOGBOOK * lbs)
rsprintf("<tr><td class=\"menuframe\"><span class=\"menu1\">\n"); rsprintf("<tr><td class=\"menuframe\"><span class=\"menu1\">\n");
if (is_admin_user(logbook, getparam("unm")) || if (is_admin_user(logbook, getparam("unm")) ||
!getcfg(logbook, "allow password change", str, sizeof(str)) || !getcfg(logbook, "allow password change", str, sizeof(str)) || atoi(str) == 1)
atoi(str) == 1)
rsprintf("<input type=submit name=cmd value=\"%s\">\n", loc("Change password")); rsprintf("<input type=submit name=cmd value=\"%s\">\n", loc("Change password"));
rsprintf("<input type=submit name=cmd value=\"%s\" onClick=\"return chkrem();\">\n", loc("Remove user")); rsprintf("<input type=submit name=cmd value=\"%s\" onClick=\"return chkrem();\">\n", loc("Remove user"));