Changeset 62 in Main for trunk/Server/main.c


Ignore:
Timestamp:
Sep 19, 2024, 5:02:26 AM (2 months ago)
Author:
Nishi
Message:

add installer.sh

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Server/main.c

    r51 r62  
    1515
    1616#include <cm_log.h>
     17#include <cm_string.h>
    1718
    1819#include "tw_config.h"
     
    2627extern bool cm_do_log;
    2728extern struct tw_config config;
     29extern FILE* logfile;
    2830
    2931char tw_server[2048];
    3032
     33int startup(int argc, char** argv);
     34
     35#ifdef SERVICE
     36SERVICE_STATUS status;
     37SERVICE_STATUS_HANDLE status_handle;
     38
     39void WINAPI servhandler(DWORD control){
     40        switch(control){
     41                case SERVICE_CONTROL_STOP:
     42                case SERVICE_CONTROL_SHUTDOWN:
     43                        status.dwCurrentState = SERVICE_STOP_PENDING;
     44                        break;
     45        }
     46        SetServiceStatus(status_handle, &status);
     47}
     48
     49void WINAPI servmain(DWORD argc, LPSTR* argv){
     50        logfile = fopen(PREFIX "/logs/tewi.log", "a");
     51        if(logfile == NULL) logfile = stderr;
     52        status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
     53        status.dwCurrentState = SERVICE_START_PENDING;
     54        status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
     55        status.dwWin32ExitCode = NO_ERROR;
     56        status.dwServiceSpecificExitCode = 0;
     57        status.dwCheckPoint = 0;
     58        status.dwWaitHint = 0;
     59        status_handle = RegisterServiceCtrlHandler("Tewi HTTPd", servhandler);
     60        if(status_handle == NULL) return;
     61        if(SetServiceStatus(status_handle, &status) == 0) return;
     62        int st = startup(argc, argv);
     63        if(st != -1){
     64                status.dwWin32ExitCode = NO_ERROR;
     65                status.dwServiceSpecificExitCode = st;
     66                status.dwCurrentState = SERVICE_STOPPED;
     67                SetServiceStatus(status_handle, &status);
     68                return;
     69        }
     70        status.dwCurrentState = SERVICE_RUNNING;
     71        SetServiceStatus(status_handle, &status);
     72        tw_server_loop();
     73        status.dwCurrentState = SERVICE_STOPPED;
     74        SetServiceStatus(status_handle, &status);
     75}
     76#endif
     77
    3178int main(int argc, char** argv) {
     79        logfile = stderr;
     80#ifdef SERVICE
     81        SERVICE_TABLE_ENTRY table[] = {{"Tewi HTTPd", servmain}, {NULL, NULL}};
     82        StartServiceCtrlDispatcher(table);
     83#else
     84        int st = startup(argc, argv);
     85        if(st != -1) return st;
     86        tw_server_loop();
     87#endif
     88}
     89
     90int startup(int argc, char** argv){
    3291        int i;
    3392        const char* confpath = PREFIX "/etc/tewi.conf";
    34         for(i = 1; i < argc; i++) {
    35                 if(argv[i][0] == '-') {
    36                         if(strcmp(argv[i], "--verbose") == 0 || strcmp(argv[i], "-v") == 0) {
    37                                 if(!cm_do_log) {
    38                                         cm_do_log = true;
    39 #ifndef NO_SSL
    40                                         cm_log("", "This is Tewi HTTPd, version %s, using %s", tw_get_version(), OPENSSL_VERSION_TEXT);
    41 #else
    42                                         cm_log("", "This is Tewi HTTPd, version %s", tw_get_version());
    43 #endif
     93        if(argv != NULL){
     94                for(i = 1; i < argc; i++) {
     95                        if(argv[i][0] == '-') {
     96                                if(strcmp(argv[i], "--verbose") == 0 || strcmp(argv[i], "-v") == 0) {
     97                                        if(!cm_do_log) {
     98                                                cm_do_log = true;
     99        #ifndef NO_SSL
     100                                                cm_log("", "This is Tewi HTTPd, version %s, using %s", tw_get_version(), OPENSSL_VERSION_TEXT);
     101        #else
     102                                                cm_log("", "This is Tewi HTTPd, version %s", tw_get_version());
     103        #endif
     104                                        } else {
     105                                                cm_do_log = true;
     106                                        }
     107                                } else if(strcmp(argv[i], "--config") == 0 || strcmp(argv[i], "-C") == 0) {
     108                                        i++;
     109                                        if(argv[i] == NULL) {
     110                                                fprintf(stderr, "Missing argument\n");
     111                                                return 1;
     112                                        }
     113                                        confpath = argv[i];
     114                                } else if(strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "-V") == 0) {
     115                                        printf("Tewi HTTPd Tewi/%s\n", tw_get_version());
     116                                        printf("Under public domain.\n");
     117                                        printf("Original by 2024 Nishi\n");
     118                                        printf("\n");
     119                                        printf("Usage: %s [--config|-C config] [--verbose|-v] [--version|-V]\n", argv[0]);
     120                                        printf("--config  | -C config     : Specify config\n");
     121                                        printf("--verbose | -v            : Verbose mode\n");
     122                                        printf("--version | -V            : Version information\n");
     123                                        return 0;
    44124                                } else {
    45                                         cm_do_log = true;
    46                                 }
    47                         } else if(strcmp(argv[i], "--config") == 0 || strcmp(argv[i], "-C") == 0) {
    48                                 i++;
    49                                 if(argv[i] == NULL) {
    50                                         fprintf(stderr, "Missing argument\n");
     125                                        fprintf(stderr, "Unknown option: %s\n", argv[i]);
    51126                                        return 1;
    52127                                }
    53                                 confpath = argv[i];
    54                         } else if(strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "-V") == 0) {
    55                                 printf("Tewi HTTPd Tewi/%s\n", tw_get_version());
    56                                 printf("Under public domain.\n");
    57                                 printf("Original by 2024 Nishi\n");
    58                                 printf("\n");
    59                                 printf("Usage: %s [--config|-C config] [--verbose|-v] [--version|-V]\n", argv[0]);
    60                                 printf("--config  | -C config     : Specify config\n");
    61                                 printf("--verbose | -v            : Verbose mode\n");
    62                                 printf("--version | -V            : Version information\n");
    63                                 return 0;
    64                         } else {
    65                                 fprintf(stderr, "Unknown option: %s\n", argv[i]);
    66                                 return 1;
    67128                        }
    68129                }
     
    78139        }
    79140        sprintf(tw_server, "Tewi/%s (%s)%s", tw_get_version(), tw_get_platform(), config.extension == NULL ? "" : config.extension);
    80         cm_log("Daemon", "Ready, server: %s", tw_server);
     141        char* r = cm_strcat(tw_server, " running...");
     142        cm_force_log(r);
     143        free(r);
    81144#ifndef __MINGW32__
    82145        signal(SIGCHLD, SIG_IGN);
     
    84147        SetConsoleTitle(tw_server);
    85148#endif
    86         tw_server_loop();
     149        return -1;
    87150}
Note: See TracChangeset for help on using the changeset viewer.