/* 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 void //Kilith 2005 do_random_split (CHAR_DATA * ch , char *argy) { DESCRIPTOR_DATA *d; char arg[SML_LENGTH]; char buf[5000]; int i,x; ROOM_DATA *troom; static ROOM_DATA *first; CHAR_DATA *mob,*victim; SINGLE_OBJECT *obj; DEFINE_COMMAND("dice", do_random_split, POSITION_DEAD, 0, LOG_NORMAL,"This does a random split between people in a room to replace 0 high") i=1; if (IS_MOB(ch) || !ch->desc) return; one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Dice a split on what?\n\r", ch); return; } troom=ch->in_room; if ((obj = get_obj_inv (ch, arg)) == NULL) { send_to_char ("You can't find it.\n\r", ch); return; } mob=NULL; for (mob = troom->more->people; mob != NULL; mob = mob->next_in_room) { i++; } x=number_range(1,i)-1; if (x < 1) x=1; i=1; troom=NULL; troom=ch->in_room; for (mob = troom->more->people; mob != NULL; mob = mob->next_in_room) { if (i !=x) { i++; continue; } else break; } if (mob->desc == NULL) { do_random_split(ch,argy); return; } if (IS_PLAYER(mob) && LEVEL(mob) > 90 && LEVEL(ch) < 91) { do_random_split(ch,argy); return; } sprintf(buf,"\x1B[0;37m... You roll the dice on %s\x1B[0;37m.\n\r",obj->pIndexData->short_descr); send_to_char(buf,ch); act ("\x1B[1;31m$n \x1B[0;37mrolls the dice on $p\x1B[0;37m.", ch, obj, ch, TO_NOTVICT); sprintf(buf,"The winner is:\x1B[1;31m %s\x1B[37;0m. \n\r", mob->desc == NULL ? "Nobody" : RNAME(mob)); for (d = descriptor_list; d; d = d->next) { if (d->connected == CON_PLAYING && d->character->in_room == ch->in_room) { send_to_char (buf, d->character); } } return; } #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, MAX_LEVEL, 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) { DEFINE_COMMAND ("shell", do_shell, POSITION_DEAD, MAX_LEVEL, 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