| version 1.24, 2006/06/05 00:25:50 |
version 1.30, 2020/10/07 07:47:23 |
|
|
| /* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.23 2006/02/25 09:11:10 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.29 2016/09/26 11:43:38 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/socket.h> |
#include <sys/socket.h> |
| #include <sys/time.h> |
#include <sys/time.h> |
| #include <sys/resource.h> |
#include <sys/resource.h> |
| |
#include <sys/wait.h> |
| #include <netinet/in.h> |
#include <netinet/in.h> |
| #include <netdb.h> |
#include <netdb.h> |
| #include <signal.h> |
#include <signal.h> |
|
|
| |
|
| #define SERVERNAME "ox_sm1" |
#define SERVERNAME "ox_sm1" |
| |
|
| |
void oxmainUsage(); |
| |
void parentServerMain(int fdControl, int fdStream); |
| |
int childServerMain(int fdControl, int fdStream); |
| |
void unlockCtrlCForOx(); |
| |
void restoreLockCtrlCForOx(); |
| |
|
| |
|
| extern char **environ; |
extern char **environ; |
| int OxCritical = 0; |
int OxCritical = 0; |
| int OxInterruptFlag = 0; |
int OxInterruptFlag = 0; |
| Line 35 int LocalMode = 1; |
|
| Line 51 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 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); |
| /* gcc -v -c hoge.c */ |
/* gcc -v -c hoge.c */ |
| static void mywait(); |
static void mywait(int m); |
| |
|
| void *sGC_malloc(int n) { |
void *sGC_malloc(int n) { |
| return (void *)malloc(n); |
return (void *)malloc(n); |
| } |
} |
| |
|
| main(int argc, char *argv[]) { |
void main(int argc, char *argv[]) { |
| int fd; |
int fd; |
| int size; |
int size; |
| char sname[1024]; |
char sname[1024]; |
| Line 67 main(int argc, char *argv[]) { |
|
| Line 84 main(int argc, char *argv[]) { |
|
| char *stmp; |
char *stmp; |
| extern int OxTerminateMode; |
extern int OxTerminateMode; |
| |
|
| signal(SIGHUP,SIG_IGN); /* ignore x of xterm */ |
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; |
| Line 135 main(int argc, char *argv[]) { |
|
| Line 153 main(int argc, char *argv[]) { |
|
| }else if (strcmp(argv[i],"-ignoreSIGINT") == 0) { |
}else if (strcmp(argv[i],"-ignoreSIGINT") == 0) { |
| i++; |
i++; |
| if (i<argc) { |
if (i<argc) { |
| IgnoreSIGINT = argv[i]; |
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 172 main(int argc, char *argv[]) { |
|
| Line 192 main(int argc, char *argv[]) { |
|
| sprintf(stmp,"%s/.openxm/tmp.opt/%s",(char *)getenv("HOME"),passControl); |
sprintf(stmp,"%s/.openxm/tmp.opt/%s",(char *)getenv("HOME"),passControl); |
| fp = fopen(stmp,"r"); |
fp = fopen(stmp,"r"); |
| if (fp == NULL) { fprintf(stderr,"passControl file %s is not found.\n",stmp); exit(1);} |
if (fp == NULL) { fprintf(stderr,"passControl file %s is not found.\n",stmp); exit(1);} |
| fgets(stmp,127,fp); passControl = stmp; fclose(fp); |
{char *rrr; rrr=fgets(stmp,127,fp);} passControl = stmp; fclose(fp); |
| |
|
| stmp = (char *)sGC_malloc(strlen(getenv("HOME"))+strlen(passControl)+ |
stmp = (char *)sGC_malloc(strlen(getenv("HOME"))+strlen(passControl)+ |
| strlen(passData)+128); |
strlen(passData)+128); |
| sprintf(stmp,"%s/.openxm/tmp.opt/%s",(char *)getenv("HOME"),passData); |
sprintf(stmp,"%s/.openxm/tmp.opt/%s",(char *)getenv("HOME"),passData); |
| fp = fopen(stmp,"r"); |
fp = fopen(stmp,"r"); |
| if (fp == NULL) { fprintf(stderr,"passData file %s is not found.\n",stmp); exit(1);} |
if (fp == NULL) { fprintf(stderr,"passData file %s is not found.\n",stmp); exit(1);} |
| fgets(stmp,127,fp); passData = stmp; fclose(fp); |
{char *rrr; rrr=fgets(stmp,127,fp);} passData = stmp; fclose(fp); |
| } |
} |
| |
|
| if (reverse) { |
if (reverse) { |
| Line 318 static void errorToStartEngine(void) { |
|
| Line 338 static void errorToStartEngine(void) { |
|
| exit(-1); |
exit(-1); |
| } |
} |
| |
|
| oxmainUsage() { |
void 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 -passControl xxxyyyzzz -passData pppqqqrrr]"); |
fprintf(stderr," [-insecure -portfile fname -reverse -passControl xxxyyyzzz -passData pppqqqrrr]"); |
|
|
| fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
| } |
} |
| |
|
| parentServerMain(int fdControl, int fdStream) { |
void parentServerMain(int fdControl, int fdStream) { |
| int id; |
int id; |
| int mtag; |
int mtag; |
| int size; |
int size; |
| Line 358 parentServerMain(int fdControl, int fdStream) { |
|
| Line 378 parentServerMain(int fdControl, int fdStream) { |
|
| int r; |
int r; |
| int message = 1; |
int message = 1; |
| int controlByteOrder; |
int controlByteOrder; |
| extern OxTerminateMode; |
extern int OxTerminateMode; |
| extern void myServerExit(); |
extern void myServerExit(int m); |
| |
|
| signal(SIGCHLD,mywait); |
int sigchld[]={SIGCHLD,-1}; |
| |
unblock_signal(sigchld); |
| if (OxTerminateMode) { |
if (OxTerminateMode) { |
| /* |
/* |
| OxTerminateMode cannot be used if you run ox by xterm -exec ox ... |
OxTerminateMode cannot be used if you run ox by xterm -exec ox ... |
| Line 377 parentServerMain(int fdControl, int fdStream) { |
|
| Line 398 parentServerMain(int fdControl, int fdStream) { |
|
| /* 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); |
| |
*/ |
| |
mysignal(SIGINT,SIG_IGN); |
| while(1) { |
while(1) { |
| mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl); |
mtag = oxfdGetOXheader(fdControl,&SerialCurrentControl); |
| /* get the message_tag */ |
/* get the message_tag */ |
| Line 388 parentServerMain(int fdControl, int fdStream) { |
|
| Line 412 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. r=%d\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(0); |
exit(0); |
| } |
} |
| |
|
| childServerMain(int fdControl, int fdStream) { |
int childServerMain(int fdControl, int fdStream) { |
| int i; |
int i; |
| struct rlimit res; |
struct rlimit res; |
| close(fdControl); /* close(0); dup(fdStream); */ |
close(fdControl); /* close(0); dup(fdStream); */ |
| Line 464 childServerMain(int fdControl, int fdStream) { |
|
| Line 492 childServerMain(int fdControl, int fdStream) { |
|
| setrlimit(RLIMIT_STACK,&res); |
setrlimit(RLIMIT_STACK,&res); |
| } |
} |
| |
|
| if (IgnoreSIGINT) signal(SIGINT, SIG_IGN); |
// int sigint[]={SIGINT,-1}; |
| |
// if (IgnoreSIGINT) { block_signal(sigint); fprintf(stderr,"SIGING\n");} |
| |
if (IgnoreSIGINT) { mysignal(SIGINT,SIG_IGN); fprintf(stderr,"SIG_ING\n");} |
| |
|
| if (PacketMonitor) { |
if (PacketMonitor) { |
| if (execle(ServerName,ServerName,"-monitor",NULL,environ)) { |
if (execle(ServerName,ServerName,"-monitor",NULL,environ)) { |
| Line 484 childServerMain(int fdControl, int fdStream) { |
|
| Line 514 childServerMain(int fdControl, int fdStream) { |
|
| |
|
| |
|
| /* These are dummy. It is defined in stackmachine.c */ |
/* These are dummy. It is defined in stackmachine.c */ |
| unlockCtrlCForOx() { ; } |
void unlockCtrlCForOx() { ; } |
| restoreLockCtrlCForOx() { ; } |
void restoreLockCtrlCForOx() { ; } |
| |
|
| static int findOxServer(char *server) { |
static int findOxServer(char *server) { |
| char *p; |
char *p; |
| Line 527 static void couldNotFind(char *s) { |
|
| Line 557 static void couldNotFind(char *s) { |
|
| } |
} |
| |
|
| |
|
| static void mywait() { |
static void mywait(int m) { |
| int status; |
int status; |
| int pid; |
int pid; |
| int i,j; |
int i,j; |