Fossil SCM
Add the --stopper option to the "ui" and "server" commands on windows. The argument is the name of a file, which if it exists, causes the server to abort upon receiving the next inbound TCP connection. Use this to shut down fossil servers running as a windows service.
Commit
23c0d16718b1b0853fac8d5099bbd2981a1a2fa6
Parent
d8aa59fc1766e80…
2 files changed
+6
-1
+9
-1
+6
-1
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -822,10 +822,15 @@ | ||
| 822 | 822 | void cmd_webserver(void){ |
| 823 | 823 | int iPort, mxPort; |
| 824 | 824 | const char *zPort; |
| 825 | 825 | char *zBrowser; |
| 826 | 826 | char *zBrowserCmd = 0; |
| 827 | + | |
| 828 | +#ifdef __MINGW32__ | |
| 829 | + const char *zStopperFile; /* Name of file used to terminate server */ | |
| 830 | + zStopperFile = find_option("stopper", 0, 1); | |
| 831 | +#endif | |
| 827 | 832 | |
| 828 | 833 | g.thTrace = find_option("th-trace", 0, 0)!=0; |
| 829 | 834 | if( g.thTrace ){ |
| 830 | 835 | blob_zero(&g.thLog); |
| 831 | 836 | } |
| @@ -885,8 +890,8 @@ | ||
| 885 | 890 | if( g.argv[1][0]=='u' ){ |
| 886 | 891 | zBrowser = db_get("web-browser", "start"); |
| 887 | 892 | zBrowserCmd = mprintf("%s http://127.0.0.1:%%d/", zBrowser); |
| 888 | 893 | } |
| 889 | 894 | db_close(); |
| 890 | - win32_http_server(iPort, mxPort, zBrowserCmd); | |
| 895 | + win32_http_server(iPort, mxPort, zBrowserCmd, zStopperFile); | |
| 891 | 896 | #endif |
| 892 | 897 | } |
| 893 | 898 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -822,10 +822,15 @@ | |
| 822 | void cmd_webserver(void){ |
| 823 | int iPort, mxPort; |
| 824 | const char *zPort; |
| 825 | char *zBrowser; |
| 826 | char *zBrowserCmd = 0; |
| 827 | |
| 828 | g.thTrace = find_option("th-trace", 0, 0)!=0; |
| 829 | if( g.thTrace ){ |
| 830 | blob_zero(&g.thLog); |
| 831 | } |
| @@ -885,8 +890,8 @@ | |
| 885 | if( g.argv[1][0]=='u' ){ |
| 886 | zBrowser = db_get("web-browser", "start"); |
| 887 | zBrowserCmd = mprintf("%s http://127.0.0.1:%%d/", zBrowser); |
| 888 | } |
| 889 | db_close(); |
| 890 | win32_http_server(iPort, mxPort, zBrowserCmd); |
| 891 | #endif |
| 892 | } |
| 893 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -822,10 +822,15 @@ | |
| 822 | void cmd_webserver(void){ |
| 823 | int iPort, mxPort; |
| 824 | const char *zPort; |
| 825 | char *zBrowser; |
| 826 | char *zBrowserCmd = 0; |
| 827 | |
| 828 | #ifdef __MINGW32__ |
| 829 | const char *zStopperFile; /* Name of file used to terminate server */ |
| 830 | zStopperFile = find_option("stopper", 0, 1); |
| 831 | #endif |
| 832 | |
| 833 | g.thTrace = find_option("th-trace", 0, 0)!=0; |
| 834 | if( g.thTrace ){ |
| 835 | blob_zero(&g.thLog); |
| 836 | } |
| @@ -885,8 +890,8 @@ | |
| 890 | if( g.argv[1][0]=='u' ){ |
| 891 | zBrowser = db_get("web-browser", "start"); |
| 892 | zBrowserCmd = mprintf("%s http://127.0.0.1:%%d/", zBrowser); |
| 893 | } |
| 894 | db_close(); |
| 895 | win32_http_server(iPort, mxPort, zBrowserCmd, zStopperFile); |
| 896 | #endif |
| 897 | } |
| 898 |
+9
-1
| --- src/winhttp.c | ||
| +++ src/winhttp.c | ||
| @@ -134,17 +134,22 @@ | ||
| 134 | 134 | |
| 135 | 135 | /* |
| 136 | 136 | ** Start a listening socket and process incoming HTTP requests on |
| 137 | 137 | ** that socket. |
| 138 | 138 | */ |
| 139 | -void win32_http_server(int mnPort, int mxPort, char *zBrowser){ | |
| 139 | +void win32_http_server( | |
| 140 | + int mnPort, int mxPort, /* Range of allowed TCP port numbers */ | |
| 141 | + char *zBrowser, /* Command to launch browser. (Or NULL) */ | |
| 142 | + char *zStopper /* Stop server when this file is exists (Or NULL) */ | |
| 143 | +){ | |
| 140 | 144 | WSADATA wd; |
| 141 | 145 | SOCKET s = INVALID_SOCKET; |
| 142 | 146 | SOCKADDR_IN addr; |
| 143 | 147 | int idCnt = 0; |
| 144 | 148 | int iPort = mnPort; |
| 145 | 149 | |
| 150 | + if( zStopper ) unlink(zStopper); | |
| 146 | 151 | if( WSAStartup(MAKEWORD(1,1), &wd) ){ |
| 147 | 152 | fossil_fatal("unable to initialize winsock"); |
| 148 | 153 | } |
| 149 | 154 | while( iPort<=mxPort ){ |
| 150 | 155 | s = socket(AF_INET, SOCK_STREAM, 0); |
| @@ -187,10 +192,13 @@ | ||
| 187 | 192 | SOCKADDR_IN client_addr; |
| 188 | 193 | HttpRequest *p; |
| 189 | 194 | int len = sizeof(client_addr); |
| 190 | 195 | |
| 191 | 196 | client = accept(s, (struct sockaddr*)&client_addr, &len); |
| 197 | + if( zStopper && file_size(zStopper)>=0 ){ | |
| 198 | + break; | |
| 199 | + } | |
| 192 | 200 | if( client==INVALID_SOCKET ){ |
| 193 | 201 | closesocket(s); |
| 194 | 202 | fossil_fatal("error from accept()"); |
| 195 | 203 | } |
| 196 | 204 | p = malloc( sizeof(*p) ); |
| 197 | 205 |
| --- src/winhttp.c | |
| +++ src/winhttp.c | |
| @@ -134,17 +134,22 @@ | |
| 134 | |
| 135 | /* |
| 136 | ** Start a listening socket and process incoming HTTP requests on |
| 137 | ** that socket. |
| 138 | */ |
| 139 | void win32_http_server(int mnPort, int mxPort, char *zBrowser){ |
| 140 | WSADATA wd; |
| 141 | SOCKET s = INVALID_SOCKET; |
| 142 | SOCKADDR_IN addr; |
| 143 | int idCnt = 0; |
| 144 | int iPort = mnPort; |
| 145 | |
| 146 | if( WSAStartup(MAKEWORD(1,1), &wd) ){ |
| 147 | fossil_fatal("unable to initialize winsock"); |
| 148 | } |
| 149 | while( iPort<=mxPort ){ |
| 150 | s = socket(AF_INET, SOCK_STREAM, 0); |
| @@ -187,10 +192,13 @@ | |
| 187 | SOCKADDR_IN client_addr; |
| 188 | HttpRequest *p; |
| 189 | int len = sizeof(client_addr); |
| 190 | |
| 191 | client = accept(s, (struct sockaddr*)&client_addr, &len); |
| 192 | if( client==INVALID_SOCKET ){ |
| 193 | closesocket(s); |
| 194 | fossil_fatal("error from accept()"); |
| 195 | } |
| 196 | p = malloc( sizeof(*p) ); |
| 197 |
| --- src/winhttp.c | |
| +++ src/winhttp.c | |
| @@ -134,17 +134,22 @@ | |
| 134 | |
| 135 | /* |
| 136 | ** Start a listening socket and process incoming HTTP requests on |
| 137 | ** that socket. |
| 138 | */ |
| 139 | void win32_http_server( |
| 140 | int mnPort, int mxPort, /* Range of allowed TCP port numbers */ |
| 141 | char *zBrowser, /* Command to launch browser. (Or NULL) */ |
| 142 | char *zStopper /* Stop server when this file is exists (Or NULL) */ |
| 143 | ){ |
| 144 | WSADATA wd; |
| 145 | SOCKET s = INVALID_SOCKET; |
| 146 | SOCKADDR_IN addr; |
| 147 | int idCnt = 0; |
| 148 | int iPort = mnPort; |
| 149 | |
| 150 | if( zStopper ) unlink(zStopper); |
| 151 | if( WSAStartup(MAKEWORD(1,1), &wd) ){ |
| 152 | fossil_fatal("unable to initialize winsock"); |
| 153 | } |
| 154 | while( iPort<=mxPort ){ |
| 155 | s = socket(AF_INET, SOCK_STREAM, 0); |
| @@ -187,10 +192,13 @@ | |
| 192 | SOCKADDR_IN client_addr; |
| 193 | HttpRequest *p; |
| 194 | int len = sizeof(client_addr); |
| 195 | |
| 196 | client = accept(s, (struct sockaddr*)&client_addr, &len); |
| 197 | if( zStopper && file_size(zStopper)>=0 ){ |
| 198 | break; |
| 199 | } |
| 200 | if( client==INVALID_SOCKET ){ |
| 201 | closesocket(s); |
| 202 | fossil_fatal("error from accept()"); |
| 203 | } |
| 204 | p = malloc( sizeof(*p) ); |
| 205 |