uuprog

annotate cp.c @ 0:4f628556fa3e

uuprog initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 25 Aug 2011 08:53:01 +0300
parents
children
rev   line source
nuclear@0 1 /*! cc -o cp cp.c */
nuclear@0 2 #include <stdio.h>
nuclear@0 3 #include <string.h>
nuclear@0 4 #include <errno.h>
nuclear@0 5 #include <unistd.h>
nuclear@0 6 #include <sys/types.h>
nuclear@0 7 #include <sys/stat.h>
nuclear@0 8
nuclear@0 9 int copy_file(const char *sname, const char *dname);
nuclear@0 10
nuclear@0 11 char buf[4096];
nuclear@0 12
nuclear@0 13 int main(int argc, char **argv)
nuclear@0 14 {
nuclear@0 15 int i, src_count = argc - 2;
nuclear@0 16
nuclear@0 17 if(src_count > 1) {
nuclear@0 18 struct stat st;
nuclear@0 19 char *to_dir = argv[argc - 1];
nuclear@0 20
nuclear@0 21 if(stat(to_dir, &st) == -1) {
nuclear@0 22 fprintf(stderr, "failed to stat %s: %s\n", to_dir, strerror(errno));
nuclear@0 23 return 1;
nuclear@0 24 }
nuclear@0 25
nuclear@0 26 for(i=0; i<src_count; i++) {
nuclear@0 27 sprintf(buf, "%s/%s", to_dir, argv[i+1]);
nuclear@0 28 if(copy_file(argv[i+1], buf) == -1) {
nuclear@0 29 return 1;
nuclear@0 30 }
nuclear@0 31 }
nuclear@0 32 return 0;
nuclear@0 33 }
nuclear@0 34
nuclear@0 35 return copy_file(argv[1], argv[2]) == -1 ? 1 : 0;
nuclear@0 36 }
nuclear@0 37
nuclear@0 38 int copy_file(const char *sname, const char *dname)
nuclear@0 39 {
nuclear@0 40 FILE *src, *dst;
nuclear@0 41 size_t brd;
nuclear@0 42
nuclear@0 43 if(!(src = fopen(sname, "rb"))) {
nuclear@0 44 fprintf(stderr, "failed to open source file %s: %s\n", sname, strerror(errno));
nuclear@0 45 return -1;
nuclear@0 46 }
nuclear@0 47 if(!(dst = fopen(dname, "wb"))) {
nuclear@0 48 fclose(src);
nuclear@0 49 fprintf(stderr, "failed to open destination file %s: %s\n", dname, strerror(errno));
nuclear@0 50 return -1;
nuclear@0 51 }
nuclear@0 52
nuclear@0 53 while((brd = fread(buf, 1, sizeof buf, src)) > 0) {
nuclear@0 54 fwrite(buf, 1, brd, dst);
nuclear@0 55 }
nuclear@0 56
nuclear@0 57 fclose(dst);
nuclear@0 58 fclose(src);
nuclear@0 59 return 0;
nuclear@0 60 }