--- a/contrib/chg/hgclient.c Thu Jan 24 11:35:40 2019 -0500
+++ b/contrib/chg/hgclient.c Thu Jan 24 10:21:59 2019 -0500
@@ -84,8 +84,9 @@
static void enlargecontext(context_t *ctx, size_t newsize)
{
- if (newsize <= ctx->maxdatasize)
+ if (newsize <= ctx->maxdatasize) {
return;
+ }
newsize = defaultdatasize *
((newsize + defaultdatasize - 1) / defaultdatasize);
@@ -117,22 +118,25 @@
uint32_t datasize_n;
rsize = recv(hgc->sockfd, &datasize_n, sizeof(datasize_n), 0);
- if (rsize != sizeof(datasize_n))
+ if (rsize != sizeof(datasize_n)) {
abortmsg("failed to read data size");
+ }
/* datasize denotes the maximum size to write if input request */
hgc->ctx.datasize = ntohl(datasize_n);
enlargecontext(&hgc->ctx, hgc->ctx.datasize);
- if (isupper(hgc->ctx.ch) && hgc->ctx.ch != 'S')
+ if (isupper(hgc->ctx.ch) && hgc->ctx.ch != 'S') {
return; /* assumes input request */
+ }
size_t cursize = 0;
while (cursize < hgc->ctx.datasize) {
rsize = recv(hgc->sockfd, hgc->ctx.data + cursize,
hgc->ctx.datasize - cursize, 0);
- if (rsize < 1)
+ if (rsize < 1) {
abortmsg("failed to read data block");
+ }
cursize += rsize;
}
}
@@ -143,8 +147,9 @@
const char *const endp = p + datasize;
while (p < endp) {
ssize_t r = send(sockfd, p, endp - p, 0);
- if (r < 0)
+ if (r < 0) {
abortmsgerrno("cannot communicate");
+ }
p += r;
}
}
@@ -186,8 +191,9 @@
ctx->datasize += n;
}
- if (ctx->datasize > 0)
+ if (ctx->datasize > 0) {
--ctx->datasize; /* strip last '\0' */
+ }
}
/* Extract '\0'-separated list of args to new buffer, terminated by NULL */
@@ -205,8 +211,9 @@
args[nargs] = s;
nargs++;
s = memchr(s, '\0', e - s);
- if (!s)
+ if (!s) {
break;
+ }
s++;
}
args[nargs] = NULL;
@@ -225,8 +232,9 @@
static void handlereadlinerequest(hgclient_t *hgc)
{
context_t *ctx = &hgc->ctx;
- if (!fgets(ctx->data, ctx->datasize, stdin))
+ if (!fgets(ctx->data, ctx->datasize, stdin)) {
ctx->data[0] = '\0';
+ }
ctx->datasize = strlen(ctx->data);
writeblock(hgc);
}
@@ -239,8 +247,9 @@
ctx->data[ctx->datasize] = '\0'; /* terminate last string */
const char **args = unpackcmdargsnul(ctx);
- if (!args[0] || !args[1] || !args[2])
+ if (!args[0] || !args[1] || !args[2]) {
abortmsg("missing type or command or cwd in system request");
+ }
if (strcmp(args[0], "system") == 0) {
debugmsg("run '%s' at '%s'", args[1], args[2]);
int32_t r = runshellcmd(args[1], args + 3, args[2]);
@@ -252,8 +261,9 @@
writeblock(hgc);
} else if (strcmp(args[0], "pager") == 0) {
setuppager(args[1], args + 3);
- if (hgc->capflags & CAP_ATTACHIO)
+ if (hgc->capflags & CAP_ATTACHIO) {
attachio(hgc);
+ }
/* unblock the server */
static const char emptycmd[] = "\n";
sendall(hgc->sockfd, emptycmd, sizeof(emptycmd) - 1);
@@ -296,9 +306,10 @@
handlesystemrequest(hgc);
break;
default:
- if (isupper(ctx->ch))
+ if (isupper(ctx->ch)) {
abortmsg("cannot handle response (ch = %c)",
ctx->ch);
+ }
}
}
}
@@ -308,8 +319,9 @@
unsigned int flags = 0;
while (s < e) {
const char *t = strchr(s, ' ');
- if (!t || t > e)
+ if (!t || t > e) {
t = e;
+ }
const cappair_t *cap;
for (cap = captable; cap->flag; ++cap) {
size_t n = t - s;
@@ -346,11 +358,13 @@
const char *const dataend = ctx->data + ctx->datasize;
while (s < dataend) {
const char *t = strchr(s, ':');
- if (!t || t[1] != ' ')
+ if (!t || t[1] != ' ') {
break;
+ }
const char *u = strchr(t + 2, '\n');
- if (!u)
+ if (!u) {
u = dataend;
+ }
if (strncmp(s, "capabilities:", t - s + 1) == 0) {
hgc->capflags = parsecapabilities(t + 2, u);
} else if (strncmp(s, "pgid:", t - s + 1) == 0) {
@@ -367,8 +381,9 @@
{
int r = snprintf(hgc->ctx.data, hgc->ctx.maxdatasize, "chg[worker/%d]",
(int)getpid());
- if (r < 0 || (size_t)r >= hgc->ctx.maxdatasize)
+ if (r < 0 || (size_t)r >= hgc->ctx.maxdatasize) {
abortmsg("insufficient buffer to write procname (r = %d)", r);
+ }
hgc->ctx.datasize = (size_t)r;
writeblockrequest(hgc, "setprocname");
}
@@ -380,8 +395,9 @@
sendall(hgc->sockfd, chcmd, sizeof(chcmd) - 1);
readchannel(hgc);
context_t *ctx = &hgc->ctx;
- if (ctx->ch != 'I')
+ if (ctx->ch != 'I') {
abortmsg("unexpected response for attachio (ch = %c)", ctx->ch);
+ }
static const int fds[3] = {STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO};
struct msghdr msgh;
@@ -399,23 +415,27 @@
memcpy(CMSG_DATA(cmsg), fds, sizeof(fds));
msgh.msg_controllen = cmsg->cmsg_len;
ssize_t r = sendmsg(hgc->sockfd, &msgh, 0);
- if (r < 0)
+ if (r < 0) {
abortmsgerrno("sendmsg failed");
+ }
handleresponse(hgc);
int32_t n;
- if (ctx->datasize != sizeof(n))
+ if (ctx->datasize != sizeof(n)) {
abortmsg("unexpected size of attachio result");
+ }
memcpy(&n, ctx->data, sizeof(n));
n = ntohl(n);
- if (n != sizeof(fds) / sizeof(fds[0]))
+ if (n != sizeof(fds) / sizeof(fds[0])) {
abortmsg("failed to send fds (n = %d)", n);
+ }
}
static void chdirtocwd(hgclient_t *hgc)
{
- if (!getcwd(hgc->ctx.data, hgc->ctx.maxdatasize))
+ if (!getcwd(hgc->ctx.data, hgc->ctx.maxdatasize)) {
abortmsgerrno("failed to getcwd");
+ }
hgc->ctx.datasize = strlen(hgc->ctx.data);
writeblockrequest(hgc, "chdir");
}
@@ -440,8 +460,9 @@
hgclient_t *hgc_open(const char *sockname)
{
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
- if (fd < 0)
+ if (fd < 0) {
abortmsgerrno("cannot create socket");
+ }
/* don't keep fd on fork(), so that it can be closed when the parent
* process get terminated. */
@@ -456,34 +477,39 @@
{
const char *split = strrchr(sockname, '/');
if (split && split != sockname) {
- if (split[1] == '\0')
+ if (split[1] == '\0') {
abortmsg("sockname cannot end with a slash");
+ }
size_t len = split - sockname;
char sockdir[len + 1];
memcpy(sockdir, sockname, len);
sockdir[len] = '\0';
bakfd = open(".", O_DIRECTORY);
- if (bakfd == -1)
+ if (bakfd == -1) {
abortmsgerrno("cannot open cwd");
+ }
int r = chdir(sockdir);
- if (r != 0)
+ if (r != 0) {
abortmsgerrno("cannot chdir %s", sockdir);
+ }
basename = split + 1;
}
}
- if (strlen(basename) >= sizeof(addr.sun_path))
+ if (strlen(basename) >= sizeof(addr.sun_path)) {
abortmsg("sockname is too long: %s", basename);
+ }
strncpy(addr.sun_path, basename, sizeof(addr.sun_path));
addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
/* real connect */
int r = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
if (r < 0) {
- if (errno != ENOENT && errno != ECONNREFUSED)
+ if (errno != ENOENT && errno != ECONNREFUSED) {
abortmsgerrno("cannot connect to %s", sockname);
+ }
}
if (bakfd != -1) {
fchdirx(bakfd);
@@ -501,16 +527,21 @@
initcontext(&hgc->ctx);
readhello(hgc);
- if (!(hgc->capflags & CAP_RUNCOMMAND))
+ if (!(hgc->capflags & CAP_RUNCOMMAND)) {
abortmsg("insufficient capability: runcommand");
- if (hgc->capflags & CAP_SETPROCNAME)
+ }
+ if (hgc->capflags & CAP_SETPROCNAME) {
updateprocname(hgc);
- if (hgc->capflags & CAP_ATTACHIO)
+ }
+ if (hgc->capflags & CAP_ATTACHIO) {
attachio(hgc);
- if (hgc->capflags & CAP_CHDIR)
+ }
+ if (hgc->capflags & CAP_CHDIR) {
chdirtocwd(hgc);
- if (hgc->capflags & CAP_SETUMASK2)
+ }
+ if (hgc->capflags & CAP_SETUMASK2) {
forwardumask(hgc);
+ }
return hgc;
}
@@ -555,16 +586,18 @@
size_t argsize)
{
assert(hgc);
- if (!(hgc->capflags & CAP_VALIDATE))
+ if (!(hgc->capflags & CAP_VALIDATE)) {
return NULL;
+ }
packcmdargs(&hgc->ctx, args, argsize);
writeblockrequest(hgc, "validate");
handleresponse(hgc);
/* the server returns '\0' if it can handle our request */
- if (hgc->ctx.datasize <= 1)
+ if (hgc->ctx.datasize <= 1) {
return NULL;
+ }
/* make sure the buffer is '\0' terminated */
enlargecontext(&hgc->ctx, hgc->ctx.datasize + 1);
@@ -599,8 +632,9 @@
void hgc_attachio(hgclient_t *hgc)
{
assert(hgc);
- if (!(hgc->capflags & CAP_ATTACHIO))
+ if (!(hgc->capflags & CAP_ATTACHIO)) {
return;
+ }
attachio(hgc);
}
@@ -613,8 +647,9 @@
void hgc_setenv(hgclient_t *hgc, const char *const envp[])
{
assert(hgc && envp);
- if (!(hgc->capflags & CAP_SETENV))
+ if (!(hgc->capflags & CAP_SETENV)) {
return;
+ }
packcmdargs(&hgc->ctx, envp, /*argsize*/ -1);
writeblockrequest(hgc, "setenv");
}