From 907b46a04e4580c4437f44e610a1a02cf44a7ef9 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Fri, 10 Feb 2006 12:55:58 +0000 Subject: [PATCH] Added forkpty() code for Solaris experimentally SVN revision: 1656 --- Makefile | 14 ++++++-- src/elogd.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 100 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 4172bd5f..c60754b2 100644 --- a/Makefile +++ b/Makefile @@ -39,10 +39,11 @@ RM = /bin/rm -f OSTYPE = $(shell uname) -# -lutil needed for forkpty() -LIBS += -lutil - ifeq ($(OSTYPE),solaris) +OSTYPE=SOLARIS +endif + +ifeq ($(OSTYPE),SOLARIS) CC = gcc LIBS += -lsocket -lnsl CFLAGS = @@ -55,17 +56,24 @@ OSTYPE=darwin endif ifeq ($(OSTYPE),darwin) +LIBS += -lutil CC = cc BINOWNER = root BINGROUP = admin endif ifeq ($(OSTYPE),FreeBSD) +LIBS += -lutil CC = gcc BINOWNER = root BINGROUP = wheel endif +ifeq ($(OSTYPE),Linux) +LIBS += -lutil +CC = gcc +endif + CFLAGS += -DOS_$(OSTYPE) all: $(EXECS) diff --git a/src/elogd.c b/src/elogd.c index 74b3c08f..f9ff0025 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -899,6 +899,85 @@ void redirect_to_stderr(void) /*------------------------------------------------------------------*/ +#ifdef OS_SOLARIS /* Solaris does not have forkpty(), so emaulate it */ + +#include +#include +#include +#include +#include +#include + +/* 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) { #ifdef OS_WINNT @@ -5080,7 +5159,7 @@ void write_logfile(LOGBOOK * lbs, const char *text) if (strlen(buf) > 0 && buf[strlen(buf) - 1] != '\n') strlcat(buf, "\r\n", sizeof(buf)); else if (strlen(buf) > 1 && buf[strlen(buf) - 2] != '\r') - strlcpy(buf+strlen(buf)-2, "\r\n", sizeof(buf)-(strlen(buf)-2)); + strlcpy(buf + strlen(buf) - 2, "\r\n", sizeof(buf) - (strlen(buf) - 2)); #else if (strlen(buf) > 1 && buf[strlen(buf) - 1] != '\n') @@ -5536,7 +5615,7 @@ PATTERN_LIST pattern_list[] = { {"[list]\r", "
    "}, {"[list]", "
      "}, {"[*]", "
    • "}, - {"[/list]\r", ""}, // either
    or + {"[/list]\r", ""}, // either
or {"[/list]", ""}, {"[list=", "
    "}, @@ -6205,7 +6284,7 @@ void compose_base_url(LOGBOOK * lbs, char *base_url, int size) void set_location(LOGBOOK * lbs, char *rel_path) { char str[NAME_LENGTH], group[NAME_LENGTH], list[NAME_LENGTH], *p; - int i; + int i; /* if path contains http(s), go directly there */ if (strncmp(rel_path, "http://", 7) == 0) { @@ -6235,11 +6314,11 @@ void set_location(LOGBOOK * lbs, char *rel_path) *strchr(str, '?') = 0; /* strip rightmost '/' */ - if (str[strlen(str)-1] == '/') - str[strlen(str)-1] = 0; + if (str[strlen(str) - 1] == '/') + str[strlen(str) - 1] = 0; /* extract last subdir */ - p = str+strlen(str); + p = str + strlen(str); while (p > str && *p != '/') p--; if (*p == '/') @@ -11437,9 +11516,8 @@ void show_config_page(LOGBOOK * lbs) rsprintf("\n"); - if (is_admin_user(logbook, getparam("unm")) || - !getcfg(logbook, "allow password change", str, sizeof(str)) || - atoi(str) == 1) + if (is_admin_user(logbook, getparam("unm")) || + !getcfg(logbook, "allow password change", str, sizeof(str)) || atoi(str) == 1) rsprintf("\n", loc("Change password")); rsprintf("\n", loc("Remove user")); @@ -17578,7 +17656,7 @@ void show_elog_list(LOGBOOK * lbs, int past_n, int last_n, int page_n, BOOL defa for (i = 0; i < n_attr_disp; i++) { /* assemble current command line, replace sort statements */ strcpy(ref, getparam("cmdline")); - + strcpy(str, disp_attr[i]); url_encode(str, sizeof(str)); if (isparam("sort") && strcmp(getparam("sort"), disp_attr[i]) == 0) { @@ -21143,7 +21221,7 @@ BOOL check_user_password(LOGBOOK * lbs, char *user, char *password, char *redir) { char str[1000], str2[256], upwd[256], full_name[256], email[256]; int status, show_forgot_link, show_self_register; -; + ; if (user == NULL) return FALSE;