/* * cp oldfile newfile */ main(argc,argv) char **argv; { static int buf[256]; char nname[256]; int fold, fnew, n; register char *p1, *p2, *bp; char *tnm; int mode; int omtime[2]; if(argc != 3) { write(1, "Usage: cp oldfile newfile\n", 26); exit(1); } if((fold = open(argv[1], 0)) < 0) { write(1, "Cannot open old file.\n", 22); exit(1); } fstat(fold, buf); mode = buf[2]; omtime[0] = buf[16]; omtime[1] = buf[17]; /* is target a directory? */ if (stat(argv[2], buf+50)>=0 && (buf[52]&060000)==040000) { p1 = argv[1]; p2 = argv[2]; bp = &nname[0]; tnm = bp; while(*bp++ = *p2++); bp[-1] = '/'; p2 = bp; while(*bp = *p1++) if(*bp++ == '/') bp = p2; } else tnm = argv[2]; if (stat(tnm, buf+50) >= 0) { if (buf[0]==buf[50] && buf[1]==buf[51]) { write(1, "Copying file to itself.\n", 24); exit(1); } } if ((fnew = creat(tnm, mode)) < 0) { write(1, "Can't create new file.\n", 23); exit(1); } while(n = read(fold, buf, 512)) { if(n < 0) { write(1, "Read error\n", 11); exit(1); } else if(write(fnew, buf, n) != n){ write(1, "Write error.\n", 13); exit(1); } } if(mdate(tnm, &omtime[0]) < 0) write(1, "Cannot set modtime of target file.\n",35); exit(0); }