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
|
/*
* 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.13 1994/07/02 02:32:13 mrg Exp $";
#endif
#include "defs.h"
#include "config.h"
#include "irc.h"
#include "struct.h"
#include "ircterm.h"
#include "ircaux.h"
#include <errno.h>
#include <sys/uio.h>
static int s;
static char buffer[256];
void my_exit(int);
void ignore (int value);
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();
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 in_addr LocalHostAddr;
char empty_string[] = "";
enum VAR_TYPES { unused };
int get_int_var (enum VAR_TYPES unused) { return 5; }
void set_socket_options (int s) { }
/* End of file */
|