00001
00002
00003
00004
00005
00006 #include "reconstants.h"
00007 #include "irodsXmsgServer.h"
00008 #include "xmsgLib.h"
00009 #include "rsGlobal.h"
00010 #include "miscServerFunct.h"
00011
00012 int loopCnt=-1;
00013
00014
00015 int
00016 main(int argc, char **argv)
00017 {
00018 int c;
00019 int runMode = IRODS_SERVER;
00020 int flagval = 0;
00021 char *logDir = NULL;
00022 char *tmpStr;
00023 int logFd;
00024
00025 ProcessType = XMSG_SERVER_PT;
00026
00027 #ifdef RUN_SERVER_AS_ROOT
00028 #ifndef windows_platform
00029 if (initServiceUser() < 0) {
00030 exit (1);
00031 }
00032 #endif
00033 #endif
00034
00035 #ifndef _WIN32
00036 signal(SIGINT, signalExit);
00037 signal(SIGHUP, signalExit);
00038 signal(SIGTERM, signalExit);
00039 signal(SIGUSR1, signalExit);
00040 signal(SIGPIPE, rsPipSigalHandler);
00041
00042 #endif
00043
00044
00045 tmpStr = getenv (SP_LOG_SQL);
00046 if (tmpStr != NULL) {
00047 rodsLogSqlReq(1);
00048 }
00049
00050
00051 tmpStr = getenv (SP_LOG_LEVEL);
00052 if (tmpStr != NULL) {
00053 int i;
00054 i = atoi(tmpStr);
00055 rodsLogLevel(i);
00056 } else {
00057 rodsLogLevel(LOG_NOTICE);
00058 }
00059
00060 while ((c=getopt(argc, argv,"sSc:vD:")) != EOF) {
00061 switch (c) {
00062 case 's':
00063 runMode = SINGLE_PASS;
00064 break;
00065 case 'S':
00066 runMode = STANDALONE_SERVER;
00067 break;
00068 case 'v':
00069 flagval |= v_FLAG;
00070 break;
00071 case 'c':
00072 loopCnt = atoi(optarg);
00073 break;
00074 case 'D':
00075 logDir = strdup (optarg);
00076 break;
00077 default:
00078 usage (argv[0]);
00079 exit (1);
00080 }
00081 }
00082
00083 if ((logFd = logFileOpen (runMode, logDir, XMSG_SVR_LOGFILE)) < 0) {
00084 exit (1);
00085 }
00086
00087 daemonize (runMode, logFd);
00088
00089
00090 xmsgServerMain ();
00091 sleep(5);
00092 exit (0);
00093 }
00094
00095 int usage (char *prog)
00096 {
00097 fprintf(stderr, "Usage: %s [-scva] [-D logDir] \n",prog);
00098 return 0;
00099 }
00100
00101 int
00102 xmsgServerMain ()
00103 {
00104 int status = 0;
00105 rsComm_t rsComm;
00106 rsComm_t svrComm;
00107
00108 fd_set sockMask;
00109 int numSock;
00110 int newSock;
00111
00112 initThreadEnv ();
00113 initXmsgHashQue ();
00114
00115 status = startXmsgThreads ();
00116
00117 if (status < 0) {
00118 rodsLog (LOG_ERROR,
00119 "xmsgServerMain: startXmsgThreads error. status = %d", status);
00120 return status;
00121 }
00122
00123 status = initRsComm (&rsComm);
00124
00125 if (status < 0) {
00126 rodsLog (LOG_ERROR, "xmsgServerMain: initRsComm error. status = %d",
00127 status);
00128 return status;
00129 }
00130
00131 status = initRsComm (&svrComm);
00132
00133 if (status < 0) {
00134 rodsLog (LOG_ERROR, "xmsgServerMain: initRsComm error. status = %d",
00135 status);
00136 return status;
00137 }
00138
00139 status = initAgent (RULE_ENGINE_NO_CACHE, &rsComm);
00140
00141 if (status < 0) {
00142 rodsLog (LOG_ERROR, "xmsgServerMain: initServer error. status = %d",
00143 status);
00144 return (status);
00145 }
00146
00147
00148 svrComm.sock = sockOpenForInConn (&svrComm, &svrComm.myEnv.xmsgPort, NULL,
00149 SOCK_STREAM);
00150
00151 if (svrComm.sock < 0) {
00152 rodsLog (LOG_NOTICE, "serverMain: sockOpenForInConn error. status = %d",
00153 svrComm.sock);
00154 exit (1);
00155 }
00156
00157 listen (svrComm.sock, MAX_LISTEN_QUE);
00158
00159 FD_ZERO(&sockMask);
00160
00161 rodsLog (LOG_NOTICE, "rodsServer version %s is up", RODS_REL_VERSION);
00162
00163 while (1) {
00164 FD_SET(svrComm.sock, &sockMask);
00165 while ((numSock = select (svrComm.sock + 1, &sockMask,
00166 (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL)) < 0) {
00167
00168 if (errno == EINTR) {
00169 rodsLog (LOG_NOTICE, "serverMain: select() interrupted");
00170 FD_SET(svrComm.sock, &sockMask);
00171 continue;
00172 } else {
00173 rodsLog (LOG_NOTICE, "serverMain: select() error, errno = %d",
00174 errno);
00175 return (-1);
00176 }
00177 }
00178
00179 newSock = rsAcceptConn (&svrComm);
00180
00181 if (newSock < 0) {
00182 rodsLog (LOG_NOTICE,
00183 "serverMain: acceptConn () error, errno = %d", errno);
00184 continue;
00185 }
00186
00187
00188 addReqToQue (newSock);
00189
00190 if (loopCnt > 0) {
00191 loopCnt--;
00192 if (loopCnt == 0){
00193 return(0);
00194 }
00195 }
00196
00197
00198 }
00199
00200
00201
00202 }
00203