/*1* Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 20092* The President and Fellows of Harvard College.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the University nor the names of its contributors13* may be used to endorse or promote products derived from this software14* without specific prior written permission.15*16* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829#include <unistd.h>30#include <err.h>3132/*33* cp - copy a file.34* Usage: cp oldfile newfile35*/363738/* Copy one file to another. */39static40void41copy(const char *from, const char *to)42{43int fromfd;44int tofd;45char buf[1024];46int len, wr, wrtot;4748/*49* Open the files, and give up if they won't open50*/51fromfd = open(from, O_RDONLY);52if (fromfd<0) {53err(1, "%s", from);54}55tofd = open(to, O_WRONLY|O_CREAT|O_TRUNC);56if (tofd<0) {57err(1, "%s", to);58}5960/*61* As long as we get more than zero bytes, we haven't hit EOF.62* Zero means EOF. Less than zero means an error occurred.63* We may read less than we asked for, though, in various cases64* for various reasons.65*/66while ((len = read(fromfd, buf, sizeof(buf)))>0) {67/*68* Likewise, we may actually write less than we attempted69* to. So loop until we're done.70*/71wrtot = 0;72while (wrtot < len) {73wr = write(tofd, buf+wrtot, len-wrtot);74if (wr<0) {75err(1, "%s", to);76}77wrtot += wr;78}79}80/*81* If we got a read error, print it and exit.82*/83if (len<0) {84err(1, "%s", from);85}8687if (close(fromfd) < 0) {88err(1, "%s: close", from);89}9091if (close(tofd) < 0) {92err(1, "%s: close", to);93}94}9596int97main(int argc, char *argv[])98{99/*100* Just do it.101*102* We don't allow the Unix model where you can do103* cp file1 file2 file3 destination-directory104*105* although this would be pretty easy to add.106*/107if (argc!=3) {108errx(1, "Usage: cp OLDFILE NEWFILE");109}110copy(argv[1], argv[2]);111return 0;112}113114115