From: Alexander Volkov Date: Mon, 21 Sep 2015 13:05:57 +0000 (+0300) Subject: arecord: Remove only regular files X-Git-Tag: v1.1.0~22 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=5f0fc49a3ab9e9a66eb7a74582829c21556506a1;p=alsa-utils.git arecord: Remove only regular files arecord removes a file before writing into it. It's not appropriate in some cases. For example, if you a pass a symlink to a file, then the symlink will be removed while the user expects to record into the symlink's target. Another case is recording into the device file. Some modems provide a tty device file as a voice device. And it's not possible to write into it under root with arecord, because it removes the device file. So check the type of a file before writing into it and remove only regular files. Signed-off-by: Alexander Volkov Signed-off-by: Takashi Iwai --- diff --git a/aplay/aplay.c b/aplay/aplay.c index 459f7dd..1b2cdfc 100644 --- a/aplay/aplay.c +++ b/aplay/aplay.c @@ -2929,6 +2929,7 @@ static void capture(char *orig_name) char *name = orig_name; /* current filename */ char namebuf[PATH_MAX+1]; off64_t count, rest; /* number of bytes to capture */ + struct stat statbuf; /* get number of bytes to capture */ count = calc_count(); @@ -2973,7 +2974,10 @@ static void capture(char *orig_name) } /* open a new file */ - remove(name); + if (!lstat(name, &statbuf)) { + if (S_ISREG(statbuf.st_mode)) + remove(name); + } fd = safe_open(name); if (fd < 0) { perror(name);