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