Skip to content

Commit a30b40d

Browse files
committed
stop using system() for file copy
Hopefully fixes dosemu2/dosemu2#2643
1 parent aaa01bc commit a30b40d

1 file changed

Lines changed: 29 additions & 19 deletions

File tree

src/djdev64/djdev64.c

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -128,28 +128,38 @@ static char *findmnt(const char *path)
128128

129129
static const char *var_list[] = { "_crt0_startup_flags", NULL };
130130

131-
static int cp(const char *from, const char *to)
131+
static int copy_file(const char *src, const char *dest)
132132
{
133-
char buf[1024];
134-
int ret;
135-
size_t sz = snprintf(buf, sizeof(buf), "cp %s %s", from, to);
136-
if (sz >= sizeof(buf))
133+
char buffer[4096];
134+
size_t bytes;
135+
int rc = 0;
136+
FILE *source = fopen(src, "rb");
137+
FILE *destination = fopen(dest, "wb");
138+
139+
if (!source || !destination) {
140+
if (source) {
141+
fprintf(stderr, "failed to open for writing %s\n", dest);
142+
fclose(source);
143+
} else {
144+
fprintf(stderr, "failed to open for reading %s\n", src);
145+
}
137146
return -1;
138-
ret = system(buf);
139-
switch (ret) {
140-
case -1:
141-
fprintf(stderr, "system(cp) failed: %s\n", strerror(errno));
142-
break;
143-
case 0:
144-
break;
145-
case 127:
146-
fprintf(stderr, "system(cp): shell unavailable\n");
147-
break;
148-
default:
149-
fprintf(stderr, "system(cp): command failed with %i\n", ret);
147+
}
148+
149+
while ((bytes = fread(buffer, 1, sizeof(buffer), source)) > 0) {
150+
size_t wr = fwrite(buffer, 1, bytes, destination);
151+
if (wr != bytes) {
152+
fprintf(stderr, "failed to write to %s\n", dest);
153+
rc = -1;
150154
break;
155+
}
151156
}
152-
return ret;
157+
158+
fclose(source);
159+
fclose(destination);
160+
if (rc)
161+
remove(dest);
162+
return rc;
153163
}
154164

155165
static void *emu_dlmopen(int handle, const char *filename, int flags,
@@ -170,7 +180,7 @@ static void *emu_dlmopen(int handle, const char *filename, int flags,
170180
p++;
171181
unlink(path);
172182
/* glibc compares inodes from stat(), so symlinks do not help - use cp */
173-
err = cp(filename, path);
183+
err = copy_file(filename, path);
174184
if (err) {
175185
fprintf(stderr, "cp(%s %s) failed\n", filename, path);
176186
#if 1

0 commit comments

Comments
 (0)