version 1.10, 2002/05/02 03:08:28 |
version 1.28, 2016/08/27 00:11:27 |
|
|
/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.9 2001/12/28 01:20:27 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.27 2016/03/30 21:34:03 takayama Exp $ */ |
|
/* Note on IntelMac. [2006.06.05] |
|
SIGINT does not seem to be blocked on the rosetta emulator of ppc |
|
on the IntelMac's. "ox" should be universal binary. |
|
A dirty hack to generate a universal binary of ox is as follows. |
|
(1) Add -arch ppc -arch i386 to CFLAGS in src/kxx/Makefile |
|
and src/kan96xx/plugin/Makefile |
|
(2) Build ox |
|
*/ |
/* nullserver01 */ |
/* nullserver01 */ |
#include <stdio.h> |
#include <stdio.h> |
#include <fcntl.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 <sys/resource.h> |
#include <netinet/in.h> |
#include <netinet/in.h> |
#include <netdb.h> |
#include <netdb.h> |
#include <signal.h> |
#include <signal.h> |
#include <setjmp.h> |
#include <setjmp.h> |
|
#include <stdlib.h> |
/* -lnsl -lsocket /usr/ucblib/libucb.a */ |
/* -lnsl -lsocket /usr/ucblib/libucb.a */ |
#include "ox_kan.h" |
#include "ox_kan.h" |
#include "serversm.h" |
#include "serversm.h" |
|
|
#define SERVERNAME "ox_sm1" |
#define SERVERNAME "ox_sm1" |
|
|
|
extern char **environ; |
int OxCritical = 0; |
int OxCritical = 0; |
int OxInterruptFlag = 0; |
int OxInterruptFlag = 0; |
|
int OxTerminateMode = 0; |
|
|
int SerialCurrentControl; |
int SerialCurrentControl; |
|
|
|
|
int LocalMode = 1; |
int LocalMode = 1; |
int NotifyPortnumber = 0; |
int NotifyPortnumber = 0; |
int Do_not_use_control_stream_to_tell_no_server = 1; |
int Do_not_use_control_stream_to_tell_no_server = 1; |
|
int IgnoreSIGINT = 1; |
|
int Ox_protocol_1999 = 0; |
static void errorToStartEngine(void); |
static void errorToStartEngine(void); |
static int findOxServer(char *server); |
static int findOxServer(char *server); |
static void couldNotFind(char *s); |
static void couldNotFind(char *s); |
#if defined(__CYGWIN__) |
|
int errno; |
|
#endif |
|
/* gcc -v -c hoge.c */ |
/* gcc -v -c hoge.c */ |
|
static void mywait(int m); |
|
|
|
void *sGC_malloc(int n) { |
|
return (void *)malloc(n); |
|
} |
|
|
main(int argc, char *argv[]) { |
main(int argc, char *argv[]) { |
int fd; |
int fd; |
int size; |
int size; |
Line 50 main(int argc, char *argv[]) { |
|
Line 66 main(int argc, char *argv[]) { |
|
int reverse = 0; |
int reverse = 0; |
extern int OpenedSocket; |
extern int OpenedSocket; |
char portfile[1024]; |
char portfile[1024]; |
char *pass; |
char *pass = NULL; |
|
char *passControl = NULL; |
|
char *passData = NULL; |
int result; |
int result; |
int sleepingTime = 0; |
int sleepingTime = 0; |
|
int authEncoding=0; |
|
FILE *fp; |
|
char *stmp; |
|
extern int OxTerminateMode; |
|
|
|
int sighup[]={SIGHUP,-1}; |
|
block_signal(sighup); /* ignore x of xterm */ |
strcpy(sname,"localhost"); |
strcpy(sname,"localhost"); |
strcpy(ServerName,SERVERNAME); |
strcpy(ServerName,SERVERNAME); |
i = 1; |
i = 1; |
if (argc == 1) { |
if (argc == 1) { |
oxmainUsage(); |
oxmainUsage(); |
exit(); |
exit(10); |
} |
} |
while (i<argc) { |
while (i<argc) { |
if (strcmp(argv[i],"-host") == 0) { |
if (strcmp(argv[i],"-host") == 0) { |
Line 80 main(int argc, char *argv[]) { |
|
Line 104 main(int argc, char *argv[]) { |
|
LocalMode = 0; |
LocalMode = 0; |
}else if (strcmp(argv[i],"-reverse") == 0) { |
}else if (strcmp(argv[i],"-reverse") == 0) { |
reverse = 1; |
reverse = 1; |
|
}else if (strcmp(argv[i],"-finish") == 0) { |
|
OxTerminateMode = 1; |
}else if (strcmp(argv[i],"-portfile") == 0) { |
}else if (strcmp(argv[i],"-portfile") == 0) { |
i++; |
i++; |
if (i<argc) { |
if (i<argc) { |
Line 93 main(int argc, char *argv[]) { |
|
Line 119 main(int argc, char *argv[]) { |
|
if (i<argc) { |
if (i<argc) { |
pass = argv[i]; |
pass = argv[i]; |
} |
} |
|
}else if (strcmp(argv[i],"-passData") == 0) { |
|
i++; |
|
if (i<argc) { |
|
passData = argv[i]; |
|
} |
|
}else if (strcmp(argv[i],"-passControl") == 0) { |
|
i++; |
|
if (i<argc) { |
|
passControl = argv[i]; |
|
} |
}else if (strcmp(argv[i],"-wait") == 0) { |
}else if (strcmp(argv[i],"-wait") == 0) { |
i++; |
i++; |
if (i<argc) { |
if (i<argc) { |
sscanf(argv[i],"%d",&sleepingTime); |
sscanf(argv[i],"%d",&sleepingTime); |
} |
} |
|
}else if (strcmp(argv[i],"-authEncoding") == 0) { |
|
i++; |
|
if (strcmp(argv[i],"file") == 0) { |
|
authEncoding = 1; |
|
}else{ |
|
fprintf(stderr,"Unknown -authEncoding %s.\n",argv[i]); |
|
oxmainUsage(); exit(10); |
|
} |
|
}else if (strcmp(argv[i],"-ignoreSIGINT") == 0) { |
|
i++; |
|
if (i<argc) { |
|
sscanf(argv[i],"%d",&IgnoreSIGINT); |
|
} |
|
}else if (strcmp(argv[i],"-protocol_1999") == 0) { |
|
Ox_protocol_1999=1; |
}else { |
}else { |
fprintf(stderr,"Unknown option %s.\n",argv[i]); |
fprintf(stderr,"Unknown option %s.\n",argv[i]); |
oxmainUsage(); exit(10); |
oxmainUsage(); exit(10); |
Line 119 main(int argc, char *argv[]) { |
|
Line 170 main(int argc, char *argv[]) { |
|
fprintf(stderr,"\nTrying to connect\n"); |
fprintf(stderr,"\nTrying to connect\n"); |
} |
} |
|
|
|
if ((pass != NULL) && (passData == NULL)) { |
|
passData = pass; |
|
} |
|
if ((pass != NULL) && (passControl == NULL)) { |
|
passControl = pass; |
|
} |
|
|
|
/* Decrypt passControl and passData, here. Lookup cryptmethod. */ |
|
if (authEncoding == 1) { |
|
stmp = (char *)sGC_malloc(strlen(getenv("HOME"))+strlen(passControl)+ |
|
strlen(passData)+128); |
|
sprintf(stmp,"%s/.openxm/tmp.opt/%s",(char *)getenv("HOME"),passControl); |
|
fp = fopen(stmp,"r"); |
|
if (fp == NULL) { fprintf(stderr,"passControl file %s is not found.\n",stmp); exit(1);} |
|
fgets(stmp,127,fp); passControl = stmp; fclose(fp); |
|
|
|
stmp = (char *)sGC_malloc(strlen(getenv("HOME"))+strlen(passControl)+ |
|
strlen(passData)+128); |
|
sprintf(stmp,"%s/.openxm/tmp.opt/%s",(char *)getenv("HOME"),passData); |
|
fp = fopen(stmp,"r"); |
|
if (fp == NULL) { fprintf(stderr,"passData file %s is not found.\n",stmp); exit(1);} |
|
fgets(stmp,127,fp); passData = stmp; fclose(fp); |
|
} |
|
|
if (reverse) { |
if (reverse) { |
/* The order is very important. */ |
/* The order is very important. */ |
fdControl = socketConnectWithPass(sname,portControl,pass); |
fdControl = socketConnectWithPass(sname,portControl,passControl); |
fdStream = socketConnectWithPass(sname,portStream,pass); |
fdStream = socketConnectWithPass(sname,portStream,passData); |
|
|
fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream); |
fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream); |
result = 0; |
result = 0; |
|
|
|
|
|
if ((fdControl < 0) || (fdStream < 0)) { |
|
fprintf(stderr,"Waiting for 10 seconds to show an error.\n"); |
|
sleep(10); |
|
} |
|
|
if (portControl != -1) { |
if (portControl != -1) { |
MyServerPid = fork(); |
MyServerPid = fork(); |
if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); |
if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream); |
Line 188 main(int argc, char *argv[]) { |
|
Line 268 main(int argc, char *argv[]) { |
|
} |
} |
} |
} |
|
|
|
if (passControl != NULL) { |
|
char *s; int mm; |
|
fprintf(stderr,"passControl\n"); |
|
mm = strlen(passControl); |
|
s = (char *) malloc(mm+1); |
|
if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(1); } |
|
if (read(fdControl,s,mm+1) < 0) { |
|
fprintf(stderr,"Read error to read passControl\n"); sleep(5); exit(1); |
|
} |
|
s[mm] = 0; |
|
if (strcmp(s,passControl) != 0) { |
|
fprintf(stderr,"s=%s and passControl=%s do not match.\n",s,passControl); sleep(5); exit(1); |
|
} |
|
free(s); |
|
} |
|
if (passData != NULL) { |
|
char *s; int mm; |
|
mm = strlen(passData); |
|
fprintf(stderr,"passData\n"); |
|
s = (char *) malloc(mm+1); |
|
if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(1); } |
|
if (read(fdStream,s,mm+1) < 0) { |
|
fprintf(stderr,"Read error to read passData\n"); |
|
errorToStartEngine(); |
|
} |
|
if (strcmp(s,passData) != 0) { |
|
fprintf(stderr,"s=%s and passData=%s do not match.\n",s,passData); |
|
errorToStartEngine(); |
|
} |
|
free(s); |
|
} |
|
|
|
if ((fdControl < 0) || (fdStream < 0)) { |
|
fprintf(stderr,"Waiting for 10 seconds to show an error.\n"); |
|
sleep(10); |
|
} |
|
|
|
|
result = 0; |
result = 0; |
if (portControl != -1) { |
if (portControl != -1) { |
MyServerPid = fork(); |
MyServerPid = fork(); |
Line 209 static void errorToStartEngine(void) { |
|
Line 326 static void errorToStartEngine(void) { |
|
If you implement this, set Do_not_use_control_stream_to_tell_no_server to |
If you implement this, set Do_not_use_control_stream_to_tell_no_server to |
zero. |
zero. |
*/ |
*/ |
sleep(2); |
sleep(10); |
exit(-1); |
exit(-1); |
} |
} |
|
|
oxmainUsage() { |
oxmainUsage() { |
fprintf(stderr,"Usage: \n"); |
fprintf(stderr,"Usage: \n"); |
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 -passControl xxxyyyzzz -passData pppqqqrrr]"); |
|
fprintf(stderr," [-finish] [-wait seconds] [-authEncoding [file]]"); |
|
fprintf(stderr," [-ignoreSIGINT [1|0]]"); |
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
fprintf(stderr,"-reverse: ox server connects to the client.\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 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 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," 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," (The option -pass is obsolete.)\n"); |
fprintf(stderr," If -reverse is not given, the client connect to the ox server\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," See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n"); |
fprintf(stderr,"-insecure : \n"); |
fprintf(stderr,"-insecure : \n"); |
Line 250 parentServerMain(int fdControl, int fdStream) { |
|
Line 370 parentServerMain(int fdControl, int fdStream) { |
|
int r; |
int r; |
int message = 1; |
int message = 1; |
int controlByteOrder; |
int controlByteOrder; |
|
extern OxTerminateMode; |
|
extern void myServerExit(int m); |
|
|
extern void myServerExit(); |
int sigchld[]={SIGCHLD,-1}; |
|
unblock_signal(sigchld); |
controlByteOrder = oxTellMyByteOrder(fdControl); |
if (OxTerminateMode) { |
|
/* |
|
OxTerminateMode cannot be used if you run ox by xterm -exec ox ... |
|
*/ |
|
if (fork()) { |
|
close(fdControl); close(fdStream); |
|
/* Parent */ |
|
exit(0); /*Tell the caller that launching is successfully finished.*/ |
|
} |
|
} |
|
|
|
controlByteOrder = oxTellMyByteOrder(fdControl,fdControl); |
/* Set the network byte order. */ |
/* Set the network byte order. */ |
fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder); |
fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder); |
|
|
|
int sigint[]={SIGINT,-1}; |
signal(SIGINT,myServerExit); |
set_signal(sigint[0],myServerExit); |
|
unblock_signal(sigint); |
while(1) { |
while(1) { |
mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl); |
mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl); |
/* get the message_tag */ |
/* get the message_tag */ |
Line 268 parentServerMain(int fdControl, int fdStream) { |
|
Line 402 parentServerMain(int fdControl, int fdStream) { |
|
switch( id ) { |
switch( id ) { |
case SM_control_kill: |
case SM_control_kill: |
if (message) printf("[control] control_kill\n"); |
if (message) printf("[control] control_kill\n"); |
oxSendResultOfControl(fdControl); |
/* oxSendResultOfControl(fdControl); */ |
sleep(2); |
sleep(2); |
myServerExit(); |
myServerExit(0); |
break; |
break; |
case SM_control_reset_connection: |
case SM_control_reset_connection: |
if (message) printf("[control] control_reset_connection.\n"); |
if (message) printf("[control] control_reset_connection.\n"); |
if (message) printf("Sending the SIGUSR1 signal to %d: ",MyServerPid); |
if (message) printf("Sending the SIGUSR1 signal to %d: ",MyServerPid); |
r=kill(MyServerPid,SIGUSR1); |
r=kill(MyServerPid,SIGUSR1); |
if (message) printf("Result = %d\n",r); |
if (message) printf("Result = %d\n",r); |
|
if (Ox_protocol_1999) { |
|
if (message) printf("[obsolete protocol of ox-rfc-100 in 1999] Sending the result packet to the control channel.\n",r); |
|
oxSendResultOfControlInt32(fdControl,0); |
|
} |
fflush(NULL); |
fflush(NULL); |
/* oxSendResultOfControlInt32(fdControl,0); */ |
/* oxSendResultOfControlInt32(fdControl,0); */ |
break; |
break; |
default: |
default: |
fprintf(stderr,"[control] Unknown control message.\n"); |
fprintf(stderr,"[control] Unknown control message.\n"); |
fprintf(stderr,"Shutdown the server."); |
fprintf(stderr,"Shutdown the server."); |
myServerExit(); |
myServerExit(0); |
break; |
break; |
} |
} |
} |
} |
} |
} |
|
|
void myServerExit() { |
void myServerExit(int m) { |
printf("Sending the kill signal to the child.\n"); |
printf("Sending the kill signal to the child.\n"); |
kill(MyServerPid,SIGKILL); |
kill(MyServerPid,SIGKILL); |
exit(); |
exit(0); |
} |
} |
|
|
childServerMain(int fdControl, int fdStream) { |
childServerMain(int fdControl, int fdStream) { |
int i; |
int i; |
|
struct rlimit res; |
close(fdControl); /* close(0); dup(fdStream); */ |
close(fdControl); /* close(0); dup(fdStream); */ |
dup2(fdStream,3); |
dup2(fdStream,3); |
dup2(fdStream,4); |
dup2(fdStream,4); |
Line 310 childServerMain(int fdControl, int fdStream) { |
|
Line 449 childServerMain(int fdControl, int fdStream) { |
|
} |
} |
} |
} |
fprintf(stderr,"childServerMain: Starting the server %s\n",ServerName); fflush(NULL); |
fprintf(stderr,"childServerMain: Starting the server %s\n",ServerName); fflush(NULL); |
|
|
|
/* |
|
{ |
|
int i; |
|
i=0; |
|
while (environ[i] != NULL) { |
|
fprintf(stderr,"%s ",environ[i++]); |
|
} |
|
fprintf(stderr,"\n"); |
|
} |
|
*/ |
|
/* bug: xterm of potato does not seem to pass the LD_LIBRARY_PATH. |
|
So, the new gc does not work. |
|
it is an workaround for OpenXM */ |
|
if (getenv("LD_LIBRARY_PATH") == (char *)NULL) { |
|
char *s,*o; |
|
fprintf(stderr,"Hmm... LD_LIBRARY_PATH does not seem to be set.\n"); |
|
o = getenv("OpenXM_HOME"); |
|
if (o == NULL) { |
|
fprintf(stderr,"Giving up to set the LD_LIBRARY_PATH variable.\n"); |
|
}else{ |
|
s = (char *)malloc(strlen(o)+64); |
|
sprintf(s,"LD_LIBRARY_PATH=%s/lib",o); |
|
putenv(s); |
|
} |
|
} |
|
getrlimit(RLIMIT_STACK,&res); |
|
if (res.rlim_cur < 65536000) { |
|
fprintf(stderr,"RLIMIT_STACK is increased to 65Mbytes by setrlimit.\n"); |
|
res.rlim_cur = 65536000; |
|
setrlimit(RLIMIT_STACK,&res); |
|
} |
|
|
|
int sigint[]={SIGINT,-1}; |
|
if (IgnoreSIGINT) { block_signal(sigint); fprintf(stderr,"SIGING\n");} |
|
|
if (PacketMonitor) { |
if (PacketMonitor) { |
if (execl(ServerName,ServerName,"-monitor",NULL)) { |
if (execle(ServerName,ServerName,"-monitor",NULL,environ)) { |
fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); |
fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName); |
fflush(NULL); |
fflush(NULL); |
return(-1); |
return(-1); |
} |
} |
}else { |
}else { |
if (execl(ServerName,ServerName,NULL)) { |
if (execle(ServerName,ServerName,NULL,environ)) { |
fprintf(stderr,"%s cannot be executed.\n",ServerName); |
fprintf(stderr,"%s cannot be executed.\n",ServerName); |
fflush(NULL); |
fflush(NULL); |
return(-1); |
return(-1); |
Line 334 restoreLockCtrlCForOx() { ; } |
|
Line 509 restoreLockCtrlCForOx() { ; } |
|
static int findOxServer(char *server) { |
static int findOxServer(char *server) { |
char *p; |
char *p; |
char *p2; |
char *p2; |
int fd; |
|
char *getenv(char *s); |
|
if (strlen(server) == 0) return(-1); |
if (strlen(server) == 0) return(-1); |
/* fd = open(server,O_RDONLY); */ |
/* fd = open(server,O_RDONLY); */ |
fd = access(server,X_OK&R_OK); |
if (access(server,X_OK&R_OK) == 0) { |
if (fd >= 0) { |
|
fprintf(stderr,"Starting OX server : %s\n",server); |
fprintf(stderr,"Starting OX server : %s\n",server); |
close(fd); |
|
return(0); |
return(0); |
} |
} |
if (server[0] == '/') { |
if (server[0] == '/') { |
Line 357 static int findOxServer(char *server) { |
|
Line 528 static int findOxServer(char *server) { |
|
if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } |
if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } |
strcpy(p2,p); strcat(p2,"/bin/"); strcat(p2,server); |
strcpy(p2,p); strcat(p2,"/bin/"); strcat(p2,server); |
/* fd = open(p2,O_RDONLY); */ |
/* fd = open(p2,O_RDONLY); */ |
fd = access(p2,X_OK&R_OK); |
if (access(p2,X_OK&R_OK) == 0) { |
if (fd >= 0) { |
|
fprintf(stderr,"Starting OX server : %s\n",p2); |
fprintf(stderr,"Starting OX server : %s\n",p2); |
if (strlen(p2) < SERVERNAME_SIZE) strcpy(server,p2); |
if (strlen(p2) < SERVERNAME_SIZE) strcpy(server,p2); |
else { |
else { |
couldNotFind("Too long ox server name."); |
couldNotFind("Too long ox server name."); |
return(-1); |
return(-1); |
} |
} |
close(fd); |
|
return(0); |
return(0); |
} |
} |
couldNotFind(p2); |
couldNotFind(p2); |
Line 377 static void couldNotFind(char *s) { |
|
Line 546 static void couldNotFind(char *s) { |
|
} |
} |
|
|
|
|
|
static void mywait(int m) { |
|
int status; |
|
int pid; |
|
int i,j; |
|
/* signal(SIGCHLD,SIG_IGN); */ |
|
pid = wait(&status); |
|
fprintf(stderr,"Control: child process %d is exiting.\n",pid); |
|
fprintf(stderr,"Control: Shutting down the control server.\n"); |
|
sleep(2); |
|
exit(0); |
|
} |
|
|
|
|