better error reporting when destination directory is not available
diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c
index 4a150d5..6c47d02 100644
--- a/libasn1compiler/asn1c_compat.c
+++ b/libasn1compiler/asn1c_compat.c
@@ -36,8 +36,9 @@
#endif
FILE *
-asn1c_open_file(const char* destdir, const char *name, const char *ext, char **opt_tmpname) {
- char fname[PATH_MAX];
+asn1c_open_file(const char *destdir, const char *name, const char *ext,
+ char **opt_tmpname) {
+ char fname[PATH_MAX];
int created = 1;
#ifndef _WIN32
struct stat sb;
@@ -49,10 +50,8 @@
/*
* Compute filenames.
*/
- ret = snprintf(fname, sizeof(fname), "%s%s%s%s",
- opt_tmpname ? "" : destdir,
- name, ext,
- opt_tmpname ? ".XXXXXX" : "");
+ ret = snprintf(fname, sizeof(fname), "%s%s%s%s", destdir ? destdir : "",
+ name, ext, opt_tmpname ? ".XXXXXX" : "");
assert(ret > 0 && ret < (ssize_t)sizeof(fname));
if(opt_tmpname) {
@@ -61,8 +60,10 @@
*/
fd = mkstemp(fname);
#ifndef _WIN32
- /* fchmod() does not respect umask */
- (void)fchmod(fd, REASONABLE_FILE_MODE);
+ if(fd != -1) {
+ /* fchmod() does not respect umask */
+ (void)fchmod(fd, REASONABLE_FILE_MODE);
+ }
#endif
} else {
/*
@@ -75,8 +76,14 @@
}
}
if(fd == -1) {
- perror(fname);
- return NULL;
+ struct stat st;
+ if(destdir && stat(destdir, &st) == -1) {
+ fprintf(stderr, "%s: No such directory\n", destdir);
+ return NULL;
+ } else {
+ perror(fname);
+ return NULL;
+ }
}
#ifndef _WIN32
diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c
index 291fc44..79f3b24 100644
--- a/libasn1compiler/asn1c_save.c
+++ b/libasn1compiler/asn1c_save.c
@@ -40,8 +40,10 @@
static int asn1c_dump_streams(arg_t *arg, asn1c_dep_chainset *, const char *, int, char **);
static int asn1c_print_streams(arg_t *arg);
-static int asn1c_save_streams(arg_t *arg, asn1c_dep_chainset *, const char *, int, char **);
-static int asn1c_copy_over(arg_t *arg, const char *destdir, const char *path, const char *msg);
+static int asn1c_save_streams(arg_t *arg, asn1c_dep_chainset *, const char *,
+ int, char **);
+static int asn1c_copy_over(arg_t *arg, const char *destdir, const char *path,
+ const char *msg);
static int identical_files(const char *fname1, const char *fname2);
static int need_to_generate_pdu_collection(arg_t *arg);
static abuf *generate_pdu_collection(arg_t *arg);
@@ -55,8 +57,9 @@
static int
asn1c__save_library_makefile(arg_t *arg, const asn1c_dep_chainset *deps,
- const char *datadir, const char *destdir, const char *makefile_name) {
- asn1p_module_t *mod;
+ const char *datadir, const char *destdir,
+ const char *makefile_name) {
+ asn1p_module_t *mod;
FILE *mkf;
mkf = asn1c_open_file(destdir, makefile_name, "", 0);
@@ -80,9 +83,10 @@
TQ_FOR(arg->expr, &(mod->members), next) {
if(asn1_lang_map[arg->expr->meta_type]
[arg->expr->expr_type].type_cb) {
- safe_fprintf(mkf, "\t\\\n\t%s%s.h", destdir,
- asn1c_make_identifier(AMI_MASK_ONLY_SPACES, arg->expr, 0));
- }
+ safe_fprintf(
+ mkf, "\t\\\n\t%s%s.h", destdir,
+ asn1c_make_identifier(AMI_MASK_ONLY_SPACES, arg->expr, 0));
+ }
}
}
safe_fprintf(mkf, "\n\n");
@@ -118,8 +122,8 @@
where[0] = '\0';
}
- if(asn1c_copy_over(arg, destdir, dstpath, where) == -1) {
- safe_fprintf(mkf, ">>>ABORTED<<<");
+ if(asn1c_copy_over(arg, destdir, dstpath, where) == -1) {
+ safe_fprintf(mkf, ">>>ABORTED<<<");
fclose(mkf);
return -1;
}
@@ -131,8 +135,9 @@
} else {
what_kind = "SRCS";
}
- safe_fprintf(mkf, "ASN_MODULE_%s+=%s%s\n", what_kind, destdir, fname);
- }
+ safe_fprintf(mkf, "ASN_MODULE_%s+=%s%s\n", what_kind, destdir,
+ fname);
+ }
asn1c_dep_chain_free(dlist);
}
@@ -154,81 +159,85 @@
"libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS)\n"
"libasncodec_la_LDFLAGS=-lm\n", destdir);
fclose(mkf);
- safe_fprintf(stderr, "Generated %s%s\n", destdir, makefile_name);
+ safe_fprintf(stderr, "Generated %s%s\n", destdir, makefile_name);
return 0;
}
static int
-asn1c__save_example_mk_makefile(arg_t *arg, const asn1c_dep_chainset *deps, const char *datadir,
- const char *destdir, const char *makefile_name,
+asn1c__save_example_mk_makefile(arg_t *arg, const asn1c_dep_chainset *deps,
+ const char *datadir, const char *destdir,
+ const char *makefile_name,
const char *library_makefile_name, int argc,
char **argv) {
- FILE *mkf;
- asn1c_dep_chain *dlist = asn1c_deps_flatten(deps, FDEP_CONVERTER);
+ FILE *mkf;
+ asn1c_dep_chain *dlist = asn1c_deps_flatten(deps, FDEP_CONVERTER);
- /* Generate converter-example.mk snippet */
- mkf = asn1c_open_file(destdir, makefile_name, "", 0);
- if(mkf == NULL) {
- perror(makefile_name);
- return -1;
- }
- safe_fprintf(mkf,
- "include %s%s\n\n"
- "LIBS += -lm\n"
- "CFLAGS += $(ASN_MODULE_CFLAGS) %s%s-I.\n"
- "ASN_LIBRARY ?= libasncodec.a\n"
- "ASN_PROGRAM ?= converter-example\n"
- "ASN_PROGRAM_SRCS ?= ",
- destdir, library_makefile_name,
- (arg->flags & A1C_PDU_TYPE) ? generate_pdu_C_definition() : "",
- need_to_generate_pdu_collection(arg) ? "-DASN_PDU_COLLECTION " : "");
+ /* Generate converter-example.mk snippet */
+ mkf = asn1c_open_file(destdir, makefile_name, "", 0);
+ if(mkf == NULL) {
+ perror(makefile_name);
+ return -1;
+ }
+ safe_fprintf(
+ mkf,
+ "include %s%s\n\n"
+ "LIBS += -lm\n"
+ "CFLAGS += $(ASN_MODULE_CFLAGS) %s%s-I.\n"
+ "ASN_LIBRARY ?= libasncodec.a\n"
+ "ASN_PROGRAM ?= converter-example\n"
+ "ASN_PROGRAM_SRCS ?= ",
+ destdir, library_makefile_name,
+ (arg->flags & A1C_PDU_TYPE) ? generate_pdu_C_definition() : "",
+ need_to_generate_pdu_collection(arg) ? "-DASN_PDU_COLLECTION " : "");
- if(dlist) {
- for(size_t i = 0; i < dlist->deps_count; i++) {
- char dstpath[PATH_MAX];
- int ret = snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir,
- dlist->deps[i]->filename);
- assert(ret > 0 && (size_t)ret < sizeof(dstpath));
- if(asn1c_copy_over(arg, destdir, dstpath, "implicit") == -1) {
- safe_fprintf(mkf, ">>>ABORTED<<<");
- fclose(mkf);
- return -1;
+ if(dlist) {
+ for(size_t i = 0; i < dlist->deps_count; i++) {
+ char dstpath[PATH_MAX];
+ int ret = snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir,
+ dlist->deps[i]->filename);
+ assert(ret > 0 && (size_t)ret < sizeof(dstpath));
+ if(asn1c_copy_over(arg, destdir, dstpath, "implicit") == -1) {
+ safe_fprintf(mkf, ">>>ABORTED<<<");
+ fclose(mkf);
+ return -1;
}
- safe_fprintf(mkf, "\\\n\t%s%s", destdir, dlist->deps[i]->filename);
- }
- asn1c_dep_chain_free(dlist);
- }
+ safe_fprintf(mkf, "\\\n\t%s%s", destdir, dlist->deps[i]->filename);
+ }
+ asn1c_dep_chain_free(dlist);
+ }
- if(need_to_generate_pdu_collection(arg)) {
- safe_fprintf(mkf, "\\\n\t%spdu_collection.c", destdir);
- if(generate_pdu_collection_file(arg, destdir))
- return -1;
- }
+ if(need_to_generate_pdu_collection(arg)) {
+ safe_fprintf(mkf, "\\\n\t%spdu_collection.c", destdir);
+ if(generate_pdu_collection_file(arg, destdir)) {
+ return -1;
+ }
+ }
- safe_fprintf(
- mkf,
- "\n\nall: $(ASN_PROGRAM)\n"
- "\n$(ASN_PROGRAM): $(ASN_LIBRARY) $(ASN_PROGRAM_SRCS:.c=.o)"
- "\n\t$(CC) $(CFLAGS) $(CPPFLAGS) -o $(ASN_PROGRAM) $(ASN_PROGRAM_SRCS:.c=.o) $(LDFLAGS) $(ASN_LIBRARY) $(LIBS)\n"
- "\n$(ASN_LIBRARY): $(ASN_MODULE_SRCS:.c=.o)"
- "\n\t$(AR) rcs $@ $(ASN_MODULE_SRCS:.c=.o)\n"
- "\n.SUFFIXES:"
- "\n.SUFFIXES: .c .o\n"
- "\n.c.o:"
- "\n\t$(CC) $(CFLAGS) -o $@ -c $<\n"
- "\nclean:"
- "\n\trm -f $(ASN_PROGRAM) $(ASN_LIBRARY)"
- "\n\trm -f $(ASN_MODULE_SRCS:.c=.o) $(ASN_PROGRAM_SRCS:.c=.o)\n"
- "\nregen: regenerate-from-asn1-source\n"
- "\nregenerate-from-asn1-source:\n\t");
+ safe_fprintf(
+ mkf,
+ "\n\nall: $(ASN_PROGRAM)\n"
+ "\n$(ASN_PROGRAM): $(ASN_LIBRARY) $(ASN_PROGRAM_SRCS:.c=.o)"
+ "\n\t$(CC) $(CFLAGS) $(CPPFLAGS) -o $(ASN_PROGRAM) "
+ "$(ASN_PROGRAM_SRCS:.c=.o) $(LDFLAGS) $(ASN_LIBRARY) $(LIBS)\n"
+ "\n$(ASN_LIBRARY): $(ASN_MODULE_SRCS:.c=.o)"
+ "\n\t$(AR) rcs $@ $(ASN_MODULE_SRCS:.c=.o)\n"
+ "\n.SUFFIXES:"
+ "\n.SUFFIXES: .c .o\n"
+ "\n.c.o:"
+ "\n\t$(CC) $(CFLAGS) -o $@ -c $<\n"
+ "\nclean:"
+ "\n\trm -f $(ASN_PROGRAM) $(ASN_LIBRARY)"
+ "\n\trm -f $(ASN_MODULE_SRCS:.c=.o) $(ASN_PROGRAM_SRCS:.c=.o)\n"
+ "\nregen: regenerate-from-asn1-source\n"
+ "\nregenerate-from-asn1-source:\n\t");
- for(int i = 0; i < argc; i++)
- safe_fprintf(mkf, "%s%s", i ? " " : "", argv[i]);
+ for(int i = 0; i < argc; i++)
+ safe_fprintf(mkf, "%s%s", i ? " " : "", argv[i]);
safe_fprintf(mkf, "\n\n");
- fclose(mkf);
- safe_fprintf(stderr, "Generated %s%s\n", destdir, makefile_name);
+ fclose(mkf);
+ safe_fprintf(stderr, "Generated %s%s\n", destdir, makefile_name);
return 0;
}
@@ -244,7 +253,6 @@
/* Generate example.am snippet */
mkf = asn1c_open_file(destdir, makefile_name, "", 0);
if(mkf == NULL) {
- perror(makefile_name);
return -1;
}
safe_fprintf(mkf,
@@ -387,7 +395,8 @@
TQ_FOR(arg->expr, &(mod->members), next) {
if(asn1_lang_map[arg->expr->meta_type][arg->expr->expr_type]
.type_cb) {
- if(asn1c_dump_streams(arg, deps, destdir, optc, argv)) break;
+ ret = asn1c_dump_streams(arg, deps, destdir, optc, argv);
+ if(ret) break;
}
}
}
@@ -401,6 +410,8 @@
break;
}
+ if(ret) break;
+
ret = asn1c__save_library_makefile(arg, deps, datadir, destdir,
library_makefile);
if(ret) break;
@@ -432,8 +443,8 @@
* Dump the streams.
*/
static int
-asn1c_dump_streams(arg_t *arg, asn1c_dep_chainset *deps, const char* destdir, int optc,
- char **argv) {
+asn1c_dump_streams(arg_t *arg, asn1c_dep_chainset *deps, const char *destdir,
+ int optc, char **argv) {
if(arg->flags & A1C_PRINT_COMPILED) {
return asn1c_print_streams(arg);
} else {
@@ -465,8 +476,8 @@
}
static int
-asn1c_save_streams(arg_t *arg, asn1c_dep_chainset *deps, const char* destdir, int optc,
- char **argv) {
+asn1c_save_streams(arg_t *arg, asn1c_dep_chainset *deps, const char *destdir,
+ int optc, char **argv) {
asn1p_expr_t *expr = arg->expr;
compiler_streams_t *cs = expr->data;
out_chunk_t *ot;
@@ -486,12 +497,16 @@
filename = strdup(asn1c_make_identifier(AMI_MASK_ONLY_SPACES, expr, (char*)0));
fp_c = asn1c_open_file(destdir, filename, ".c", &tmpname_c);
- fp_h = asn1c_open_file(destdir, filename, ".h", &tmpname_h);
- if(fp_c == NULL || fp_h == NULL) {
- if(fp_c) { unlink(tmpname_c); free(tmpname_c); fclose(fp_c); }
- if(fp_h) { unlink(tmpname_h); free(tmpname_h); fclose(fp_h); }
- return -1;
- }
+ if(fp_c == NULL) {
+ return -1;
+ }
+ fp_h = asn1c_open_file(destdir, filename, ".h", &tmpname_h);
+ if(fp_h == NULL) {
+ unlink(tmpname_c);
+ free(tmpname_c);
+ fclose(fp_c);
+ return -1;
+ }
generate_preamble(arg, fp_c, optc, argv);
generate_preamble(arg, fp_h, optc, argv);
@@ -690,7 +705,8 @@
}
static int
-asn1c_copy_over(arg_t *arg, const char* destdir, const char *path, const char *msg) {
+asn1c_copy_over(arg_t *arg, const char *destdir, const char *path,
+ const char *msg) {
#ifdef _WIN32
int use_real_copy = 1;
#else
@@ -741,7 +757,7 @@
static int
-generate_pdu_collection_file(arg_t *arg, const char* destdir) {
+generate_pdu_collection_file(arg_t *arg, const char *destdir) {
abuf *buf = generate_pdu_collection(arg);
assert(buf);