diff --git a/geojson.c b/geojson.c index d596f0a6..d285f304 100644 --- a/geojson.c +++ b/geojson.c @@ -286,15 +286,34 @@ static void merge(struct merge *merges, int nmerges, unsigned char *map, FILE *f } } -void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom, sqlite3 *outdb, struct pool *exclude, int exclude_all, double droprate, int buffer) { - char metaname[] = "/tmp/meta.XXXXXXXX"; - char indexname[] = "/tmp/index.XXXXXXXX"; +void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom, sqlite3 *outdb, struct pool *exclude, int exclude_all, double droprate, int buffer, char *tmpdir) { + char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1]; + char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1]; + + sprintf(metaname, "%s%s", tmpdir, "/meta.XXXXXXXX"); + sprintf(indexname, "%s%s", tmpdir, "/index.XXXXXXXX"); int metafd = mkstemp(metaname); + if (metafd < 0) { + perror(metaname); + exit(EXIT_FAILURE); + } int indexfd = mkstemp(indexname); + if (indexfd < 0) { + perror(indexname); + exit(EXIT_FAILURE); + } FILE *metafile = fopen(metaname, "wb"); + if (metafile == NULL) { + perror(metaname); + exit(EXIT_FAILURE); + } FILE *indexfile = fopen(indexname, "wb"); + if (indexfile == NULL) { + perror(indexname); + exit(EXIT_FAILURE); + } long long fpos = 0; unlink(metaname); @@ -673,12 +692,13 @@ int main(int argc, char **argv) { int force = 0; double droprate = 2.5; int buffer = 5; + char *tmpdir = "/tmp"; struct pool exclude; pool_init(&exclude, 0); int exclude_all = 0; - while ((i = getopt(argc, argv, "l:n:z:Z:d:D:o:x:r:b:fX")) != -1) { + while ((i = getopt(argc, argv, "l:n:z:Z:d:D:o:x:r:b:fXt:")) != -1) { switch (i) { case 'n': name = optarg; @@ -728,8 +748,12 @@ int main(int argc, char **argv) { force = 1; break; + case 't': + tmpdir = optarg; + break; + default: - fprintf(stderr, "Usage: %s -o out.mbtiles [-n name] [-l layername] [-z maxzoom] [-Z minzoom] [-d detail] [-D lower-detail] [-x excluded-field ...] [-X] [-r droprate] [-b buffer] [file.json]\n", argv[0]); + fprintf(stderr, "Usage: %s -o out.mbtiles [-n name] [-l layername] [-z maxzoom] [-Z minzoom] [-d detail] [-D lower-detail] [-x excluded-field ...] [-X] [-r droprate] [-b buffer] [-t tmpdir] [file.json]\n", argv[0]); exit(EXIT_FAILURE); } } @@ -759,7 +783,7 @@ int main(int argc, char **argv) { if (f == NULL) { fprintf(stderr, "%s: %s: %s\n", argv[0], argv[i], strerror(errno)); } else { - read_json(f, name ? name : argv[i], layer, maxzoom, minzoom, outdb, &exclude, exclude_all, droprate, buffer); + read_json(f, name ? name : argv[i], layer, maxzoom, minzoom, outdb, &exclude, exclude_all, droprate, buffer, tmpdir); fclose(f); } } @@ -767,7 +791,7 @@ int main(int argc, char **argv) { fprintf(stderr, "%s: Only accepts one input file\n", argv[0]); exit(EXIT_FAILURE); } else { - read_json(stdin, name ? name : outdir, layer, maxzoom, minzoom, outdb, &exclude, exclude_all, droprate, buffer); + read_json(stdin, name ? name : outdir, layer, maxzoom, minzoom, outdb, &exclude, exclude_all, droprate, buffer, tmpdir); } mbtiles_close(outdb, argv);