utils/mr/mr.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- main
1 /***************************************
2 $Revision: 1.1 $
3
4 Wrapper for NRTM client
5
6 Status: NOT REVUED, NOT TESTED
7
8 Author(s): Andrei Robachevsky
9
10 ******************/ /******************
11 Modification History:
12 andrei (17/01/2000) Created.
13 ******************/ /******************
14 Copyright (c) 2000,2001 RIPE NCC
15
16 All Rights Reserved
17
18 Permission to use, copy, modify, and distribute this software and its
19 documentation for any purpose and without fee is hereby granted,
20 provided that the above copyright notice appear in all copies and that
21 both that copyright notice and this permission notice appear in
22 supporting documentation, and that the name of the author not be
23 used in advertising or publicity pertaining to distribution of the
24 software without specific, written prior permission.
25
26 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
27 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
28 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
29 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
30 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32 ***************************************/
33
34 #include "rip.h"
35
36 #include <stdio.h>
37 #include <unistd.h>
38 #include <sys/param.h>
39 #include <sys/types.h>
40 #include <netinet/in.h>
41 #include <arpa/inet.h>
42 #include <sys/wait.h>
43
44 #define MAX_INPUT_SIZE 256
45 #define TIMEOUT 60
46 /* number of outstanding connections (backlog queue length) */
47 #define BACKLOG 10
48
49 extern char *optarg;
50
51
52 int main(int argc, char **argv)
/* [<][>][^][v][top][bottom][index][help] */
53 {
54 char input[MAX_INPUT_SIZE], output[MAX_INPUT_SIZE+1];
55 char *mserver=NULL;
56 int listen_port=0, connect_port=0;
57 int listening_socket, client_socket, server_socket;
58 struct hostent *hptr;
59 struct sockaddr_in serv_addr;
60 struct in_addr *paddr;
61 int nwrite;
62 int ilen;
63 int c;
64 int errflg=0;
65 int pid;
66 char *filter_name="./ripe2rpsl";
67
68
69 if(argc<4) errflg++;
70
71 while ((c = getopt(argc, argv, "l:h:p:f:?")) != EOF)
72 switch (c) {
73 case 'l':
74 listen_port = atoi(optarg);
75 break;
76 case 'h':
77 mserver = optarg;
78 break;
79 case 'p':
80 connect_port = htons(atoi(optarg));
81 break;
82 case 'f':
83 filter_name = optarg;
84 break;
85 case '?':
86 default :
87 errflg++;
88 break;
89 }
90 if (errflg) {
91 fprintf(stderr,"usage: mr -l listen_port -h mirror_server -p port [-f convertor]\n");
92 exit (2);
93 }
94
95 listening_socket = SK_getsock(SOCK_STREAM, listen_port, BACKLOG, INADDR_ANY);
96
97 while (1) {
98 client_socket = SK_accept_connection(listening_socket);
99 if(client_socket==-1) {fprintf(stderr, "cannot accept client\n"); continue; }
100 fprintf(stderr, "client connected\n");
101 /* get the input from the client */
102 SK_gets(client_socket, input, MAX_INPUT_SIZE);
103 fprintf(stderr, "input:[%s]\n", input);
104
105
106 /* create socket to connect to the server */
107 if ((server_socket=socket(AF_INET, SOCK_STREAM, 0))==-1){
108 perror("socket");
109 exit(1);
110 }
111 hptr=gethostbyname(mserver);
112 if (hptr) {
113 paddr=(struct in_addr *)hptr->h_addr;
114 bzero(&serv_addr, sizeof(serv_addr));
115 serv_addr.sin_family=AF_INET;
116 serv_addr.sin_port=connect_port;
117 memcpy(&serv_addr.sin_addr, paddr, sizeof(struct in_addr));
118 fprintf(stderr,"Trying %s port %d\n", inet_ntoa(serv_addr.sin_addr), connect_port);
119 if(connect(server_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr))==-1) {
120 perror("connect");
121 close(client_socket);
122 sleep(TIMEOUT);
123 continue;
124 }
125 }
126 fprintf(stderr, "Sending Invitation");
127
128 sprintf(output, "%s\n", input);
129 ilen=strlen(output);
130 nwrite=SK_write(server_socket, output, ilen, NULL, NULL);
131 if(nwrite != 1) { perror("write"); exit(2); }
132 fprintf(stderr, "...sent \n");
133
134 if((pid=fork())==0){
135 close(listening_socket);
136 if(dup2(server_socket, 0)==-1) perror("dup2-serv"); ; /* provide input from the mirror server */
137 if(dup2(client_socket, 1)==-1) perror("dup2-clnt"); ; /* direct output to the client */
138 fprintf(stderr, "Executing convertor: %s\n", filter_name);
139 execlp(filter_name,filter_name, NULL);
140 fprintf(stderr, "Cannot execute %s\n", filter_name);
141 }
142 fprintf(stderr, "waiting for convertor to finish...\n");
143 wait(&pid); /* wait untill conversion finishes */
144 fprintf(stderr, "...converting stream done\n");
145
146 close(server_socket);
147 close(client_socket);
148
149
150 }/* main loop */
151
152 }