/* Taken from some freebie code - doesn't work, isn't used. blah!!! why is it here?? */ #include <sys/types.h> #ifdef Linux #include <sys/time.h> #endif #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #ifdef netBSD #include <unistd.h> #endif #include "emlen.h" #ifdef Linux #include "mush.h" #endif #ifdef WINDOWS int startShell (CHAR_DATA * ch, char *arg1, char *arg2) {return 0;} void do_shell (CHAR_DATA * ch, char *argy) {return;} void do_spico_help (CHAR_DATA * ch, char *argy) {return;} #else extern char wont_echo[]; extern char wont_suppress_ga[]; extern char will_echo[]; extern char will_suppress_ga[]; void do_spico_help (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("edit_help", do_spico_help, POSITION_DEAD, 110, LOG_ALWAYS, "Remote Help Editing.") if (!ch->desc) return; ch->desc->connected = CON_SHELL; startShell (ch, "spico", "help.are"); return; } /* would just be a security hole - scrap this */ void do_shell (CHAR_DATA * ch, char *argy) { char arg1[500]; char arg2[500]; DEFINE_COMMAND ("shell", do_shell, POSITION_DEAD, 110, LOG_ALWAYS, "Do not use.") if (!ch->desc) return; return; } int open_pty_master (char *); int open_pty_slave (int, const char *); int route_io (int, int); int startShell (CHAR_DATA * ch, char *arg1, char *arg2) { DESCRIPTOR_DATA *c; int master_fd; int slave_fd; int temp_fds[2]; char pty[12]; int pid; if (!ch->desc) return -1; if (pipe (temp_fds) < 0) { perror ("pipe"); return -1; } ch->desc->fdpair[0] = temp_fds[0]; /* Pipe in */ fcntl (ch->desc->fdpair[0], F_SETFL, O_NONBLOCK); ch->desc->fdpair[1] = temp_fds[1]; /* Pipe out */ if ((pid = fork ()) > 0) { close (ch->desc->fdpair[1]); fcntl (ch->desc->fdpair[0], F_SETFL, O_NONBLOCK); return 0; } else if (pid < 0) { close (ch->desc->fdpair[1]); close (ch->desc->fdpair[0]); return -1; } close (main_control); /*::server.close(); ????????? */ close (ch->desc->fdpair[0]); for (c = descriptor_list; c != NULL; c = c->next) { if (c == ch->desc) continue; close (c->descriptor); } if ((int) (master_fd = open_pty_master (pty)) < 0) { return -1; } pid = fork (); if (pid == 0) { struct sigaction sa; sa.sa_flags = SA_RESETHAND; sa.sa_handler = 0; if (sigaction (SIGCHLD, &sa, 0) < 0) { /*bummer */ } if ((int) (slave_fd = open_pty_slave ((int) master_fd, pty)) < 0) { perror ("open_pty_slave:"); exit (0); } close (master_fd); close (0); close (1); close (2); if (dup ((int) slave_fd) != 0 || dup ((int) slave_fd) != 1 || dup ((int) slave_fd) != 2) { exit (0); } close (slave_fd); if (arg1[0] != '\0') execlp (arg1, arg1, arg2, (char *) 0); else execl ("/bin/sh", "sh", (char *) 0); exit (0); } else if (pid < 0) { return -1; } fcntl (master_fd, F_SETFL, O_NONBLOCK); write (ch->desc->descriptor, will_echo, strlen (will_echo)); write (ch->desc->descriptor, will_suppress_ga, strlen (will_suppress_ga)); route_io (ch->desc->descriptor, (int) master_fd); close (ch->desc->fdpair[1]); exit (0); return 0; } #endif