##// END OF EJS Templates
contrib/hgsh: make to work with remote clone over ssh.
Vadim Gelfer -
r2602:9cbeef33 default
parent child Browse files
Show More
@@ -244,13 +244,20 b' static void run_shell(int argc, char **a'
244 exit(EX_OSFILE);
244 exit(EX_OSFILE);
245 }
245 }
246
246
247 enum cmdline {
248 hg_init,
249 hg_serve,
250 };
251
252
247 /*
253 /*
248 * paranoid wrapper, runs hg executable in server mode.
254 * paranoid wrapper, runs hg executable in server mode.
249 */
255 */
250 static void serve_data(int argc, char **argv)
256 static void serve_data(int argc, char **argv)
251 {
257 {
252 char *hg_root = HG_ROOT;
258 char *hg_root = HG_ROOT;
253 char *repo, *abspath;
259 char *repo, *repo_root;
260 enum cmdline cmd;
254 char *nargv[6];
261 char *nargv[6];
255 struct stat st;
262 struct stat st;
256 size_t repolen;
263 size_t repolen;
@@ -275,7 +282,12 b' static void serve_data(int argc, char **'
275 goto badargs;
282 goto badargs;
276 }
283 }
277
284
278 if (sscanf(argv[2], "hg -R %as serve --stdio", &repo) != 1) {
285 if (sscanf(argv[2], "hg init %as", &repo) == 1) {
286 cmd = hg_init;
287 }
288 else if (sscanf(argv[2], "hg -R %as serve --stdio", &repo) == 1) {
289 cmd = hg_serve;
290 } else {
279 goto badargs;
291 goto badargs;
280 }
292 }
281
293
@@ -286,7 +298,7 b' static void serve_data(int argc, char **'
286 }
298 }
287
299
288 if (hg_root) {
300 if (hg_root) {
289 if (asprintf(&abspath, "%s/%s/.hg/data", hg_root, repo) == -1) {
301 if (asprintf(&repo_root, "%s/%s/", hg_root, repo) == -1) {
290 goto badargs;
302 goto badargs;
291 }
303 }
292
304
@@ -296,16 +308,26 b' static void serve_data(int argc, char **'
296 * symlink that looks safe, but really breaks us out of tree.
308 * symlink that looks safe, but really breaks us out of tree.
297 */
309 */
298
310
299 if (strstr(abspath, "/../") != NULL) {
311 if (strstr(repo_root, "/../") != NULL) {
300 goto badargs;
312 goto badargs;
301 }
313 }
302
314
303 /* verify that we really are looking at valid repo. */
315 /* only hg init expects no repo. */
304
316
305 if (stat(abspath, &st) == -1) {
317 if (cmd != hg_init) {
306 perror(repo);
318 char *abs_path;
307 exit(EX_DATAERR);
319
308 }
320 if (asprintf(&abs_path, "%s.hg/data", repo_root) == -1) {
321 goto badargs;
322 }
323
324 /* verify that we really are looking at valid repo. */
325
326 if (stat(abs_path, &st) == -1) {
327 perror(repo);
328 exit(EX_DATAERR);
329 }
330 }
309
331
310 if (chdir(hg_root) == -1) {
332 if (chdir(hg_root) == -1) {
311 perror(hg_root);
333 perror(hg_root);
@@ -314,11 +336,22 b' static void serve_data(int argc, char **'
314 }
336 }
315
337
316 i = 0;
338 i = 0;
317 nargv[i++] = HG;
339
318 nargv[i++] = "-R";
340 switch (cmd) {
319 nargv[i++] = repo;
341 case hg_serve:
320 nargv[i++] = "serve";
342 nargv[i++] = HG;
321 nargv[i++] = "--stdio";
343 nargv[i++] = "-R";
344 nargv[i++] = repo;
345 nargv[i++] = "serve";
346 nargv[i++] = "--stdio";
347 break;
348 case hg_init:
349 nargv[i++] = HG;
350 nargv[i++] = "init";
351 nargv[i++] = repo;
352 break;
353 }
354
322 nargv[i] = NULL;
355 nargv[i] = NULL;
323
356
324 if (debug) {
357 if (debug) {
General Comments 0
You need to be logged in to leave comments. Login now