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