int ret;
for (i = 0, len = array_list_length(a); i < len; i++) {
- sprintf(seq, "%d", i);
+ snprintf(seq, sizeof(seq), "%d", i);
ret = add_json_element(seq, array_list_get_idx(a, i));
if (ret)
return ret;
obj = json_tokener_parse(str);
if (!obj || json_object_get_type(obj) != json_type_object) {
+ if (obj)
+ json_object_put(obj);
fprintf(stderr, "Failed to parse message data\n");
return 1;
}
fprintf(stdout, "json_init;\n");
add_json_object(obj);
fflush(stdout);
+ json_object_put(obj);
return 0;
}
static char *get_keys(const char *prefix)
{
char *keys;
+ size_t len = var_prefix_len + strlen(prefix) + sizeof("K_") + 1;
- keys = alloca(var_prefix_len + strlen(prefix) + sizeof("K_") + 1);
- sprintf(keys, "%sK_%s", var_prefix, prefix);
+ keys = alloca(len);
+ snprintf(keys, len, "%sK_%s", var_prefix, prefix);
return getenv_avl(keys);
}
static void get_var(const char *prefix, const char **name, char **var, char **type)
{
char *tmpname, *varname;
+ size_t len = var_prefix_len + strlen(prefix) + 1 + strlen(*name) + 1 + sizeof("T_");
- tmpname = alloca(var_prefix_len + strlen(prefix) + 1 + strlen(*name) + 1 + sizeof("T_"));
+ tmpname = alloca(len);
- sprintf(tmpname, "%s%s_%s", var_prefix, prefix, *name);
+ snprintf(tmpname, len, "%s%s_%s", var_prefix, prefix, *name);
*var = getenv_avl(tmpname);
- sprintf(tmpname, "%sT_%s_%s", var_prefix, prefix, *name);
+ snprintf(tmpname, len, "%sT_%s_%s", var_prefix, prefix, *name);
*type = getenv_avl(tmpname);
- sprintf(tmpname, "%sN_%s_%s", var_prefix, prefix, *name);
+ snprintf(tmpname, len, "%sN_%s_%s", var_prefix, prefix, *name);
varname = getenv_avl(tmpname);
if (varname)
*name = varname;
static int usage(const char *progname)
{
- fprintf(stderr, "Usage: %s [-n] [-i] -r <message>|-R <file>|-w\n", progname);
+ fprintf(stderr, "Usage: %s [-n] [-i] -r <message>|-R <file>|-o <file>|-p <prefix>|-w\n", progname);
return 2;
}
return c1 - c2;
}
+static int jshn_parse_file(const char *path)
+{
+ struct stat sb;
+ int ret = 0;
+ char *fbuf;
+ int fd;
+
+ if ((fd = open(path, O_RDONLY)) == -1) {
+ fprintf(stderr, "Error opening %s\n", path);
+ return 3;
+ }
+
+ if (fstat(fd, &sb) == -1) {
+ fprintf(stderr, "Error getting size of %s\n", path);
+ close(fd);
+ return 3;
+ }
+
+ if (!(fbuf = calloc(1, sb.st_size+1))) {
+ fprintf(stderr, "Error allocating memory for %s\n", path);
+ close(fd);
+ return 3;
+ }
+
+ if (read(fd, fbuf, sb.st_size) != sb.st_size) {
+ fprintf(stderr, "Error reading %s\n", path);
+ free(fbuf);
+ close(fd);
+ return 3;
+ }
+
+ ret = jshn_parse(fbuf);
+ free(fbuf);
+ close(fd);
+
+ return ret;
+}
+
+static int jshn_format_file(const char *path, bool no_newline, bool indent)
+{
+ FILE *fp = NULL;
+ int ret = 0;
+
+ fp = fopen(path, "w");
+ if (!fp) {
+ fprintf(stderr, "Error opening %s\n", path);
+ return 3;
+ }
+
+ ret = jshn_format(no_newline, indent, fp);
+ fclose(fp);
+
+ return ret;
+}
+
int main(int argc, char **argv)
{
extern char **environ;
bool indent = false;
struct env_var *vars;
int i;
+ int ret = 0;
int ch;
- int fd;
- FILE *fp = NULL;
- struct stat sb;
- char *fbuf;
- int ret;
avl_init(&env_vars, avl_strcmp_var, false, NULL);
for (i = 0; environ[i]; i++);
var_prefix_len = strlen(var_prefix);
break;
case 'r':
- return jshn_parse(optarg);
+ ret = jshn_parse(optarg);
+ goto exit;
case 'R':
- if ((fd = open(optarg, O_RDONLY)) == -1) {
- fprintf(stderr, "Error opening %s\n", optarg);
- return 3;
- }
- if (fstat(fd, &sb) == -1) {
- fprintf(stderr, "Error getting size of %s\n", optarg);
- close(fd);
- return 3;
- }
- if (!(fbuf = malloc(sb.st_size))) {
- fprintf(stderr, "Error allocating memory for %s\n", optarg);
- close(fd);
- return 3;
- }
- if (read(fd, fbuf, sb.st_size) != sb.st_size) {
- fprintf(stderr, "Error reading %s\n", optarg);
- free(fbuf);
- close(fd);
- return 3;
- }
- ret = jshn_parse(fbuf);
- free(fbuf);
- close(fd);
- return ret;
+ ret = jshn_parse_file(optarg);
+ goto exit;
case 'w':
- return jshn_format(no_newline, indent, stdout);
+ ret = jshn_format(no_newline, indent, stdout);
+ goto exit;
case 'o':
- fp = fopen(optarg, "w");
- if (!fp) {
- fprintf(stderr, "Error opening %s\n", optarg);
- return 3;
- }
- jshn_format(no_newline, indent, fp);
- fclose(fp);
- return 0;
+ ret = jshn_format_file(optarg, no_newline, indent);
+ goto exit;
case 'n':
no_newline = true;
break;
indent = true;
break;
default:
+ free(vars);
return usage(argv[0]);
}
}
+
+ free(vars);
return usage(argv[0]);
+
+exit:
+ free(vars);
+ return ret;
}