Commit 9a4197f942e271323580995751fd9296ef58aad6
Use mkstemp. Delete temporary file immediately
cel committed on 10/25/2016, 12:33:06 AMParent: 2b3308729b9a63d56cc2c4712e8bab2aa818a492
Files changed
ccdl.c | changed |
ccdl.h | changed |
ccdl.c | ||
---|---|---|
@@ -9,24 +9,22 @@ | ||
9 | 9 … | |
10 | 10 … | |
11 | 11 … | |
12 | 12 … | |
13 | -static unsigned int tmp_i = 0; | |
14 | - | |
15 | 13 … | static const char *my_mktemp() |
16 | 14 … | { |
17 | 15 … | const char *tmpdir = getenv("TMPDIR"); |
18 | 16 … | if (!tmpdir) tmpdir = "/tmp"; |
19 | 17 … | static char buf[256]; |
20 | - if (snprintf(buf, sizeof(buf), "%s/ccdl-%d-%i.so", | |
21 | - tmpdir, getpid(), tmp_i++) < 0) return NULL; | |
18 … | + ssize_t len = snprintf(buf, sizeof(buf), "%s/ccdl-XXXXXX", tmpdir); | |
19 … | + if (len < 0) return NULL; | |
20 … | + if (mkstemp(buf) < 0) return NULL; | |
22 | 21 … | return buf; |
23 | 22 … | } |
24 | 23 … | |
25 | 24 … | void lib_init(struct lib *lib, const char *src_fname, const char *sym_name) |
26 | 25 … | { |
27 | 26 … | lib->src_fname = src_fname; |
28 | - lib->lib_fname = NULL; | |
29 | 27 … | lib->sym_name = sym_name; |
30 | 28 … | lib->handle = NULL; |
31 | 29 … | lib->sym = NULL; |
32 | 30 … | } |
@@ -57,18 +55,24 @@ | ||
57 | 55 … | int lib_build(struct lib *lib) |
58 | 56 … | { |
59 | 57 … | void *handle = lib->handle; |
60 | 58 … | if (!handle) { |
61 | - const char *lib_fname = lib->lib_fname; | |
59 … | + const char *src_fname = lib->src_fname; | |
60 … | + if (!src_fname) return -1; | |
61 … | + const char *lib_fname = my_mktemp(); | |
62 | 62 … | if (!lib_fname) { |
63 | - const char *src_fname = lib->src_fname; | |
64 | - if (!src_fname) return -1; | |
65 | - lib_fname = my_mktemp(); | |
66 | - if (!lib_fname) return -1; | |
67 | - lib->lib_fname = lib_fname; | |
68 | - if (compile(src_fname, lib_fname)) return -1; | |
63 … | + warn("mktemp"); | |
64 … | + return -1; | |
69 | 65 … | } |
66 … | + if (compile(src_fname, lib_fname)) return -1; | |
67 … | + dlerror(); | |
70 | 68 … | handle = dlopen(lib_fname, RTLD_NOW); |
69 … | + char *err = dlerror(); | |
70 … | + if (unlink(lib_fname) < 0) warn("unlink"); | |
71 … | + if (err) { | |
72 … | + warnx("dlopen: %s", err); | |
73 … | + return -1; | |
74 … | + } | |
71 | 75 … | lib->handle = handle; |
72 | 76 … | } |
73 | 77 … | const char *sym_name = lib->sym_name; |
74 | 78 … | if (!sym_name) return -1; |
@@ -90,12 +94,8 @@ | ||
90 | 94 … | dlclose(lib->handle); |
91 | 95 … | lib->handle = NULL; |
92 | 96 … | lib->sym = NULL; |
93 | 97 … | } |
94 | - if (lib->lib_fname) { | |
95 | - unlink(lib->lib_fname); | |
96 | - lib->lib_fname = NULL; | |
97 | - } | |
98 | 98 … | } |
99 | 99 … | |
100 | 100 … | void ccdl_init(struct ccdl *ccdl, const char *src_fname, const char *sym_name) |
101 | 101 … | { |
Built with git-ssb-web