*** empty log message ***
This commit is contained in:
parent
a139e5334b
commit
b2a0e6b973
|
@ -0,0 +1,13 @@
|
||||||
|
include GNUmakevars
|
||||||
|
include GNUmakerules
|
||||||
|
|
||||||
|
ftcp: ftcp.o
|
||||||
|
$(CC) $^ -lant -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o ftcp core foo bar
|
||||||
|
|
||||||
|
install: $(BINDIR)/ftcp
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f *.bak *.d
|
|
@ -0,0 +1,105 @@
|
||||||
|
char ftcp_rcs_id[] =
|
||||||
|
"$Id: ftcp.c,v 1.1 2002-03-18 20:40:08 hjp Exp $";
|
||||||
|
/*
|
||||||
|
ftcp - fault tolerant copy
|
||||||
|
|
||||||
|
copy one file to another, ignoring any errors.
|
||||||
|
This is useful for copying files from defective media.
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <ant/io.h>
|
||||||
|
#include <ant/string.h>
|
||||||
|
|
||||||
|
char *cmnd;
|
||||||
|
|
||||||
|
|
||||||
|
off_t skip_size = 512;
|
||||||
|
size_t buf_size = 512;
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: %s [-s skip_size] source dest\n", cmnd);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ftcp(char const *src, char const *dest)
|
||||||
|
{
|
||||||
|
int sfd, dfd, count;
|
||||||
|
char *buf;
|
||||||
|
off_t off = 0;
|
||||||
|
|
||||||
|
if ((buf = malloc(buf_size)) == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sfd = open(src, O_RDONLY);
|
||||||
|
if (sfd < 0)
|
||||||
|
return -1;
|
||||||
|
dfd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, 0666);
|
||||||
|
if (dfd < 0)
|
||||||
|
{
|
||||||
|
close(sfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (;;) {
|
||||||
|
lseek(sfd, off, SEEK_SET);
|
||||||
|
count = read(sfd, buf, buf_size);
|
||||||
|
switch (count) {
|
||||||
|
case -1:
|
||||||
|
fprintf(stderr, "%s: error at offset %lu: %s\n",
|
||||||
|
cmnd, (unsigned long)off, strerror(errno));
|
||||||
|
off += skip_size;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
goto the_end;
|
||||||
|
default:
|
||||||
|
lseek(dfd, off, SEEK_SET);
|
||||||
|
write(dfd, buf, count);
|
||||||
|
off += count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
the_end:
|
||||||
|
|
||||||
|
close(sfd);
|
||||||
|
close(dfd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
cmnd = argv[0];
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "s:")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 's':
|
||||||
|
skip_size = strtoul(optarg, &p, 0);
|
||||||
|
if (p == optarg || *p != '\0') usage();
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
usage();
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc - 2) {
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
ftcp(argv[optind], argv[optind+1]);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue