@@ -1182,13 +1182,13 @@
1182 1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The parent never returns from this procedure.
1183 1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1184 1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return 0 to each child as it runs. If unable to establish a
1185 1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** listening socket, return non-zero.
1186 1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int cgi_http_server(int iPort, char *zBrowser){
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cgi_http_server(int mnPort, int mxPort, char *zBrowser){
1188 1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef __MINGW32__
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fprintf(stderr,"server not yet available in windows version of fossil\n");
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Use win32_http_server() instead */
1190 1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
exit(1);
1191 1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
1192 1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int listener; /* The server socket */
1193 1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int connection; /* A socket for each individual connection */
1194 1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd_set readfds; /* Set of file descriptors for select() */
@@ -1196,29 +1196,49 @@
1196 1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int child; /* PID of the child process */
1197 1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nchildren = 0; /* Number of child processes */
1198 1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct timeval delay; /* How long to wait inside select() */
1199 1199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sockaddr_in inaddr; /* The socket address */
1200 1200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int opt = 1; /* setsockopt flag */
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&inaddr, 0, sizeof(inaddr));
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inaddr.sin_family = AF_INET;
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inaddr.sin_addr.s_addr = INADDR_ANY;
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inaddr.sin_port = htons(iPort);
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- listener = socket(AF_INET, SOCK_STREAM, 0);
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( listener<0 ){
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 1;
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* if we can't terminate nicely, at least allow the socket to be reused */
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( bind(listener, (struct sockaddr*)&inaddr, sizeof(inaddr))<0 ){
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- close(listener);
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 1;
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iPort = mnPort;
1202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( iPort<mxPort ){
1204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&inaddr, 0, sizeof(inaddr));
1205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inaddr.sin_family = AF_INET;
1206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inaddr.sin_addr.s_addr = INADDR_ANY;
1207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inaddr.sin_port = htons(iPort);
1208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ listener = socket(AF_INET, SOCK_STREAM, 0);
1209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( listener<0 ){
1210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iPort++;
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue;
1212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* if we can't terminate nicely, at least allow the socket to be reused */
1215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
1216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bind(listener, (struct sockaddr*)&inaddr, sizeof(inaddr))<0 ){
1218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ close(listener);
1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iPort++;
1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue;
1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iPort>mxPort ){
1225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( mnPort==mxPort ){
1226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("unable to open listening socket on ports %d", mnPort);
1227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("unable to open listening socket on any"
1229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ports %d..%d", mnPort, mxPort);
1230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iPort>mxPort ) return 1;
1218 1233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
listen(listener,10);
1234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iPort>mnPort ){
1235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("Listening for HTTP requests on TCP port %d\n", iPort);
1236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fflush(stdout);
1237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1219 1238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zBrowser ){
1239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zBrowser = mprintf(zBrowser, iPort);
1220 1240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
system(zBrowser);
1221 1241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1222 1242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( 1 ){
1223 1243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nchildren>MAX_PARALLEL ){
1224 1244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Slow down if connections are arriving too fast */
1225 1245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!