main(argc,argv)
char **argv;
{
char buf[512];
int fold, fnew, n;
char *p1, *p2, *bp;
int mode;
        if(argc != 3) {
                write(1,"Usage: cp oldfile newfile\n",26);
                exit();
        }
        if((fold = open(argv[1],0)) < 0){
                write(1,"Cannot open old file.\n",22);
                exit();
        }
        fstat(fold,buf);
        mode = buf[2] & 037;
        if((fnew = creat(argv[2],mode)) < 0){
                stat(argv[2], buf);
                if((buf[3] & 0100) != 0){
                        p1 = argv[1] - 1;
                        p2 = argv[2] - 1;
                        bp = buf - 1;
                        while(*++bp = *++p2);
                        *bp = '/';
                        p2 = bp;
                        while(*++bp = *++p1)
                                if(*bp == '/')
                                        bp = p2;
                        if((fnew = creat(buf,mode)) < 0){
                                write(1,"Cannot creat new file.\n",23);
                                exit();
                        }
                }else{
                write(1,"Cannot creat new file.\n",23);
                exit();
                }
        }
        while(n = read(fold, buf, 512))
        if(n < 0){
                write(1,"Read error\n",11);
                exit();
        }else
                if(write(fnew,buf,n) != n){
                        write(1,"Write error.\n",13);
                        exit();
                }
        fstat(fnew,buf);
        exit();
}
