30 CAP_RUNCOMMAND = 0x0002, |
30 CAP_RUNCOMMAND = 0x0002, |
31 /* cHg extension: */ |
31 /* cHg extension: */ |
32 CAP_ATTACHIO = 0x0100, |
32 CAP_ATTACHIO = 0x0100, |
33 CAP_CHDIR = 0x0200, |
33 CAP_CHDIR = 0x0200, |
34 CAP_SETENV = 0x0800, |
34 CAP_SETENV = 0x0800, |
35 CAP_SETUMASK = 0x1000, |
35 CAP_SETUMASK2 = 0x1000, |
36 CAP_VALIDATE = 0x2000, |
36 CAP_VALIDATE = 0x2000, |
37 CAP_SETPROCNAME = 0x4000, |
37 CAP_SETPROCNAME = 0x4000, |
38 }; |
38 }; |
39 |
39 |
40 typedef struct { |
40 typedef struct { |
46 {"getencoding", CAP_GETENCODING}, |
46 {"getencoding", CAP_GETENCODING}, |
47 {"runcommand", CAP_RUNCOMMAND}, |
47 {"runcommand", CAP_RUNCOMMAND}, |
48 {"attachio", CAP_ATTACHIO}, |
48 {"attachio", CAP_ATTACHIO}, |
49 {"chdir", CAP_CHDIR}, |
49 {"chdir", CAP_CHDIR}, |
50 {"setenv", CAP_SETENV}, |
50 {"setenv", CAP_SETENV}, |
51 {"setumask", CAP_SETUMASK}, |
51 {"setumask2", CAP_SETUMASK2}, |
52 {"validate", CAP_VALIDATE}, |
52 {"validate", CAP_VALIDATE}, |
53 {"setprocname", CAP_SETPROCNAME}, |
53 {"setprocname", CAP_SETPROCNAME}, |
54 {NULL, 0}, /* terminator */ |
54 {NULL, 0}, /* terminator */ |
55 }; |
55 }; |
56 |
56 |
423 static void forwardumask(hgclient_t *hgc) |
423 static void forwardumask(hgclient_t *hgc) |
424 { |
424 { |
425 mode_t mask = umask(0); |
425 mode_t mask = umask(0); |
426 umask(mask); |
426 umask(mask); |
427 |
427 |
428 static const char command[] = "setumask\n"; |
|
429 sendall(hgc->sockfd, command, sizeof(command) - 1); |
|
430 uint32_t data = htonl(mask); |
428 uint32_t data = htonl(mask); |
431 sendall(hgc->sockfd, &data, sizeof(data)); |
429 enlargecontext(&hgc->ctx, sizeof(data)); |
|
430 memcpy(hgc->ctx.data, &data, sizeof(data)); |
|
431 hgc->ctx.datasize = sizeof(data); |
|
432 writeblockrequest(hgc, "setumask2"); |
432 } |
433 } |
433 |
434 |
434 /*! |
435 /*! |
435 * Open connection to per-user cmdserver |
436 * Open connection to per-user cmdserver |
436 * |
437 * |