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 a.volkov@rusbitech.ru
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);