Annotation of OpenXM/src/kxx/oxmain.c, Revision 1.1.1.1
1.1 maekawa 1: /* nullserver01 */
2: #include <stdio.h>
3: #include <sys/types.h>
4: #include <sys/socket.h>
5: #include <sys/time.h>
6: #include <netinet/in.h>
7: #include <netdb.h>
8: #include <signal.h>
9: #include <setjmp.h>
10: /* -lnsl -lsocket /usr/ucblib/libucb.a */
11: #include "ox_kan.h"
12: #include "serversm.h"
13:
14: #define SERVERNAME "/home/nobuki/kxx/ox_sm1"
15: /*
16: #define SERVERNAME "/home/nobuki/kxx/stdserver00"
17: #define SERVERNAME "/home/ftp/pub/OHP/ox_asir"
18: */
19:
20: int OxCritical = 0;
21: int OxInterruptFlag = 0;
22:
23: int SerialCurrentControl;
24:
25: int MyServerPid;
26: char ServerName[1024];
27: int PacketMonitor = 0;
28: int Quiet = 0;
29:
30: int LocalMode = 1;
31: int NotifyPortnumber = 0;
32:
33:
34: main(int argc, char *argv[]) {
35: int fd;
36: int size;
37: char sname[1024];
38: int tmp[1];
39: char *buf;
40: int i;
41: int fdControl = -1; int portControl = 1200;
42: int fdStream = -1; int portStream = 1300;
43: int reverse = 0;
44: extern int OpenedSocket;
45: char portfile[1024];
46: char *pass;
47:
48: strcpy(sname,"localhost");
49: strcpy(ServerName,SERVERNAME);
50: i = 1;
51: while (i<argc) {
52: if (strcmp(argv[i],"-host") == 0) {
53: i++;
54: if (i<argc) strcpy(sname,argv[i]);
55: }else if (strcmp(argv[i],"-data")==0) {
56: i++;
57: if (i<argc) sscanf(argv[i],"%d",&portStream);
58: }else if (strcmp(argv[i],"-control")==0) {
59: i++;
60: if (i<argc) sscanf(argv[i],"%d",&portControl);
61: }else if (strcmp(argv[i],"-ox") == 0) {
62: i++;
63: if (i<argc) strcpy(ServerName,argv[i]);
64: }else if (strcmp(argv[i],"-monitor") == 0) {
65: PacketMonitor = 1;
66: }else if (strcmp(argv[i],"-insecure") == 0) {
67: LocalMode = 0;
68: }else if (strcmp(argv[i],"-reverse") == 0) {
69: reverse = 1;
70: }else if (strcmp(argv[i],"-portfile") == 0) {
71: i++;
72: if (i<argc) {
73: sscanf(argv[i],"%s",portfile);
74: portControl = 0;
75: portStream = 0;
76: NotifyPortnumber = 1;
77: }
78: }else if (strcmp(argv[i],"-pass") == 0) {
79: i++;
80: if (i<argc) {
81: pass = argv[i];
82: }
83: }else {
84: fprintf(stderr,"Unknown option %s.\n",argv[i]);
85: oxmainUsage(); exit(10);
86: }
87: i++;
88: }
89:
90: if (reverse) {
91: /* The order is very important. */
92: fdControl = socketConnectWithPass(sname,portControl,pass);
93: fdStream = socketConnectWithPass(sname,portStream,pass);
94:
95: fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream);
96: if (portControl != -1) {
97: MyServerPid = fork();
98: if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream);
99: else childServerMain(fdControl,fdStream);
100: }else{
101: childServerMain(fdControl,fdStream);
102: }
103: /* This line will be never executed. */
104: }
105:
106: /* non-reverse case. */
107: fprintf(stderr,"Hostname is %s \n",sname);
108: fprintf(stderr,"Port for data (-data) = %d \n",portStream);
109: fprintf(stderr,"Port for control message (-control) = %d \n",portControl);
110: fflush(NULL);
111:
112:
113: if (LocalMode) {
114: if (portControl != -1) {
115: fdControl = socketOpen(sname,portControl);
116: portControl = OpenedSocket;
117: if (NotifyPortnumber) {
118: oxWritePortFile(0,portControl,portfile);
119: }
120: fdControl = socketAcceptLocal(fdControl);
121: fprintf(stderr,"\n control port %d : Connected.\n",portControl);
122: }
123: if (portStream != -1) {
124: fdStream = socketOpen(sname,portStream);
125: portStream = OpenedSocket;
126: if (NotifyPortnumber) {
127: oxWritePortFile(1,portStream,portfile);
128: }
129: fdStream = socketAcceptLocal(fdStream);
130: fprintf(stderr,"\n stream port %d : Connected.\n",portStream);
131: }
132: }else{
133: if (portControl != -1) {
134: fdControl = socketOpen(sname,portControl);
135: portControl = OpenedSocket;
136: if (NotifyPortnumber) {
137: oxWritePortFile(0,portControl,portfile);
138: }
139: fdControl = socketAccept(fdControl);
140: fprintf(stderr,"\n control port %d : Connected.\n",portControl);
141: }
142: if (portStream != -1) {
143: fdStream = socketOpen(sname,portStream);
144: portStream = OpenedSocket;
145: if (NotifyPortnumber) {
146: oxWritePortFile(1,portStream,portfile);
147: }
148: fdStream = socketAccept(fdStream);
149: fprintf(stderr,"\n stream port %d : Connected.\n",portStream);
150: }
151: }
152:
153:
154:
155: if (portControl != -1) {
156: MyServerPid = fork();
157: if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream);
158: else childServerMain(fdControl,fdStream);
159: }else{
160: childServerMain(fdControl,fdStream);
161: }
162:
163: }
164:
165: oxmainUsage() {
166: fprintf(stderr,"Usage: \n");
167: fprintf(stderr," ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n");
168: fprintf(stderr," [-insecure -portfile fname -reverse -pass xxxyyyzzz]");
169: fprintf(stderr,"\n");
170: fprintf(stderr,"Example 1: dc1% ./ox -ox ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1300 -data 1200\n");
171: fprintf(stderr," sm1>[(dc1.math.kobe-u.ac.jp) 1300 1200] oxconnect /ox.ccc set\n");
172: fprintf(stderr,"\n");
173: }
174:
175: parentServerMain(int fdControl, int fdStream) {
176: int id;
177: int mtag;
178: int size;
179: int n;
180: int r;
181: int message = 1;
182: int controlByteOrder;
183:
184: extern void myServerExit();
185:
186: controlByteOrder = oxTellMyByteOrder(fdControl);
187: /* Set the network byte order. */
188: fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder);
189:
190:
191: signal(SIGINT,myServerExit);
192: while(1) {
193: mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl);
194: /* get the message_tag */
195: /* message_body */
196: id = oxfdGetInt32(fdControl); /* get the function_id */
197: if (message) {printf("\n[control] control function_id is %d\n",id);}
198: switch( id ) {
199: case SM_control_kill:
200: if (message) printf("[control] control_kill\n");
201: oxSendResultOfControl(fdControl);
202: sleep(2);
203: myServerExit();
204: break;
205: case SM_control_reset_connection:
206: if (message) printf("[control] control_reset_connection.\n");
207: if (message) printf("Sending the SIGUSR1 signal to %d: ",MyServerPid);
208: r=kill(MyServerPid,SIGUSR1);
209: if (message) printf("Result = %d\n",r);
210: fflush(NULL);
211: oxSendResultOfControlInt32(fdControl,0);
212: break;
213: default:
214: fprintf(stderr,"[control] Unknown control message.\n");
215: fprintf(stderr,"Shutdown the server.");
216: myServerExit();
217: break;
218: }
219: }
220: }
221:
222: void myServerExit() {
223: printf("Sending the kill signal to the child.\n");
224: kill(MyServerPid,SIGKILL);
225: exit();
226: }
227:
228: childServerMain(int fdControl, int fdStream) {
229: int i;
230: close(fdControl); /* close(0); dup(fdStream); */
231: dup2(fdStream,3);
232: dup2(fdStream,4);
233: /*close(0);
234: #include <sys/param.h>
235: for (i=5; i<NOFILE; i++) close(i);
236: */
237: if (PacketMonitor) {
238: if (execl(ServerName,ServerName,"-monitor",NULL)) {
239: fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName);
240: }
241: }else {
242: if (execl(ServerName,ServerName,NULL)) {
243: fprintf(stderr,"%s cannot be executed.\n",ServerName);
244: }
245: }
246: }
247:
248:
249: /* These are dummy. It is defined in stackmachine.c */
250: unlockCtrlCForOx() { ; }
251: restoreLockCtrlCForOx() { ; }
252:
253:
254:
255:
256:
257:
258:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>