1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*
* wserv.c - little program to be a pipe between a screen or
* xterm window to the calling ircII process.
*
* Written by Troy Rollo, Copyright 1992 Troy Rollo
* Finished by Matthew Green, Copyright 1993 Matthew Green
* Support for 4.4BSD by Jeremy Nelson, Copyright 1997 EPIC Software Labs
*
* Works by opening up the unix domain socket that ircII bind's
* before calling wserv, and which ircII also deleted after the
* connection has been made.
*/
#if 0
static char rcsid[] = "@(#)$Id: wserv.c,v 1.1.1.1 2003/04/11 01:09:08 dan Exp $";
#endif
#include "defs.h"
#include "config.h"
#include "irc.h"
#include "struct.h"
#include "ircterm.h"
#include "ircaux.h"
#define WTERM_C
#include "modval.h"
#include <errno.h>
#include <sys/uio.h>
static int s;
static char buffer[256];
void my_exit(int);
void ignore (int value);
#ifdef CLOAKED
extern char proctitlestr[140];
extern char **Argv;
extern char *LastArgv;
#endif
int main (int argc, char **argv)
{
fd_set reads;
int nread;
unsigned short port;
char *host;
char *tmp;
int t;
char stuff[100];
#ifndef WINNT
my_signal(SIGWINCH, SIG_IGN, 0);
#endif
my_signal(SIGHUP, SIG_IGN, 0);
my_signal(SIGQUIT, SIG_IGN, 0);
my_signal(SIGINT, ignore, 0);
if (argc != 3) /* no socket is passed */
my_exit(1);
host = argv[1];
port = (unsigned short)atoi(argv[2]);
if (!port)
my_exit(2); /* what the hey */
s = connect_by_number(host, &port, SERVICE_CLIENT, PROTOCOL_TCP, 0);
if (s < 0)
my_exit(23);
/*
* first line from a wserv program is the tty. this is so ircii
* can grab the size of the tty, and have it changed.
*/
tmp = ttyname(0);
sprintf(stuff, "%s\n", tmp);
t = write(s, stuff, strlen(stuff));
term_init(NULL);
printf("t is %d", t);
/*
* The select call.. reads from the socket, and from the window..
* and pipes the output from out to the other.. nice and simple
*/
for (;;)
{
FD_ZERO(&reads);
FD_SET(0, &reads);
FD_SET(s, &reads);
if (select(s + 1, &reads, NULL, NULL, NULL) <= 0)
if (errno == EINTR)
continue;
if (FD_ISSET(0, &reads))
{
if ((nread = read(0, buffer, sizeof(buffer))))
write(s, buffer, nread);
else
my_exit(3);
}
if (FD_ISSET(s, &reads))
{
if ((nread = read(s, buffer, sizeof(buffer))))
write(1, buffer, nread);
else
my_exit(4);
}
}
my_exit(8);
}
void ignore (int value)
{
/* send a ^C */
char foo = 3;
write(s, &foo, 1);
}
void my_exit(int value)
{
printf("exiting with %d!\n", value);
printf("errno is %d (%s)\n", errno, strerror(errno));
exit(value);
}
/* These are here so we can link with network.o */
char *LocalHostName = NULL;
struct sockaddr_foobar LocalHostAddr;
char empty_string[] = "";
int get_int_var (enum VAR_TYPES unused) { return 5; }
void set_socket_options (int s) { }
/* End of file */
|