Implement cp -f

This commit is contained in:
sin 2014-05-05 14:58:14 +01:00
parent c323f6f233
commit 02918a46e8
5 changed files with 15 additions and 4 deletions

3
cp.1
View File

@ -17,6 +17,9 @@ copies a given file, naming it the given name. If multiple files are listed
they will be copied into the given directory. they will be copied into the given directory.
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-f
if an existing destination file cannot be opened, remove it and try again.
.TP
.B \-R .B \-R
equivalent to -r. equivalent to -r.
.TP .TP

5
cp.c
View File

@ -8,7 +8,7 @@
static void static void
usage(void) usage(void)
{ {
eprintf("usage: %s [-Rr] source... dest\n", argv0); eprintf("usage: %s [-fRr] source... dest\n", argv0);
} }
int int
@ -17,6 +17,9 @@ main(int argc, char *argv[])
struct stat st; struct stat st;
ARGBEGIN { ARGBEGIN {
case 'f':
cp_fflag = true;
break;
case 'R': case 'R':
case 'r': case 'r':
cp_rflag = true; cp_rflag = true;

1
fs.h
View File

@ -1,6 +1,7 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
#include <stdbool.h> #include <stdbool.h>
extern bool cp_fflag;
extern bool cp_rflag; extern bool cp_rflag;
extern bool rm_fflag; extern bool rm_fflag;
extern bool rm_rflag; extern bool rm_rflag;

View File

@ -12,6 +12,7 @@
#include "../text.h" #include "../text.h"
#include "../util.h" #include "../util.h"
bool cp_fflag = false;
bool cp_rflag = false; bool cp_rflag = false;
int int
@ -62,8 +63,12 @@ cp(const char *s1, const char *s2)
if(!(f1 = fopen(s1, "r"))) if(!(f1 = fopen(s1, "r")))
eprintf("fopen %s:", s1); eprintf("fopen %s:", s1);
if(!(f2 = fopen(s2, "w"))) {
if (cp_fflag == true)
unlink(s2);
if (!(f2 = fopen(s2, "w"))) if (!(f2 = fopen(s2, "w")))
eprintf("fopen %s:", s2); eprintf("fopen %s:", s2);
}
concat(f1, s1, f2, s2); concat(f1, s1, f2, s2);
fchmod(fileno(f2), st.st_mode); fchmod(fileno(f2), st.st_mode);

View File

@ -18,4 +18,3 @@ fnck(const char *a, const char *b, int (*fn)(const char *, const char *))
if(fn(a, b) == -1) if(fn(a, b) == -1)
eprintf("%s -> %s:", a, b); eprintf("%s -> %s:", a, b);
} }