⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_nt_service.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 4 页
字号:
                    printf("\n%s failed to stop.\n", name);                }            }            else                printf("StopService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));            CloseServiceHandle(schService);        } else {            printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));        }        CloseServiceHandle(schSCManager);    } else {        printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));    }}static int set_registry_values(SC_HANDLE   schService, char *name,                                char *prp_file){    char  tag[1024];    HKEY  hk;    int rc;    /* Api based */    HANDLE hAdvApi32;    char *szDescription = "Jakarta Tomcat Server";    pfnChangeServiceConfig2_t pfnChangeServiceConfig2;                if((hAdvApi32 = GetModuleHandle("advapi32.dll"))       && ((pfnChangeServiceConfig2 = (pfnChangeServiceConfig2_t)            GetProcAddress(hAdvApi32, "ChangeServiceConfig2A")))) {        (void) pfnChangeServiceConfig2(schService, // Service Handle                                       1,          // SERVICE_CONFIG_DESCRIPTION                                       &szDescription);    } else {        char value[2024];        rc = JK_FALSE;        strcpy(tag, BASE_REGISTRY_LOCATION);        strcat(tag, name);                if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,                                         tag,                                         (DWORD)0,                                                  KEY_WRITE | KEY_READ,                                         &hk)) {            rc = get_registry_config_parameter(hk,                                               IMAGE_NAME,                                                value,                                               sizeof(value));            if(rc) {                strcat(value, " ");                strcat(value, name);                rc = set_registry_config_parameter(hk,                                                   IMAGE_NAME,                                                    value);                if(rc) {                    printf("Registry values were added\n");                    printf("If you have already updated wrapper.properties you may start the %s"                           "service by executing \"jk_nt_service -s %s\" from the command prompt\n",                           name,                           name);                                    }            }            RegCloseKey(hk);        }        if(!rc) {            printf("Error: Failed to update the service command line - %s\n",                    GetLastErrorText(szErr, sizeof(szErr)));                        }    }        strcpy(tag, BASE_REGISTRY_LOCATION);    strcat(tag, name);    strcat(tag, "\\");    strcat(tag, PARAMS_LOCATION);    rc = create_registry_key(tag, &hk);    if(rc) {        rc = set_registry_config_parameter(hk, PRP_LOCATION, prp_file);        if(!rc) {            printf("Error: Can not create value [%s] - %s\n",                     PRP_LOCATION,                     GetLastErrorText(szErr, sizeof(szErr)));                        }        RegCloseKey(hk);    } else {        printf("Error: Can not create key [%s] - %s\n",                 tag,                 GetLastErrorText(szErr, sizeof(szErr)));                    }    return rc;}static void start_jk_service(char *name){    /*     * report the status to the service control manager.     */    if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state                           NO_ERROR,              // exit code                           3000)) {               // wait hint                /*          * create the event object. The control handler function signals         * this event when it receives the "stop" control code.         */        hServerStopEvent = CreateEvent(NULL,    // no security attributes                                       TRUE,    // manual reset event                                       FALSE,   // not-signalled                                       NULL);   // no name        if(hServerStopEvent) {            if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state                                   NO_ERROR,              // exit code                                   20000)) {              // wait hint                HANDLE hTomcat = NULL;                char   szNameBuff[256];                DWORD  lenNameBuff = 256;                char   *szTrueName = name;                SC_HANDLE   schSCManager;                int rc;                schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS );                if(schSCManager) {                    if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) {                        szTrueName = szNameBuff;                    }                    CloseServiceHandle(schSCManager);                }                rc = start_tomcat(szTrueName, &hTomcat);                if(rc && ReportStatusToSCMgr(SERVICE_RUNNING, // service state                                             NO_ERROR,        // exit code                                             0)) {            // wait hint                           HANDLE waitfor[] = { hServerStopEvent, hTomcat};                    DWORD dwIndex = WaitForMultipleObjects(2, waitfor, FALSE, INFINITE);                    switch(dwIndex) {                    case WAIT_OBJECT_0:                        /*                          * Stop order arrived                          */                         ResetEvent(hServerStopEvent);                        stop_tomcat(name, (short)shutdown_port, shutdown_protocol,                                    shutdown_secret, hTomcat);                        break;                    case (WAIT_OBJECT_0 + 1):                        /*                          * Tomcat died !!!                         */                         CloseHandle(hServerStopEvent);                        CloseHandle(hTomcat);                        exit(0); // exit ungracefully so                                 // Service Control Manager                                  // will attempt a restart.                        break;                    default:                        /*                          * some error...                          * close the servlet container and exit                          */                         stop_tomcat(name, (short)shutdown_port, shutdown_protocol,                                    shutdown_secret, hTomcat);                    }                    CloseHandle(hServerStopEvent);                    CloseHandle(hTomcat);                }                            }        }    }    if(hServerStopEvent) {        CloseHandle(hServerStopEvent);    }}static void stop_jk_service(void){    if(hServerStopEvent) {        SetEvent(hServerStopEvent);    }}static void AddToMessageLog(char *lpszMsg){       char    szMsg[2048];    HANDLE  hEventSource;    char *  lpszStrings[2];    printf("Error: %s\n", lpszMsg);    dwErr = GetLastError();    hEventSource = RegisterEventSource(NULL, "Jakrta - Tomcat");    sprintf(szMsg, "%s error: %d", "Jakrta - Tomcat", dwErr);    lpszStrings[0] = szMsg;    lpszStrings[1] = lpszMsg;    if(hEventSource != NULL) {        ReportEvent(hEventSource, // handle of event source            EVENTLOG_ERROR_TYPE,  // event type            0,                    // event category            0,                    // event ID            NULL,                 // current user's SID            2,                    // strings in lpszStrings            0,                    // no bytes of raw data            lpszStrings,          // array of error strings            NULL);                // no raw data        DeregisterEventSource(hEventSource);    }    }////  FUNCTION: GetLastErrorText////  PURPOSE: copies error message text to string////  PARAMETERS://    lpszBuf - destination buffer//    dwSize - size of buffer////  RETURN VALUE://    destination buffer////  COMMENTS://char *GetLastErrorText( char *lpszBuf, DWORD dwSize ){    DWORD dwRet;    char *lpszTemp = NULL;    dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,                          NULL,                          GetLastError(),                          LANG_NEUTRAL,                          (char *)&lpszTemp,                          0,                          NULL);    // supplied buffer is not long enough    if(!dwRet || ((long)dwSize < (long)dwRet+14)) {        lpszBuf[0] = '\0';    } else {        lpszTemp[lstrlen(lpszTemp)-2] = '\0';  //remove cr and newline character        sprintf(lpszBuf, "%s (0x%x)", lpszTemp, GetLastError());    }    if(lpszTemp) {        LocalFree((HLOCAL) lpszTemp );    }    return lpszBuf;}static void stop_tomcat(char *name,                        short port,                         const char *protocol,                        char *secret,                        HANDLE hTomcat){    struct sockaddr_in in;    if(strcasecmp(protocol, "cmd") == 0 ) {        exec_cmd( name, hTomcat, shutdown_cmd);        /* XXX sleep 100 */        TerminateProcess(hTomcat, 0);        return;    }         if(jk_resolve("localhost", port, &in)) {        int sd = jk_open_socket(&in, JK_TRUE, 0, NULL);        if(sd >0) {            int rc = JK_FALSE;            if(strcasecmp(protocol, "catalina") == 0 ) {                char len;                                if( secret==NULL )                    secret="SHUTDOWN";                len=strlen( secret );                                rc = send(sd, secret, len , 0);                if(len == rc) {                    rc = JK_TRUE;                }            } else if(!strcasecmp(protocol, "ajp13")) {                jk_pool_t pool;                jk_msg_buf_t *msg = NULL;                jk_pool_atom_t buf[TINY_POOL_SIZE];                jk_open_pool(&pool, buf, sizeof(buf));                msg = jk_b_new(&pool);                jk_b_set_buffer_size(msg, 512);                 rc = ajp13_marshal_shutdown_into_msgb(msg,                                                       &pool,                                                      NULL);                if( secret!=NULL ) {                    /** will work with old clients, as well as new                     */                    rc = jk_b_append_string(msg, secret);                }                if(rc) {                    jk_b_end(msg, AJP13_PROTO);                        if(0 > jk_tcp_socket_sendfull(sd,                                                   jk_b_get_buff(msg),                                                  jk_b_get_len(msg))) {                        rc = JK_FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -