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