version 1.1.1.1, 1999/10/08 02:12:13 |
version 1.5, 2000/07/30 09:55:40 |
|
|
|
/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.4 2000/01/31 01:34:23 takayama Exp $ */ |
/* nullserver01 */ |
/* nullserver01 */ |
#include <stdio.h> |
#include <stdio.h> |
|
#include <fcntl.h> |
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/socket.h> |
#include <sys/socket.h> |
#include <sys/time.h> |
#include <sys/time.h> |
|
|
#include "ox_kan.h" |
#include "ox_kan.h" |
#include "serversm.h" |
#include "serversm.h" |
|
|
#define SERVERNAME "/home/nobuki/kxx/ox_sm1" |
#define SERVERNAME "ox_sm1" |
/* |
|
#define SERVERNAME "/home/nobuki/kxx/stdserver00" |
|
#define SERVERNAME "/home/ftp/pub/OHP/ox_asir" |
|
*/ |
|
|
|
int OxCritical = 0; |
int OxCritical = 0; |
int OxInterruptFlag = 0; |
int OxInterruptFlag = 0; |
Line 23 int OxInterruptFlag = 0; |
|
Line 21 int OxInterruptFlag = 0; |
|
int SerialCurrentControl; |
int SerialCurrentControl; |
|
|
int MyServerPid; |
int MyServerPid; |
char ServerName[1024]; |
#define SERVERNAME_SIZE 4096 |
|
char ServerName[SERVERNAME_SIZE]; |
int PacketMonitor = 0; |
int PacketMonitor = 0; |
int Quiet = 0; |
int Quiet = 0; |
|
|
int LocalMode = 1; |
int LocalMode = 1; |
int NotifyPortnumber = 0; |
int NotifyPortnumber = 0; |
|
int Do_not_use_control_stream_to_tell_no_server = 1; |
|
static void errorToStartEngine(void); |
|
static int findOxServer(char *server); |
|
static void couldNotFind(char *s); |
|
|
|
|
main(int argc, char *argv[]) { |
main(int argc, char *argv[]) { |
Line 44 main(int argc, char *argv[]) { |
|
Line 47 main(int argc, char *argv[]) { |
|
extern int OpenedSocket; |
extern int OpenedSocket; |
char portfile[1024]; |
char portfile[1024]; |
char *pass; |
char *pass; |
|
int result; |
|
|
strcpy(sname,"localhost"); |
strcpy(sname,"localhost"); |
strcpy(ServerName,SERVERNAME); |
strcpy(ServerName,SERVERNAME); |
i = 1; |
i = 1; |
|
if (argc == 1) { |
|
oxmainUsage(); |
|
exit(); |
|
} |
while (i<argc) { |
while (i<argc) { |
if (strcmp(argv[i],"-host") == 0) { |
if (strcmp(argv[i],"-host") == 0) { |
i++; |
i++; |
Line 70 main(int argc, char *argv[]) { |
|
Line 78 main(int argc, char *argv[]) { |
|
}else if (strcmp(argv[i],"-portfile") == 0) { |
}else if (strcmp(argv[i],"-portfile") == 0) { |
i++; |
i++; |
if (i<argc) { |
if (i<argc) { |
sscanf(argv[i],"%s",portfile); |
sscanf(argv[i],"%s",portfile); |
portControl = 0; |
portControl = 0; |
portStream = 0; |
portStream = 0; |
NotifyPortnumber = 1; |
NotifyPortnumber = 1; |
} |
} |
}else if (strcmp(argv[i],"-pass") == 0) { |
}else if (strcmp(argv[i],"-pass") == 0) { |
i++; |
i++; |
if (i<argc) { |
if (i<argc) { |
pass = argv[i]; |
pass = argv[i]; |
} |
} |
}else { |
}else { |
fprintf(stderr,"Unknown option %s.\n",argv[i]); |
fprintf(stderr,"Unknown option %s.\n",argv[i]); |
Line 87 main(int argc, char *argv[]) { |
|
Line 95 main(int argc, char *argv[]) { |
|
i++; |
i++; |
} |
} |
|
|
|
if (Do_not_use_control_stream_to_tell_no_server) { |
|
if (findOxServer(ServerName) < 0) { |
|
fprintf(stderr,"Sleeping five seconds...\n"); |
|
sleep(5); |
|
exit(-1); |
|
} |
|
} |
|
|
if (reverse) { |
if (reverse) { |
/* The order is very important. */ |
/* The order is very important. */ |
fdControl = socketConnectWithPass(sname,portControl,pass); |
fdControl = socketConnectWithPass(sname,portControl,pass); |
fdStream = socketConnectWithPass(sname,portStream,pass); |
fdStream = socketConnectWithPass(sname,portStream,pass); |
|
|
fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream); |
fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream); |
|
result = 0; |
|
|
|
|
if (portControl != -1) { |
if (portControl != -1) { |
MyServerPid = fork(); |
MyServerPid = fork(); |
if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); |
if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); |
else childServerMain(fdControl,fdStream); |
else result=childServerMain(fdControl,fdStream); |
}else{ |
}else{ |
childServerMain(fdControl,fdStream); |
result=childServerMain(fdControl,fdStream); |
} |
} |
/* This line will be never executed. */ |
/* This line will be never executed in case of success */ |
|
if (result < 0 ) { |
|
errorToStartEngine(); |
|
} |
} |
} |
|
|
/* non-reverse case. */ |
/* non-reverse case. */ |
Line 115 main(int argc, char *argv[]) { |
|
Line 137 main(int argc, char *argv[]) { |
|
fdControl = socketOpen(sname,portControl); |
fdControl = socketOpen(sname,portControl); |
portControl = OpenedSocket; |
portControl = OpenedSocket; |
if (NotifyPortnumber) { |
if (NotifyPortnumber) { |
oxWritePortFile(0,portControl,portfile); |
oxWritePortFile(0,portControl,portfile); |
} |
} |
fdControl = socketAcceptLocal(fdControl); |
fdControl = socketAcceptLocal(fdControl); |
fprintf(stderr,"\n control port %d : Connected.\n",portControl); |
fprintf(stderr,"\n control port %d : Connected.\n",portControl); |
Line 124 main(int argc, char *argv[]) { |
|
Line 146 main(int argc, char *argv[]) { |
|
fdStream = socketOpen(sname,portStream); |
fdStream = socketOpen(sname,portStream); |
portStream = OpenedSocket; |
portStream = OpenedSocket; |
if (NotifyPortnumber) { |
if (NotifyPortnumber) { |
oxWritePortFile(1,portStream,portfile); |
oxWritePortFile(1,portStream,portfile); |
} |
} |
fdStream = socketAcceptLocal(fdStream); |
fdStream = socketAcceptLocal(fdStream); |
fprintf(stderr,"\n stream port %d : Connected.\n",portStream); |
fprintf(stderr,"\n stream port %d : Connected.\n",portStream); |
Line 134 main(int argc, char *argv[]) { |
|
Line 156 main(int argc, char *argv[]) { |
|
fdControl = socketOpen(sname,portControl); |
fdControl = socketOpen(sname,portControl); |
portControl = OpenedSocket; |
portControl = OpenedSocket; |
if (NotifyPortnumber) { |
if (NotifyPortnumber) { |
oxWritePortFile(0,portControl,portfile); |
oxWritePortFile(0,portControl,portfile); |
} |
} |
fdControl = socketAccept(fdControl); |
fdControl = socketAccept(fdControl); |
fprintf(stderr,"\n control port %d : Connected.\n",portControl); |
fprintf(stderr,"\n control port %d : Connected.\n",portControl); |
Line 143 main(int argc, char *argv[]) { |
|
Line 165 main(int argc, char *argv[]) { |
|
fdStream = socketOpen(sname,portStream); |
fdStream = socketOpen(sname,portStream); |
portStream = OpenedSocket; |
portStream = OpenedSocket; |
if (NotifyPortnumber) { |
if (NotifyPortnumber) { |
oxWritePortFile(1,portStream,portfile); |
oxWritePortFile(1,portStream,portfile); |
} |
} |
fdStream = socketAccept(fdStream); |
fdStream = socketAccept(fdStream); |
fprintf(stderr,"\n stream port %d : Connected.\n",portStream); |
fprintf(stderr,"\n stream port %d : Connected.\n",portStream); |
Line 151 main(int argc, char *argv[]) { |
|
Line 173 main(int argc, char *argv[]) { |
|
} |
} |
|
|
|
|
|
result = 0; |
if (portControl != -1) { |
if (portControl != -1) { |
MyServerPid = fork(); |
MyServerPid = fork(); |
if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); |
if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); |
else childServerMain(fdControl,fdStream); |
else result = childServerMain(fdControl,fdStream); |
}else{ |
}else{ |
childServerMain(fdControl,fdStream); |
result = childServerMain(fdControl,fdStream); |
} |
} |
|
if (result < 0) errorToStartEngine(); |
|
} |
|
|
|
static void errorToStartEngine(void) { |
|
fprintf(stderr,"Failed to start the engine. Childing process is terminating.\n"); |
|
/* You have to tell to the control server that there is no engine. |
|
And, the control server must tell the client that there is no |
|
engine. |
|
This part has not yet been implemented. |
|
If you implement this, set Do_not_use_control_stream_to_tell_no_server to |
|
zero. |
|
*/ |
|
sleep(2); |
|
exit(-1); |
} |
} |
|
|
oxmainUsage() { |
oxmainUsage() { |
|
|
fprintf(stderr," ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n"); |
fprintf(stderr," ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n"); |
fprintf(stderr," [-insecure -portfile fname -reverse -pass xxxyyyzzz]"); |
fprintf(stderr," [-insecure -portfile fname -reverse -pass xxxyyyzzz]"); |
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
fprintf(stderr,"Example 1: dc1% ./ox -ox ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1300 -data 1200\n"); |
fprintf(stderr,"-reverse: ox server connects to the client.\n"); |
|
fprintf(stderr," The client must give a one time password to ox server to connect to the client with -pass option.\n"); |
|
fprintf(stderr," The one time password can be seen by ps command, so you must not use this one time password system on an untrustful host.\n"); |
|
fprintf(stderr," The one time password should be sent by a safe communication line like ssh and the ox server should be started by ssh. Do not use rsh\n"); |
|
fprintf(stderr," If -reverse is not given, the client connect to the ox server\n"); |
|
fprintf(stderr," See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n"); |
|
fprintf(stderr,"-insecure : \n"); |
|
fprintf(stderr," If you access to the server from a localhost, you do not need one time password. However, if you access outside of the localhost, a one time password is required. To turn off this restriction, -insecure option is used.\n"); |
|
fprintf(stderr,"\n"); |
|
fprintf(stderr,"If ox fails to find the serverprogram, it tries to look for it in /usr/local/OpenXM/bin and $OpenXM_HOME/bin.\n"); |
|
fprintf(stderr,"\n"); |
|
fprintf(stderr,"Example 1:\n"); |
|
fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1200 -data 1300\n"); |
|
fprintf(stderr,"(client): sm1\n "); |
|
fprintf(stderr," (ox.sm1) run ; \n"); |
fprintf(stderr," sm1>[(dc1.math.kobe-u.ac.jp) 1300 1200] oxconnect /ox.ccc set\n"); |
fprintf(stderr," sm1>[(dc1.math.kobe-u.ac.jp) 1300 1200] oxconnect /ox.ccc set\n"); |
|
fprintf(stderr,"Example 2:\n"); |
|
fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1\n"); |
|
fprintf(stderr,"(client): dc1%% sm1\n "); |
|
fprintf(stderr," (ox.sm1) run ; \n"); |
|
fprintf(stderr," sm1>[(localhost) 1300 1200] oxconnect /ox.ccc set\n"); |
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
} |
} |
|
|
Line 230 childServerMain(int fdControl, int fdStream) { |
|
Line 284 childServerMain(int fdControl, int fdStream) { |
|
close(fdControl); /* close(0); dup(fdStream); */ |
close(fdControl); /* close(0); dup(fdStream); */ |
dup2(fdStream,3); |
dup2(fdStream,3); |
dup2(fdStream,4); |
dup2(fdStream,4); |
/*close(0); |
/*close(0); |
#include <sys/param.h> |
#include <sys/param.h> |
for (i=5; i<NOFILE; i++) close(i); |
for (i=5; i<NOFILE; i++) close(i); |
*/ |
*/ |
|
if (!Do_not_use_control_stream_to_tell_no_server) { |
|
if (findOxServer(ServerName) < 0) { |
|
return(-1); |
|
} |
|
} |
|
fprintf(stderr,"childServerMain: Starting the server %s\n",ServerName); fflush(NULL); |
if (PacketMonitor) { |
if (PacketMonitor) { |
if (execl(ServerName,ServerName,"-monitor",NULL)) { |
if (execl(ServerName,ServerName,"-monitor",NULL)) { |
fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); |
fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); |
|
fflush(NULL); |
|
return(-1); |
} |
} |
}else { |
}else { |
if (execl(ServerName,ServerName,NULL)) { |
if (execl(ServerName,ServerName,NULL)) { |
fprintf(stderr,"%s cannot be executed.\n",ServerName); |
fprintf(stderr,"%s cannot be executed.\n",ServerName); |
|
fflush(NULL); |
|
return(-1); |
} |
} |
} |
} |
|
/* never reached. */ |
} |
} |
|
|
|
|
Line 250 childServerMain(int fdControl, int fdStream) { |
|
Line 315 childServerMain(int fdControl, int fdStream) { |
|
unlockCtrlCForOx() { ; } |
unlockCtrlCForOx() { ; } |
restoreLockCtrlCForOx() { ; } |
restoreLockCtrlCForOx() { ; } |
|
|
|
static int findOxServer(char *server) { |
|
char *p; |
|
char *p2; |
|
int fd; |
|
char *getenv(char *s); |
|
if (strlen(server) == 0) return(-1); |
|
fd = open(server,O_RDONLY); |
|
if (fd >= 0) { |
|
fprintf(stderr,"Starting OX server : %s\n",server); |
|
close(fd); |
|
return(0); |
|
} |
|
if (server[0] == '/') { |
|
couldNotFind(server); |
|
return(-1); |
|
} |
|
fprintf(stderr,"The server %s was not found. Trying to find it under OpenXM/bin\n",server); |
|
p = getenv("OpenXM_HOME"); |
|
if (p == NULL) { |
|
p = "/usr/local/OpenXM"; |
|
} |
|
p2 = (char *) malloc(sizeof(char)*(strlen(p)+strlen("/bin/")+3+strlen(server))); |
|
if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } |
|
strcpy(p2,p); strcat(p2,"/bin/"); strcat(p2,server); |
|
fd = open(p2,O_RDONLY); |
|
if (fd >= 0) { |
|
fprintf(stderr,"Starting OX server : %s\n",p2); |
|
if (strlen(p2) < SERVERNAME_SIZE) strcpy(server,p2); |
|
else { |
|
couldNotFind("Too long ox server name."); |
|
return(-1); |
|
} |
|
close(fd); |
|
return(0); |
|
} |
|
couldNotFind(p2); |
|
return(-1); |
|
} |
|
|
|
static void couldNotFind(char *s) { |
|
fprintf(stderr,"OX server %s could not be found.\n",s); |
|
} |
|
|
|
|
|
|