diff options
author | Lev Walkin <vlm@lionet.info> | 2004-08-19 13:29:18 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-08-19 13:29:18 +0000 |
commit | 4b102255b52174eeb6051dc093245c36b83a6e6c (patch) | |
tree | 825d0e3ff7f03a9a0a788e4c262db6b764d3d1a5 /libasn1compiler/asn1c_compat.c | |
parent | acd9f8b3668896d6d37f34965870ae04a989a4ff (diff) |
moved around
Diffstat (limited to 'libasn1compiler/asn1c_compat.c')
-rw-r--r-- | libasn1compiler/asn1c_compat.c | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c index 44ba3e60..1a402bf4 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; } |