diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c index 44ba3e60d4fb148de04e4fbd016af62a0e711fef..1a402bf40cc8bf99030cfc80619121504672ab29 100644 --- a/libasn1compiler/asn1c_compat.c +++ b/libasn1compiler/asn1c_compat.c @@ -1,8 +1,6 @@ +#include "asn1c_internal.h" #include <asn1c_compat.h> -#include <string.h> -#include <errno.h> - #ifdef HAVE_SYS_PARAM_H #include <sys/param.h> /* For MAXPATHLEN */ #endif @@ -11,6 +9,63 @@ #define MAXPATHLEN 1024 #endif +#ifndef DEFFILEMODE /* Normally in <sys/stat.h> */ +#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) +#endif + +FILE * +asn1c_open_file(const char *name, const char *ext) { + int created = 1; + struct stat sb; + char *fname; + int len; + FILE *fp; + int fd; + + /* + * Compute filenames. + */ + len = strlen(name) + strlen(ext) + 1; + fname = alloca(len); + snprintf(fname, len, "%s%s", name, ext); + + /* + * Create files. + */ + fd = open(fname, O_CREAT | O_EXCL | O_WRONLY, DEFFILEMODE); + if(fd == -1 && errno == EEXIST) { + fd = open(fname, O_WRONLY, DEFFILEMODE); + created = 0; + } + if(fd == -1) { + perror(fname); + return NULL; + } + + /* + * Check sanity. + */ + if(fstat(fd, &sb) || !S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s: Not a regular file\n", fname); + if(created) unlink(fname); + close(fd); + return NULL; + } + + (void)ftruncate(fd, 0); + + /* + * Convert file descriptor into file pointer. + */ + fp = fdopen(fd, "w"); + if(fp == NULL) { + if(created) unlink(fname); + close(fd); + } + return fp; +} + + char * a1c_basename(const char *path) { static char strbuf[MAXPATHLEN]; @@ -33,7 +88,7 @@ a1c_basename(const char *path) { for(name = pend; name > path && name[-1] != '/'; name--); - if((pend - name) >= sizeof(strbuf) - 1) { + if((pend - name) >= (int)sizeof(strbuf) - 1) { errno = ENAMETOOLONG; return 0; } @@ -79,7 +134,7 @@ a1c_dirname(const char *path) { return strbuf; } - if((last - path) >= sizeof(strbuf)) { + if((last - path) >= (int)sizeof(strbuf)) { errno = ENAMETOOLONG; return 0; } diff --git a/libasn1compiler/asn1c_compat.h b/libasn1compiler/asn1c_compat.h index 9461b781e24acda3beafa00ab96ac7cf52fd3602..e80e2e77a34496c177d88d75563510f4d57027fc 100644 --- a/libasn1compiler/asn1c_compat.h +++ b/libasn1compiler/asn1c_compat.h @@ -5,6 +5,15 @@ #include <config.h> #endif +/* + * Open the arbitrary file by its base name and extension. + */ +FILE *asn1c_open_file(const char *base_part, const char *extension); + +/* + * Obtain base name and directory name of a path. + * Some systems have them in <libgen.h> as dirname(3) and basename(3). + */ char *a1c_basename(const char *path); char *a1c_dirname(const char *path); diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 257e02c5c29e739a83020cbf0293bf3601450ea8..ee4369603f9ccda501d38df99fa94ac929a40b73 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -1,10 +1,6 @@ #include "asn1c_internal.h" #include <asn1fix_export.h> -#ifndef DEFFILEMODE /* Normally in <sys/stat.h> */ -#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) -#endif - /* * Construct identifier from multiple parts. * Convert unsafe characters to underscores. @@ -85,60 +81,6 @@ asn1c_make_identifier(int unsafe_only_spaces, char *arg1, ...) { return storage; } -FILE * -asn1c_open_file(arg_t *arg, const char *name, const char *ext) { - int created = 1; - struct stat sb; - char *fname; - int len; - FILE *fp; - int fd; - - (void)arg; /* Unused argument */ - - /* - * Compute filenames. - */ - len = strlen(name) + strlen(ext) + 1; - fname = alloca(len); - snprintf(fname, len, "%s%s", name, ext); - - /* - * Create files. - */ - fd = open(fname, O_CREAT | O_EXCL | O_WRONLY, DEFFILEMODE); - if(fd == -1 && errno == EEXIST) { - fd = open(fname, O_WRONLY, DEFFILEMODE); - created = 0; - } - if(fd == -1) { - perror(fname); - return NULL; - } - - /* - * Check sanity. - */ - if(fstat(fd, &sb) || !S_ISREG(sb.st_mode)) { - fprintf(stderr, "%s: Not a regular file\n", fname); - if(created) unlink(fname); - close(fd); - return NULL; - } - - (void)ftruncate(fd, 0); - - /* - * Convert file descriptor into file pointer. - */ - fp = fdopen(fd, "w"); - if(fp == NULL) { - if(created) unlink(fname); - close(fd); - } - return fp; -} - char * asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { char *typename; diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h index 2f82b0b65557b26f7cf52e2440929376915a9df9..325892a54cd4f4f2f759125aed4e1d67a022e0c7 100644 --- a/libasn1compiler/asn1c_misc.h +++ b/libasn1compiler/asn1c_misc.h @@ -20,9 +20,4 @@ enum tnfmt { }; char *asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format); -/* - * Open the arbitrary file by its base name and extension. - */ -FILE *asn1c_open_file(arg_t *arg, const char *base_part, const char *extension); - #endif /* _ASN1_COMPILER_MISC_H_ */