Improve diagnostics for lookup_{user,group}

Make sure to pass error codes back to callers and include them in
diagnostics printed by minijail0.

Bug: chromium:1055067
Test: Compiles and passes tests.

Change-Id: Ic07c5917e7826dd7cf2bfbd3483ad97ad199b670
diff --git a/minijail0_cli.c b/minijail0_cli.c
index c8b700b..c3da5de 100644
--- a/minijail0_cli.c
+++ b/minijail0_cli.c
@@ -40,13 +40,16 @@
 		return;
 	}
 
-	if (lookup_user(arg, out_uid, out_gid)) {
-		fprintf(stderr, "Bad user: '%s'\n", arg);
+	int ret = lookup_user(arg, out_uid, out_gid);
+	if (ret) {
+		fprintf(stderr, "Bad user '%s': %s\n", arg, strerror(-ret));
 		exit(1);
 	}
 
-	if (minijail_change_user(j, arg)) {
-		fprintf(stderr, "Bad user: '%s'\n", arg);
+	ret = minijail_change_user(j, arg);
+	if (ret) {
+		fprintf(stderr, "minijail_change_user('%s') failed: %s\n", arg,
+			strerror(-ret));
 		exit(1);
 	}
 }
@@ -61,15 +64,13 @@
 		return;
 	}
 
-	if (lookup_group(arg, out_gid)) {
-		fprintf(stderr, "Bad group: '%s'\n", arg);
+	int ret = lookup_group(arg, out_gid);
+	if (ret) {
+		fprintf(stderr, "Bad group '%s': %s\n", arg, strerror(-ret));
 		exit(1);
 	}
 
-	if (minijail_change_group(j, arg)) {
-		fprintf(stderr, "Bad group: '%s'\n", arg);
-		exit(1);
-	}
+	minijail_change_gid(j, *out_gid);
 }
 
 /*
@@ -81,15 +82,16 @@
 	char *end = NULL;
 	int groupid = strtod(arg, &end);
 	gid_t gid;
+	int ret;
 	if (!*end && *arg) {
 		/* A gid number has been specified, proceed. */
 		gid = groupid;
-	} else if (lookup_group(arg, &gid)) {
+	} else if ((ret = lookup_group(arg, &gid))) {
 		/*
 		 * A group name has been specified,
 		 * but doesn't exist: we bail out.
 		 */
-		fprintf(stderr, "Bad group: '%s'\n", arg);
+		fprintf(stderr, "Bad group '%s': %s\n", arg, strerror(-ret));
 		exit(1);
 	}
 
diff --git a/system.c b/system.c
index 5d39f0f..81fd393 100644
--- a/system.c
+++ b/system.c
@@ -395,7 +395,8 @@
 	buf = malloc(sz);
 	if (!buf)
 		return -ENOMEM;
-	getpwnam_r(user, &pw, buf, sz, &ppw);
+
+	int ret = getpwnam_r(user, &pw, buf, sz, &ppw);
 	/*
 	 * We're safe to free the buffer here. The strings inside |pw| point
 	 * inside |buf|, but we don't use any of them; this leaves the pointers
@@ -403,9 +404,11 @@
 	 * succeeded.
 	 */
 	free(buf);
-	/* getpwnam_r(3) does *not* set errno when |ppw| is NULL. */
+
+	if (ret != 0)
+		return -ret;  /* Error */
 	if (!ppw)
-		return -1;
+		return -ENOENT;  /* Not found */
 
 	*uid = ppw->pw_uid;
 	*gid = ppw->pw_gid;
@@ -431,16 +434,18 @@
 	buf = malloc(sz);
 	if (!buf)
 		return -ENOMEM;
-	getgrnam_r(group, &gr, buf, sz, &pgr);
+	int ret = getgrnam_r(group, &gr, buf, sz, &pgr);
 	/*
 	 * We're safe to free the buffer here. The strings inside gr point
 	 * inside buf, but we don't use any of them; this leaves the pointers
 	 * dangling but it's safe. pgr points at gr if getgrnam_r succeeded.
 	 */
 	free(buf);
-	/* getgrnam_r(3) does *not* set errno when |pgr| is NULL. */
+
+	if (ret != 0)
+		return -ret;  /* Error */
 	if (!pgr)
-		return -1;
+		return -ENOENT;  /* Not found */
 
 	*gid = pgr->gr_gid;
 	return 0;