Avoid a -Wshadow warning on Solaris 9.
This commit is contained in:
@@ -627,24 +627,24 @@ send_mail(const struct eventlog *evlog, const char *fmt, ...)
|
||||
}
|
||||
|
||||
static bool
|
||||
json_add_timestamp(struct json_container *json, const char *name,
|
||||
json_add_timestamp(struct json_container *jsonc, const char *name,
|
||||
const struct timespec *ts, bool format_timestamp)
|
||||
{
|
||||
struct json_value json_value;
|
||||
int len;
|
||||
debug_decl(json_add_timestamp, SUDO_DEBUG_PLUGIN);
|
||||
|
||||
if (!sudo_json_open_object(json, name))
|
||||
if (!sudo_json_open_object(jsonc, name))
|
||||
goto oom;
|
||||
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = ts->tv_sec;
|
||||
if (!sudo_json_add_value(json, "seconds", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "seconds", &json_value))
|
||||
goto oom;
|
||||
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = ts->tv_nsec;
|
||||
if (!sudo_json_add_value(json, "nanoseconds", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "nanoseconds", &json_value))
|
||||
goto oom;
|
||||
|
||||
if (format_timestamp) {
|
||||
@@ -660,7 +660,7 @@ json_add_timestamp(struct json_container *json, const char *name,
|
||||
if (len != 0 && timebuf[sizeof(timebuf) - 1] == '\0') {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = timebuf; // -V507
|
||||
if (!sudo_json_add_value(json, "iso8601", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "iso8601", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
}
|
||||
@@ -671,13 +671,13 @@ json_add_timestamp(struct json_container *json, const char *name,
|
||||
if (len != 0 && timebuf[sizeof(timebuf) - 1] == '\0') {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = timebuf; // -V507
|
||||
if (!sudo_json_add_value(json, "localtime", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "localtime", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!sudo_json_close_object(json))
|
||||
if (!sudo_json_close_object(jsonc))
|
||||
goto oom;
|
||||
|
||||
debug_return_bool(true);
|
||||
@@ -693,7 +693,7 @@ oom:
|
||||
* be stored and formatted by the caller.
|
||||
*/
|
||||
bool
|
||||
eventlog_store_json(struct json_container *json, const struct eventlog *evlog)
|
||||
eventlog_store_json(struct json_container *jsonc, const struct eventlog *evlog)
|
||||
{
|
||||
struct json_value json_value;
|
||||
size_t i;
|
||||
@@ -712,112 +712,112 @@ eventlog_store_json(struct json_container *json, const struct eventlog *evlog)
|
||||
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->submituser;
|
||||
if (!sudo_json_add_value(json, "submituser", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "submituser", &json_value))
|
||||
goto oom;
|
||||
|
||||
if (evlog->command != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->command;
|
||||
if (!sudo_json_add_value(json, "command", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "command", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->runuser != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->runuser;
|
||||
if (!sudo_json_add_value(json, "runuser", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "runuser", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->rungroup != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->rungroup;
|
||||
if (!sudo_json_add_value(json, "rungroup", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "rungroup", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->runchroot != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->runchroot;
|
||||
if (!sudo_json_add_value(json, "runchroot", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "runchroot", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->runcwd != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->runcwd;
|
||||
if (!sudo_json_add_value(json, "runcwd", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "runcwd", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->ttyname != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->ttyname;
|
||||
if (!sudo_json_add_value(json, "ttyname", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "ttyname", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->submithost != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->submithost;
|
||||
if (!sudo_json_add_value(json, "submithost", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "submithost", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->cwd != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->cwd;
|
||||
if (!sudo_json_add_value(json, "submitcwd", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "submitcwd", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->rungroup!= NULL && evlog->rungid != (gid_t)-1) {
|
||||
json_value.type = JSON_ID;
|
||||
json_value.u.id = evlog->rungid;
|
||||
if (!sudo_json_add_value(json, "rungid", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "rungid", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->runuid != (uid_t)-1) {
|
||||
json_value.type = JSON_ID;
|
||||
json_value.u.id = evlog->runuid;
|
||||
if (!sudo_json_add_value(json, "runuid", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "runuid", &json_value))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = evlog->columns;
|
||||
if (!sudo_json_add_value(json, "columns", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "columns", &json_value))
|
||||
goto oom;
|
||||
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = evlog->lines;
|
||||
if (!sudo_json_add_value(json, "lines", &json_value))
|
||||
if (!sudo_json_add_value(jsonc, "lines", &json_value))
|
||||
goto oom;
|
||||
|
||||
if (evlog->argv != NULL) {
|
||||
if (!sudo_json_open_array(json, "runargv"))
|
||||
if (!sudo_json_open_array(jsonc, "runargv"))
|
||||
goto oom;
|
||||
for (i = 0; (cp = evlog->argv[i]) != NULL; i++) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = cp;
|
||||
if (!sudo_json_add_value(json, NULL, &json_value))
|
||||
if (!sudo_json_add_value(jsonc, NULL, &json_value))
|
||||
goto oom;
|
||||
}
|
||||
if (!sudo_json_close_array(json))
|
||||
if (!sudo_json_close_array(jsonc))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->envp != NULL) {
|
||||
if (!sudo_json_open_array(json, "runenv"))
|
||||
if (!sudo_json_open_array(jsonc, "runenv"))
|
||||
goto oom;
|
||||
for (i = 0; (cp = evlog->envp[i]) != NULL; i++) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = cp;
|
||||
if (!sudo_json_add_value(json, NULL, &json_value))
|
||||
if (!sudo_json_add_value(jsonc, NULL, &json_value))
|
||||
goto oom;
|
||||
}
|
||||
if (!sudo_json_close_array(json))
|
||||
if (!sudo_json_close_array(jsonc))
|
||||
goto oom;
|
||||
}
|
||||
|
||||
@@ -829,9 +829,9 @@ oom:
|
||||
}
|
||||
|
||||
static bool
|
||||
default_json_cb(struct json_container *json, void *v)
|
||||
default_json_cb(struct json_container *jsonc, void *v)
|
||||
{
|
||||
return eventlog_store_json(json, v);
|
||||
return eventlog_store_json(jsonc, v);
|
||||
}
|
||||
|
||||
static char *
|
||||
@@ -840,7 +840,7 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
{
|
||||
eventlog_json_callback_t info_cb = args->json_info_cb;
|
||||
void *info = args->json_info;
|
||||
struct json_container json = { 0 };
|
||||
struct json_container jsonc = { 0 };
|
||||
struct json_value json_value;
|
||||
const char *time_str, *type_str;
|
||||
struct timespec now;
|
||||
@@ -880,15 +880,15 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
debug_return_str(NULL);
|
||||
}
|
||||
|
||||
if (!sudo_json_init(&json, 4, compact, false))
|
||||
if (!sudo_json_init(&jsonc, 4, compact, false))
|
||||
goto bad;
|
||||
if (!sudo_json_open_object(&json, type_str))
|
||||
if (!sudo_json_open_object(&jsonc, type_str))
|
||||
goto bad;
|
||||
|
||||
if (evlog != NULL && evlog->uuid_str[0] != '\0') {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->uuid_str;
|
||||
if (!sudo_json_add_value(&json, "uuid", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "uuid", &json_value))
|
||||
goto bad;
|
||||
}
|
||||
|
||||
@@ -907,7 +907,7 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
}
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = ereason ? ereason : args->reason;
|
||||
if (!sudo_json_add_value(&json, "reason", &json_value)) {
|
||||
if (!sudo_json_add_value(&jsonc, "reason", &json_value)) {
|
||||
free(ereason);
|
||||
goto bad;
|
||||
}
|
||||
@@ -915,7 +915,7 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
}
|
||||
|
||||
/* Log event time on server (set earlier) */
|
||||
if (!json_add_timestamp(&json, "server_time", &now, true)) {
|
||||
if (!json_add_timestamp(&jsonc, "server_time", &now, true)) {
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||
"unable format timestamp");
|
||||
goto bad;
|
||||
@@ -923,7 +923,7 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
|
||||
/* Log event time from client */
|
||||
if (args->event_time != NULL) {
|
||||
if (!json_add_timestamp(&json, time_str, args->event_time, true)) {
|
||||
if (!json_add_timestamp(&jsonc, time_str, args->event_time, true)) {
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||
"unable format timestamp");
|
||||
goto bad;
|
||||
@@ -938,7 +938,7 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
}
|
||||
|
||||
if (sudo_timespecisset(&evlog->run_time)) {
|
||||
if (!json_add_timestamp(&json, "run_time", &evlog->run_time, false)) {
|
||||
if (!json_add_timestamp(&jsonc, "run_time", &evlog->run_time, false)) {
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||
"unable format timestamp");
|
||||
goto bad;
|
||||
@@ -947,17 +947,17 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
if (evlog->signal_name != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->signal_name;
|
||||
if (!sudo_json_add_value(&json, "signal", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "signal", &json_value))
|
||||
goto bad;
|
||||
|
||||
json_value.type = JSON_BOOL;
|
||||
json_value.u.boolean = evlog->dumped_core;
|
||||
if (!sudo_json_add_value(&json, "dumped_core", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "dumped_core", &json_value))
|
||||
goto bad;
|
||||
}
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = evlog->exit_value;
|
||||
if (!sudo_json_add_value(&json, "exit_value", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "exit_value", &json_value))
|
||||
goto bad;
|
||||
}
|
||||
|
||||
@@ -966,18 +966,18 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
if (evlog->peeraddr != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->peeraddr;
|
||||
if (!sudo_json_add_value(&json, "peeraddr", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "peeraddr", &json_value))
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if (evlog->iolog_path != NULL) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = evlog->iolog_path;
|
||||
if (!sudo_json_add_value(&json, "iolog_path", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "iolog_path", &json_value))
|
||||
goto bad;
|
||||
|
||||
if (sudo_timespecisset(&evlog->iolog_offset)) {
|
||||
if (!json_add_timestamp(&json, "iolog_offset", &evlog->iolog_offset, false)) {
|
||||
if (!json_add_timestamp(&jsonc, "iolog_offset", &evlog->iolog_offset, false)) {
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
|
||||
"unable format timestamp");
|
||||
goto bad;
|
||||
@@ -988,18 +988,18 @@ format_json(int event_type, struct eventlog_args *args,
|
||||
|
||||
/* Write log info. */
|
||||
if (info != NULL) {
|
||||
if (!info_cb(&json, info))
|
||||
if (!info_cb(&jsonc, info))
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if (!sudo_json_close_object(&json))
|
||||
if (!sudo_json_close_object(&jsonc))
|
||||
goto bad;
|
||||
|
||||
/* Caller is responsible for freeing the buffer. */
|
||||
debug_return_str(sudo_json_get_buf(&json));
|
||||
debug_return_str(sudo_json_get_buf(&jsonc));
|
||||
|
||||
bad:
|
||||
sudo_json_free(&json);
|
||||
sudo_json_free(&jsonc);
|
||||
debug_return_str(NULL);
|
||||
}
|
||||
|
||||
|
@@ -153,34 +153,34 @@ iolog_write_info_file_legacy(int dfd, struct eventlog *evlog)
|
||||
static bool
|
||||
iolog_write_info_file_json(int dfd, struct eventlog *evlog)
|
||||
{
|
||||
struct json_container json;
|
||||
struct json_container jsonc;
|
||||
struct json_value json_value;
|
||||
bool ret = false;
|
||||
FILE *fp = NULL;
|
||||
int fd = -1;
|
||||
debug_decl(iolog_write_info_file_json, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (!sudo_json_init(&json, 4, false, false))
|
||||
if (!sudo_json_init(&jsonc, 4, false, false))
|
||||
debug_return_bool(false);
|
||||
|
||||
/* Timestamp */
|
||||
if (!sudo_json_open_object(&json, "timestamp"))
|
||||
if (!sudo_json_open_object(&jsonc, "timestamp"))
|
||||
goto oom;
|
||||
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = evlog->submit_time.tv_sec;
|
||||
if (!sudo_json_add_value(&json, "seconds", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "seconds", &json_value))
|
||||
goto oom;
|
||||
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = evlog->submit_time.tv_nsec;
|
||||
if (!sudo_json_add_value(&json, "nanoseconds", &json_value))
|
||||
if (!sudo_json_add_value(&jsonc, "nanoseconds", &json_value))
|
||||
goto oom;
|
||||
|
||||
if (!sudo_json_close_object(&json))
|
||||
if (!sudo_json_close_object(&jsonc))
|
||||
goto oom;
|
||||
|
||||
if (!eventlog_store_json(&json, evlog))
|
||||
if (!eventlog_store_json(&jsonc, evlog))
|
||||
goto done;
|
||||
|
||||
fd = iolog_openat(dfd, "log.json", O_CREAT|O_TRUNC|O_WRONLY);
|
||||
@@ -197,7 +197,7 @@ iolog_write_info_file_json(int dfd, struct eventlog *evlog)
|
||||
}
|
||||
fd = -1;
|
||||
|
||||
fprintf(fp, "{%s\n}\n", sudo_json_get_buf(&json));
|
||||
fprintf(fp, "{%s\n}\n", sudo_json_get_buf(&jsonc));
|
||||
fflush(fp);
|
||||
if (ferror(fp)) {
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
|
||||
@@ -211,7 +211,7 @@ iolog_write_info_file_json(int dfd, struct eventlog *evlog)
|
||||
oom:
|
||||
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
done:
|
||||
sudo_json_free(&json);
|
||||
sudo_json_free(&jsonc);
|
||||
if (fp != NULL)
|
||||
fclose(fp);
|
||||
if (fd != -1)
|
||||
|
@@ -35,7 +35,7 @@
|
||||
sudo_dso_public int main(int argc, char *argv[]);
|
||||
|
||||
static bool
|
||||
json_print_object(struct json_container *json, struct json_object *object)
|
||||
json_print_object(struct json_container *jsonc, struct json_object *object)
|
||||
{
|
||||
struct json_item *item;
|
||||
struct json_value json_value;
|
||||
@@ -46,40 +46,40 @@ json_print_object(struct json_container *json, struct json_object *object)
|
||||
case JSON_STRING:
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = item->u.string;
|
||||
if (!sudo_json_add_value(json, item->name, &json_value))
|
||||
if (!sudo_json_add_value(jsonc, item->name, &json_value))
|
||||
goto oom;
|
||||
break;
|
||||
case JSON_NUMBER:
|
||||
json_value.type = JSON_NUMBER;
|
||||
json_value.u.number = item->u.number;
|
||||
if (!sudo_json_add_value(json, item->name, &json_value))
|
||||
if (!sudo_json_add_value(jsonc, item->name, &json_value))
|
||||
goto oom;
|
||||
break;
|
||||
case JSON_OBJECT:
|
||||
if (!sudo_json_open_object(json, item->name))
|
||||
if (!sudo_json_open_object(jsonc, item->name))
|
||||
goto oom;
|
||||
if (!json_print_object(json, &item->u.child))
|
||||
if (!json_print_object(jsonc, &item->u.child))
|
||||
goto done;
|
||||
if (!sudo_json_close_object(json))
|
||||
if (!sudo_json_close_object(jsonc))
|
||||
goto oom;
|
||||
break;
|
||||
case JSON_ARRAY:
|
||||
if (!sudo_json_open_array(json, item->name))
|
||||
if (!sudo_json_open_array(jsonc, item->name))
|
||||
goto oom;
|
||||
if (!json_print_object(json, &item->u.child))
|
||||
if (!json_print_object(jsonc, &item->u.child))
|
||||
goto done;
|
||||
if (!sudo_json_close_array(json))
|
||||
if (!sudo_json_close_array(jsonc))
|
||||
goto oom;
|
||||
break;
|
||||
case JSON_BOOL:
|
||||
json_value.type = JSON_BOOL;
|
||||
json_value.u.boolean = item->u.boolean;
|
||||
if (!sudo_json_add_value(json, item->name, &json_value))
|
||||
if (!sudo_json_add_value(jsonc, item->name, &json_value))
|
||||
goto oom;
|
||||
break;
|
||||
case JSON_NULL:
|
||||
json_value.type = JSON_NULL;
|
||||
if (!sudo_json_add_value(json, item->name, &json_value))
|
||||
if (!sudo_json_add_value(jsonc, item->name, &json_value))
|
||||
goto oom;
|
||||
break;
|
||||
default:
|
||||
@@ -98,7 +98,7 @@ done:
|
||||
}
|
||||
|
||||
static bool
|
||||
json_format(struct json_container *json, struct json_object *object)
|
||||
json_format(struct json_container *jsonc, struct json_object *object)
|
||||
{
|
||||
struct json_item *item;
|
||||
bool ret = false;
|
||||
@@ -111,7 +111,7 @@ json_format(struct json_container *json, struct json_object *object)
|
||||
}
|
||||
object = &item->u.child;
|
||||
|
||||
if (!json_print_object(json, object))
|
||||
if (!json_print_object(jsonc, object))
|
||||
goto done;
|
||||
|
||||
ret = true;
|
||||
@@ -129,7 +129,7 @@ usage(void)
|
||||
}
|
||||
|
||||
static bool
|
||||
compare(FILE *fp, const char *infile, struct json_container *json)
|
||||
compare(FILE *fp, const char *infile, struct json_container *jsonc)
|
||||
{
|
||||
const char *cp;
|
||||
unsigned int lineno = 0;
|
||||
@@ -137,7 +137,7 @@ compare(FILE *fp, const char *infile, struct json_container *json)
|
||||
char *line = NULL;
|
||||
ssize_t len;
|
||||
|
||||
cp = sudo_json_get_buf(json);
|
||||
cp = sudo_json_get_buf(jsonc);
|
||||
|
||||
while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) {
|
||||
lineno++;
|
||||
@@ -192,7 +192,7 @@ main(int argc, char *argv[])
|
||||
usage();
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
struct json_container json;
|
||||
struct json_container jsonc;
|
||||
const char *infile = argv[i];
|
||||
const char *outfile = argv[i];
|
||||
const char *cp;
|
||||
@@ -202,7 +202,7 @@ main(int argc, char *argv[])
|
||||
|
||||
ntests++;
|
||||
|
||||
if (!sudo_json_init(&json, 4, false, true)) {
|
||||
if (!sudo_json_init(&jsonc, 4, false, true)) {
|
||||
errors++;
|
||||
continue;
|
||||
}
|
||||
@@ -219,7 +219,7 @@ main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
/* Format as pretty-printed JSON */
|
||||
if (!json_format(&json, &root)) {
|
||||
if (!json_format(&jsonc, &root)) {
|
||||
errors++;
|
||||
goto next;
|
||||
}
|
||||
@@ -237,18 +237,18 @@ main(int argc, char *argv[])
|
||||
|
||||
/* Compare output to expected output. */
|
||||
rewind(outfp);
|
||||
if (!compare(outfp, outfile, &json))
|
||||
if (!compare(outfp, outfile, &jsonc))
|
||||
errors++;
|
||||
|
||||
/* Write the formatted output to stdout for -c (cat) */
|
||||
if (cat) {
|
||||
fprintf(stdout, "{%s\n}\n", sudo_json_get_buf(&json));
|
||||
fprintf(stdout, "{%s\n}\n", sudo_json_get_buf(&jsonc));
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
next:
|
||||
free_json_items(&root.items);
|
||||
sudo_json_free(&json);
|
||||
sudo_json_free(&jsonc);
|
||||
if (infp != NULL)
|
||||
fclose(infp);
|
||||
if (outfp != NULL && outfp != infp)
|
||||
|
174
lib/util/json.c
174
lib/util/json.c
@@ -44,13 +44,13 @@
|
||||
* Returns true on success, false if out of memory.
|
||||
*/
|
||||
static bool
|
||||
json_expand_buf(struct json_container *json)
|
||||
json_expand_buf(struct json_container *jsonc)
|
||||
{
|
||||
char *newbuf;
|
||||
debug_decl(json_expand_buf, SUDO_DEBUG_UTIL);
|
||||
|
||||
if ((newbuf = reallocarray(json->buf, 2, json->bufsize)) == NULL) {
|
||||
if (json->memfatal) {
|
||||
if ((newbuf = reallocarray(jsonc->buf, 2, jsonc->bufsize)) == NULL) {
|
||||
if (jsonc->memfatal) {
|
||||
sudo_fatalx(U_("%s: %s"),
|
||||
__func__, U_("unable to allocate memory"));
|
||||
}
|
||||
@@ -58,8 +58,8 @@ json_expand_buf(struct json_container *json)
|
||||
"%s: %s", __func__, "unable to allocate memory");
|
||||
debug_return_bool(false);
|
||||
}
|
||||
json->buf = newbuf;
|
||||
json->bufsize *= 2;
|
||||
jsonc->buf = newbuf;
|
||||
jsonc->bufsize *= 2;
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
@@ -69,24 +69,24 @@ json_expand_buf(struct json_container *json)
|
||||
* Append "indent" number of blank characters.
|
||||
*/
|
||||
static bool
|
||||
json_new_line(struct json_container *json)
|
||||
json_new_line(struct json_container *jsonc)
|
||||
{
|
||||
int indent = json->indent_level;
|
||||
int indent = jsonc->indent_level;
|
||||
debug_decl(json_new_line, SUDO_DEBUG_UTIL);
|
||||
|
||||
/* No non-essential white space in minimal mode. */
|
||||
if (json->minimal)
|
||||
if (jsonc->minimal)
|
||||
debug_return_bool(true);
|
||||
|
||||
while (json->buflen + 1 + indent >= json->bufsize) {
|
||||
if (!json_expand_buf(json))
|
||||
while (jsonc->buflen + 1 + indent >= jsonc->bufsize) {
|
||||
if (!json_expand_buf(jsonc))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
json->buf[json->buflen++] = '\n';
|
||||
jsonc->buf[jsonc->buflen++] = '\n';
|
||||
while (indent--) {
|
||||
json->buf[json->buflen++] = ' ';
|
||||
jsonc->buf[jsonc->buflen++] = ' ';
|
||||
}
|
||||
json->buf[json->buflen] = '\0';
|
||||
jsonc->buf[jsonc->buflen] = '\0';
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
@@ -96,20 +96,20 @@ json_new_line(struct json_container *json)
|
||||
* Does not perform any quoting.
|
||||
*/
|
||||
static bool
|
||||
json_append_buf(struct json_container *json, const char *str)
|
||||
json_append_buf(struct json_container *jsonc, const char *str)
|
||||
{
|
||||
size_t len;
|
||||
debug_decl(json_append_buf, SUDO_DEBUG_UTIL);
|
||||
|
||||
len = strlen(str);
|
||||
while (json->buflen + len >= json->bufsize) {
|
||||
if (!json_expand_buf(json))
|
||||
while (jsonc->buflen + len >= jsonc->bufsize) {
|
||||
if (!json_expand_buf(jsonc))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
|
||||
memcpy(json->buf + json->buflen, str, len);
|
||||
json->buflen += len;
|
||||
json->buf[json->buflen] = '\0';
|
||||
memcpy(jsonc->buf + jsonc->buflen, str, len);
|
||||
jsonc->buflen += len;
|
||||
jsonc->buf[jsonc->buflen] = '\0';
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
@@ -119,12 +119,12 @@ json_append_buf(struct json_container *json, const char *str)
|
||||
* Does not support unicode escapes.
|
||||
*/
|
||||
static bool
|
||||
json_append_string(struct json_container *json, const char *str)
|
||||
json_append_string(struct json_container *jsonc, const char *str)
|
||||
{
|
||||
char ch;
|
||||
debug_decl(json_append_string, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (!json_append_buf(json, "\""))
|
||||
if (!json_append_buf(jsonc, "\""))
|
||||
debug_return_bool(false);
|
||||
while ((ch = *str++) != '\0') {
|
||||
char buf[3], *cp = buf;
|
||||
@@ -157,29 +157,29 @@ json_append_string(struct json_container *json, const char *str)
|
||||
}
|
||||
*cp++ = ch;
|
||||
*cp++ = '\0';
|
||||
if (!json_append_buf(json, buf))
|
||||
if (!json_append_buf(jsonc, buf))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
if (!json_append_buf(json, "\""))
|
||||
if (!json_append_buf(jsonc, "\""))
|
||||
debug_return_bool(false);
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_init_v1(struct json_container *json, int indent, bool minimal,
|
||||
sudo_json_init_v1(struct json_container *jsonc, int indent, bool minimal,
|
||||
bool memfatal)
|
||||
{
|
||||
debug_decl(sudo_json_init, SUDO_DEBUG_UTIL);
|
||||
|
||||
memset(json, 0, sizeof(*json));
|
||||
json->indent_level = indent;
|
||||
json->indent_increment = indent;
|
||||
json->minimal = minimal;
|
||||
json->memfatal = memfatal;
|
||||
json->buf = malloc(64 * 1024);
|
||||
if (json->buf == NULL) {
|
||||
if (json->memfatal) {
|
||||
memset(jsonc, 0, sizeof(*jsonc));
|
||||
jsonc->indent_level = indent;
|
||||
jsonc->indent_increment = indent;
|
||||
jsonc->minimal = minimal;
|
||||
jsonc->memfatal = memfatal;
|
||||
jsonc->buf = malloc(64 * 1024);
|
||||
if (jsonc->buf == NULL) {
|
||||
if (jsonc->memfatal) {
|
||||
sudo_fatalx(U_("%s: %s"),
|
||||
__func__, U_("unable to allocate memory"));
|
||||
}
|
||||
@@ -187,162 +187,162 @@ sudo_json_init_v1(struct json_container *json, int indent, bool minimal,
|
||||
"%s: %s", __func__, "unable to allocate memory");
|
||||
debug_return_bool(false);
|
||||
}
|
||||
*json->buf = '\0';
|
||||
json->bufsize = 64 * 1024;
|
||||
*jsonc->buf = '\0';
|
||||
jsonc->bufsize = 64 * 1024;
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
|
||||
void
|
||||
sudo_json_free_v1(struct json_container *json)
|
||||
sudo_json_free_v1(struct json_container *jsonc)
|
||||
{
|
||||
debug_decl(sudo_json_free, SUDO_DEBUG_UTIL);
|
||||
|
||||
free(json->buf);
|
||||
memset(json, 0, sizeof(*json));
|
||||
free(jsonc->buf);
|
||||
memset(jsonc, 0, sizeof(*jsonc));
|
||||
|
||||
debug_return;
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_open_object_v1(struct json_container *json, const char *name)
|
||||
sudo_json_open_object_v1(struct json_container *jsonc, const char *name)
|
||||
{
|
||||
debug_decl(sudo_json_open_object, SUDO_DEBUG_UTIL);
|
||||
|
||||
/* Add comma if we are continuing an object/array. */
|
||||
if (json->need_comma) {
|
||||
if (!json_append_buf(json, ","))
|
||||
if (jsonc->need_comma) {
|
||||
if (!json_append_buf(jsonc, ","))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
if (!json_new_line(json))
|
||||
if (!json_new_line(jsonc))
|
||||
debug_return_bool(false);
|
||||
|
||||
if (name != NULL) {
|
||||
json_append_string(json, name);
|
||||
if (!json_append_buf(json, json->minimal ? ":{" : ": {"))
|
||||
json_append_string(jsonc, name);
|
||||
if (!json_append_buf(jsonc, jsonc->minimal ? ":{" : ": {"))
|
||||
debug_return_bool(false);
|
||||
} else {
|
||||
if (!json_append_buf(json, "{"))
|
||||
if (!json_append_buf(jsonc, "{"))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
|
||||
json->indent_level += json->indent_increment;
|
||||
json->need_comma = false;
|
||||
jsonc->indent_level += jsonc->indent_increment;
|
||||
jsonc->need_comma = false;
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_close_object_v1(struct json_container *json)
|
||||
sudo_json_close_object_v1(struct json_container *jsonc)
|
||||
{
|
||||
debug_decl(sudo_json_close_object, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (!json->minimal) {
|
||||
json->indent_level -= json->indent_increment;
|
||||
if (!json_new_line(json))
|
||||
if (!jsonc->minimal) {
|
||||
jsonc->indent_level -= jsonc->indent_increment;
|
||||
if (!json_new_line(jsonc))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
if (!json_append_buf(json, "}"))
|
||||
if (!json_append_buf(jsonc, "}"))
|
||||
debug_return_bool(false);
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_open_array_v1(struct json_container *json, const char *name)
|
||||
sudo_json_open_array_v1(struct json_container *jsonc, const char *name)
|
||||
{
|
||||
debug_decl(sudo_json_open_array, SUDO_DEBUG_UTIL);
|
||||
|
||||
/* Add comma if we are continuing an object/array. */
|
||||
if (json->need_comma) {
|
||||
if (!json_append_buf(json, ","))
|
||||
if (jsonc->need_comma) {
|
||||
if (!json_append_buf(jsonc, ","))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
if (!json_new_line(json))
|
||||
if (!json_new_line(jsonc))
|
||||
debug_return_bool(false);
|
||||
|
||||
if (name != NULL) {
|
||||
json_append_string(json, name);
|
||||
if (!json_append_buf(json, json->minimal ? ":[" : ": ["))
|
||||
json_append_string(jsonc, name);
|
||||
if (!json_append_buf(jsonc, jsonc->minimal ? ":[" : ": ["))
|
||||
debug_return_bool(false);
|
||||
} else {
|
||||
if (!json_append_buf(json, "["))
|
||||
if (!json_append_buf(jsonc, "["))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
|
||||
json->indent_level += json->indent_increment;
|
||||
json->need_comma = false;
|
||||
jsonc->indent_level += jsonc->indent_increment;
|
||||
jsonc->need_comma = false;
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_close_array_v1(struct json_container *json)
|
||||
sudo_json_close_array_v1(struct json_container *jsonc)
|
||||
{
|
||||
debug_decl(sudo_json_close_array, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (!json->minimal) {
|
||||
json->indent_level -= json->indent_increment;
|
||||
if (!json_new_line(json))
|
||||
if (!jsonc->minimal) {
|
||||
jsonc->indent_level -= jsonc->indent_increment;
|
||||
if (!json_new_line(jsonc))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
if (!json_append_buf(json, "]"))
|
||||
if (!json_append_buf(jsonc, "]"))
|
||||
debug_return_bool(false);
|
||||
|
||||
debug_return_bool(true);
|
||||
}
|
||||
|
||||
static bool
|
||||
sudo_json_add_value_int(struct json_container *json, const char *name,
|
||||
sudo_json_add_value_int(struct json_container *jsonc, const char *name,
|
||||
struct json_value *value, bool as_object)
|
||||
{
|
||||
char numbuf[(((sizeof(long long) * 8) + 2) / 3) + 2];
|
||||
debug_decl(sudo_json_add_value, SUDO_DEBUG_UTIL);
|
||||
|
||||
/* Add comma if we are continuing an object/array. */
|
||||
if (json->need_comma) {
|
||||
if (!json_append_buf(json, ","))
|
||||
if (jsonc->need_comma) {
|
||||
if (!json_append_buf(jsonc, ","))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
if (!json_new_line(json))
|
||||
if (!json_new_line(jsonc))
|
||||
debug_return_bool(false);
|
||||
json->need_comma = true;
|
||||
jsonc->need_comma = true;
|
||||
|
||||
if (as_object) {
|
||||
if (!json_append_buf(json, json->minimal ? "{" : "{ "))
|
||||
if (!json_append_buf(jsonc, jsonc->minimal ? "{" : "{ "))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
|
||||
/* name */
|
||||
if (name != NULL) {
|
||||
if (!json_append_string(json, name))
|
||||
if (!json_append_string(jsonc, name))
|
||||
debug_return_bool(false);
|
||||
if (!json_append_buf(json, json->minimal ? ":" : ": "))
|
||||
if (!json_append_buf(jsonc, jsonc->minimal ? ":" : ": "))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
|
||||
/* value */
|
||||
switch (value->type) {
|
||||
case JSON_STRING:
|
||||
if (!json_append_string(json, value->u.string))
|
||||
if (!json_append_string(jsonc, value->u.string))
|
||||
debug_return_bool(false);
|
||||
break;
|
||||
case JSON_ID:
|
||||
snprintf(numbuf, sizeof(numbuf), "%u", (unsigned int)value->u.id);
|
||||
if (!json_append_buf(json, numbuf))
|
||||
if (!json_append_buf(jsonc, numbuf))
|
||||
debug_return_bool(false);
|
||||
break;
|
||||
case JSON_NUMBER:
|
||||
snprintf(numbuf, sizeof(numbuf), "%lld", value->u.number);
|
||||
if (!json_append_buf(json, numbuf))
|
||||
if (!json_append_buf(jsonc, numbuf))
|
||||
debug_return_bool(false);
|
||||
break;
|
||||
case JSON_NULL:
|
||||
if (!json_append_buf(json, "null"))
|
||||
if (!json_append_buf(jsonc, "null"))
|
||||
debug_return_bool(false);
|
||||
break;
|
||||
case JSON_BOOL:
|
||||
if (!json_append_buf(json, value->u.boolean ? "true" : "false"))
|
||||
if (!json_append_buf(jsonc, value->u.boolean ? "true" : "false"))
|
||||
debug_return_bool(false);
|
||||
break;
|
||||
case JSON_ARRAY:
|
||||
@@ -354,7 +354,7 @@ sudo_json_add_value_int(struct json_container *json, const char *name,
|
||||
}
|
||||
|
||||
if (as_object) {
|
||||
if (!json_append_buf(json, json->minimal ? "}" : " }"))
|
||||
if (!json_append_buf(jsonc, jsonc->minimal ? "}" : " }"))
|
||||
debug_return_bool(false);
|
||||
}
|
||||
|
||||
@@ -362,27 +362,27 @@ sudo_json_add_value_int(struct json_container *json, const char *name,
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_add_value_v1(struct json_container *json, const char *name,
|
||||
sudo_json_add_value_v1(struct json_container *jsonc, const char *name,
|
||||
struct json_value *value)
|
||||
{
|
||||
return sudo_json_add_value_int(json, name, value, false);
|
||||
return sudo_json_add_value_int(jsonc, name, value, false);
|
||||
}
|
||||
|
||||
bool
|
||||
sudo_json_add_value_as_object_v1(struct json_container *json, const char *name,
|
||||
sudo_json_add_value_as_object_v1(struct json_container *jsonc, const char *name,
|
||||
struct json_value *value)
|
||||
{
|
||||
return sudo_json_add_value_int(json, name, value, true);
|
||||
return sudo_json_add_value_int(jsonc, name, value, true);
|
||||
}
|
||||
|
||||
char *
|
||||
sudo_json_get_buf_v1(struct json_container *json)
|
||||
sudo_json_get_buf_v1(struct json_container *jsonc)
|
||||
{
|
||||
return json->buf;
|
||||
return jsonc->buf;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
sudo_json_get_len_v1(struct json_container *json)
|
||||
sudo_json_get_len_v1(struct json_container *jsonc)
|
||||
{
|
||||
return json->buflen;
|
||||
return jsonc->buflen;
|
||||
}
|
||||
|
Reference in New Issue
Block a user