aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-10-06 10:09:34 +0000
committerLev Walkin <vlm@lionet.info>2005-10-06 10:09:34 +0000
commita895afba67a27db3caf3ac3b772ba1696b161afd (patch)
treee492a63b066ad3d2c3c73d60e37b2729e7109a2c
parentc0e7071cd4e790bf75beda27ef07f8cb4ab4919d (diff)
-fskeletons-copy
-rw-r--r--ChangeLog3
-rw-r--r--asn1c/asn1c.15
-rw-r--r--asn1c/asn1c.c3
-rw-r--r--doc/asn1c-usage.html4
-rw-r--r--doc/asn1c-usage.lyx34
-rw-r--r--doc/asn1c-usage.pdfbin132090 -> 131795 bytes
-rw-r--r--libasn1compiler/asn1c_compat.c9
-rw-r--r--libasn1compiler/asn1c_save.c51
-rw-r--r--libasn1compiler/asn1compiler.h5
9 files changed, 96 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 684b0ace..f59da179 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,5 @@
-0.9.19: 2005-Oct-05
+0.9.19: 2005-Oct-06
* A proper solution to circular references. No kludge flags
should be necessary anymore to produce reference-free code:
@@ -10,6 +10,7 @@
* New feature for unber(1): -s <skip> bytes.
* Mandatory elements map for SET was not getting generated properly.
(Test case 94) (Severity: high; Security impact: low)
+ * asn1c: new command line option: -fskeletons-copy.
0.9.18: 2005-Aug-14
diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1
index 893d5995..a4289355 100644
--- a/asn1c/asn1c.1
+++ b/asn1c/asn1c.1
@@ -25,7 +25,7 @@ and other encoding standards.
.br
\fB\-fall-defs-global \-fbless-SIZE \-fcompound-names \-findirect-choice
.BI "\-fknown-extern-type="<name>
-\fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-ftypes88\fR
+\fB\-fnative-types \-fno-constraints \-fno-include-deps \-funnamed-unions \-fskeletons-copy \-ftypes88\fR
.TP
\fIOutput Options\fR
.br
@@ -115,6 +115,9 @@ Helps prevent namespace collisions.
.B \-funnamed-unions
Enable unnamed unions in the definitions of target language's structures.
.TP
+.B \-fskeletons-copy
+Copy support files (skeletons) rather than symlink them.
+.TP
.B \-ftypes88
Pretend to support only ASN.1:1988 embedded types. Certain reserved words,
such as UniversalString and BMPString, become ordinary type references
diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c
index 11559de3..e009c381 100644
--- a/asn1c/asn1c.c
+++ b/asn1c/asn1c.c
@@ -93,6 +93,8 @@ main(int ac, char **av) {
asn1_compiler_flags |= A1C_NO_INCLUDE_DEPS;
} else if(strcmp(optarg, "unnamed-unions") == 0) {
asn1_compiler_flags |= A1C_UNNAMED_UNIONS;
+ } else if(strcmp(optarg, "skeletons-copy") == 0) {
+ asn1_compiler_flags |= A1C_SKELETONS_COPY;
} else if(strcmp(optarg, "types88") == 0) {
asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988;
} else {
@@ -321,6 +323,7 @@ usage(const char *av0) {
" -fno-constraints Do not generate constraint checking code\n"
" -fno-include-deps Do not generate courtesy #includes for dependencies\n"
" -funnamed-unions Enable unnamed unions in structures\n"
+" -fskeletons-copy Force copying the support files\n"
" -ftypes88 Pretend to support only ASN.1:1988 embedded types\n"
"\n"
diff --git a/doc/asn1c-usage.html b/doc/asn1c-usage.html
index 106ebba0..239e77f4 100644
--- a/doc/asn1c-usage.html
+++ b/doc/asn1c-usage.html
@@ -430,11 +430,15 @@ dependencies.</FONT></TD></TR>
<FONT SIZE="-1">Enable unnamed unions in the definitions of target language's
structures.</FONT></TD></TR>
</TBODY><TBODY>
+<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-fskeletons-copy</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216">
+<FONT SIZE="-1">Copy support files rather than symlink them.</FONT></TD></TR>
+</TBODY><TBODY>
<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><FONT SIZE="-1">-ftypes88</FONT></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216">
<FONT SIZE="-1">Pretend to support only ASN.1:1988 embedded types. Certain
reserved words, such as UniversalString and BMPString, become ordinary
type references and may be redefined by the specification.</FONT></TD></TR>
</TBODY><TBODY>
+
<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP><B><FONT SIZE="-1">Output Options</FONT></B></TD><TD VALIGN=BASELINE ALIGN=LEFT WIDTH="216">
<B><FONT SIZE="-1">Description</FONT></B></TD></TR>
<TR><TD VALIGN=BASELINE ALIGN=LEFT NOWRAP>
diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx
index 3c6ed97b..205b9dc8 100644
--- a/doc/asn1c-usage.lyx
+++ b/doc/asn1c-usage.lyx
@@ -71,7 +71,7 @@ status Open
\backslash
lhead{This document describes
\backslash
-href{http://lionet.info/asn1c}{asn1c-0.9.18}}
+href{http://lionet.info/asn1c}{asn1c-0.9.19}}
\layout Standard
\backslash
@@ -451,7 +451,7 @@ The following table summarizes the asn1c command line options.
\begin_inset Tabular
-<lyxtabular version="3" rows="26" columns="2">
+<lyxtabular version="3" rows="27" columns="2">
<features islongtable="true">
<column alignment="left" valignment="top" leftline="true" width="0">
<column alignment="block" valignment="top" leftline="true" rightline="true" width="3in">
@@ -836,6 +836,8 @@ Use complex names for C structures.
\layout Standard
+
+\size small
-findirect-choice
\end_inset
</cell>
@@ -844,6 +846,8 @@ Use complex names for C structures.
\layout Standard
+
+\size small
When generating code for a CHOICE type, compile the CHOICE members as indirect
pointers instead of declaring them inline.
Consider using this option together with
@@ -861,6 +865,8 @@ When generating code for a CHOICE type, compile the CHOICE members as indirect
\layout Standard
+
+\size small
-fknown-extern-type=
\emph on
<name>
@@ -871,6 +877,8 @@ When generating code for a CHOICE type, compile the CHOICE members as indirect
\layout Standard
+
+\size small
Pretend the specified type is known.
The compiler will assume the target language source files for the given
type have been provided manually.
@@ -969,6 +977,28 @@ Enable unnamed unions in the definitions of target language's structures.
\end_inset
</cell>
</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size small
+-fskeletons-copy
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size small
+Copy support files rather than symlink them.
+\end_inset
+</cell>
+</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf
index 6efd7e2e..3d188cff 100644
--- a/doc/asn1c-usage.pdf
+++ b/doc/asn1c-usage.pdf
Binary files differ
diff --git a/libasn1compiler/asn1c_compat.c b/libasn1compiler/asn1c_compat.c
index 2a80251a..b393d6d2 100644
--- a/libasn1compiler/asn1c_compat.c
+++ b/libasn1compiler/asn1c_compat.c
@@ -80,12 +80,19 @@ asn1c_open_file(const char *name, const char *ext, char **opt_tmpname) {
if(fp == NULL) {
if(created) unlink(fname);
close(fd);
+ return NULL;
}
/* Return the temporary file name */
if(opt_tmpname) {
*opt_tmpname = strdup(fname);
- assert(*opt_tmpname);
+ if(*opt_tmpname) {
+ /* Successfull */
+ } else {
+ if(created) unlink(fname);
+ fclose(fp);
+ return NULL;
+ }
}
return fp;
diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c
index e0a2f671..d35db940 100644
--- a/libasn1compiler/asn1c_save.c
+++ b/libasn1compiler/asn1c_save.c
@@ -280,6 +280,8 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) {
if(rename(tmpname_c, name_buf)) {
unlink(tmpname_c);
perror(tmpname_c);
+ free(tmpname_c);
+ free(tmpname_h);
return -1;
}
}
@@ -292,6 +294,8 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) {
if(rename(tmpname_h, name_buf)) {
unlink(tmpname_h);
perror(tmpname_h);
+ free(tmpname_c);
+ free(tmpname_h);
return -1;
}
}
@@ -308,11 +312,20 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps) {
static int
identical_files(const char *fname1, const char *fname2) {
- char buf[2][8192];
+ char buf[2][4096];
FILE *fp1, *fp2;
size_t olen, nlen;
int retval = 1; /* Files are identical */
+#ifndef WIN32
+ struct stat sb;
+
+ if(lstat(fname1, &sb) || !S_ISREG(sb.st_mode)
+ || lstat(fname2, &sb) || !S_ISREG(sb.st_mode)) {
+ return 0; /* Files are not identical */
+ }
+#endif
+
fp1 = fopen(fname1, "r");
if(!fp1) { return 0; }
fp2 = fopen(fname2, "r");
@@ -338,7 +351,8 @@ identical_files(const char *fname1, const char *fname2) {
*/
static int
real_copy(const char *src, const char *dst) {
- unsigned char buf[8192];
+ unsigned char buf[4096];
+ char *tmpname;
FILE *fpsrc, *fpdst;
size_t len;
int retval = 0;
@@ -348,36 +362,45 @@ real_copy(const char *src, const char *dst) {
fpsrc = fopen(src, "r");
if(!fpsrc) { errno = EIO; return -1; }
- fpdst = asn1c_open_file(dst, "", 0);
+ fpdst = asn1c_open_file(dst, "", &tmpname);
if(!fpdst) { fclose(fpsrc); errno = EIO; return -1; }
while(!feof(fpsrc)) {
len = fread(buf, 1, sizeof(buf), fpsrc);
if(fwrite(buf, 1, len, fpdst) != len) {
+ perror(tmpname);
errno = EIO;
retval = -1;
break;
}
}
-
fclose(fpsrc);
fclose(fpdst);
+
+ /* Check if copied correctly, and rename into a permanent name */
+ if(retval) {
+ unlink(tmpname);
+ } else if(rename(tmpname, dst)) {
+ unlink(tmpname);
+ perror(tmpname);
+ retval = -1;
+ }
+ free(tmpname);
return retval;
}
static int
asn1c_copy_over(arg_t *arg, char *path) {
char *fname;
-
- (void)arg; /* Unused argument */
-
- fname = a1c_basename(path);
- if(!fname
#ifdef WIN32
- || real_copy(path, fname)
+ int use_real_copy = 1;
#else
- || (1 ? symlink(path, fname) : real_copy(path, fname))
+ int use_real_copy = (arg->flags & A1C_SKELETONS_COPY);
#endif
+
+ fname = a1c_basename(path);
+ if(!fname
+ || (use_real_copy ? real_copy(path, fname) : symlink(path, fname))
) {
if(errno == EEXIST) {
struct stat sb1, sb2;
@@ -402,13 +425,15 @@ asn1c_copy_over(arg_t *arg, char *path) {
/* Ignore this */
return 0;
} else {
- fprintf(stderr, "Symlink %s -> %s failed: %s\n",
+ fprintf(stderr, "%s %s -> %s failed: %s\n",
+ use_real_copy ? "Copy" : "Symlink",
path, fname, strerror(errno));
return -1;
}
}
- fprintf(stderr, "Symlinked %s\t-> %s\n", path, fname);
+ fprintf(stderr, "%s %s\t-> %s\n",
+ use_real_copy ? "Copied" : "Symlinked", path, fname);
return 1;
}
diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h
index e688018a..847300ff 100644
--- a/libasn1compiler/asn1compiler.h
+++ b/libasn1compiler/asn1compiler.h
@@ -51,6 +51,11 @@ enum asn1c_flags {
* Compile members of CHOICE as indirect pointers.
*/
A1C_INDIRECT_CHOICE = 0x0400,
+ /*
+ * -fskeletons-copy
+ * Copy support files rather than symlink them.
+ */
+ A1C_SKELETONS_COPY = 0x0800,
};
/*