Commit 4b102255 authored by Lev Walkin's avatar Lev Walkin

moved around

parent acd9f8b3
#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;
}
......
......@@ -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);
......
#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;
......
......@@ -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_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment