diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/cmd/pax/pass.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/cmd/pax/pass.c')
-rwxr-xr-x | sys/src/ape/cmd/pax/pass.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/sys/src/ape/cmd/pax/pass.c b/sys/src/ape/cmd/pax/pass.c new file mode 100755 index 000000000..f43481dd7 --- /dev/null +++ b/sys/src/ape/cmd/pax/pass.c @@ -0,0 +1,163 @@ +/* $Source: /u/mark/src/pax/RCS/pass.c,v $ + * + * $Revision: 1.3 $ + * + * pass.c - handle the pass option of cpio + * + * DESCRIPTION + * + * These functions implement the pass options in PAX. The pass option + * copies files from one directory hierarchy to another. + * + * AUTHOR + * + * Mark H. Colburn, NAPS International (mark@jhereg.mn.org) + * + * Sponsored by The USENIX Association for public distribution. + * + * Copyright (c) 1989 Mark H. Colburn. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice is duplicated in all such + * forms and that any documentation, advertising materials, and other + * materials related to such distribution and use acknowledge that the + * software was developed * by Mark H. Colburn and sponsored by The + * USENIX Association. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Log: pass.c,v $ + * Revision 1.3 89/02/12 10:29:51 mark + * Fixed misspelling of Replstr + * + * Revision 1.2 89/02/12 10:05:09 mark + * 1.2 release fixes + * + * Revision 1.1 88/12/23 18:02:20 mark + * Initial revision + * + */ + +#ifndef lint +static char *ident = "$Id: pass.c,v 1.3 89/02/12 10:29:51 mark Exp $"; +static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n"; +#endif /* ! lint */ + + +/* Headers */ + +#include "pax.h" + + +/* pass - copy within the filesystem + * + * DESCRIPTION + * + * Pass copies the named files from the current directory hierarchy to + * the directory pointed to by dirname. + * + * PARAMETERS + * + * char *dirname - name of directory to copy named files to. + * + */ + +#ifdef __STDC__ + +int pass(char *dirname) + +#else + +int pass(dirname) +char *dirname; + +#endif +{ + char name[PATH_MAX + 1]; + int fd; + Stat sb; + + while (name_next(name, &sb) >= 0 && (fd = openin(name, &sb)) >= 0) { + + if (rplhead != (Replstr *)NULL) { + rpl_name(name); + } + if (get_disposition("pass", name) || get_newname(name, sizeof(name))) { + /* skip file... */ + if (fd) { + close(fd); + } + continue; + } + + if (passitem(name, &sb, fd, dirname)) { + close(fd); + } + if (f_verbose) { + fprintf(stderr, "%s/%s\n", dirname, name); + } + } +} + + +/* passitem - copy one file + * + * DESCRIPTION + * + * Passitem copies a specific file to the named directory + * + * PARAMETERS + * + * char *from - the name of the file to open + * Stat *asb - the stat block associated with the file to copy + * int ifd - the input file descriptor for the file to copy + * char *dir - the directory to copy it to + * + * RETURNS + * + * Returns given input file descriptor or -1 if an error occurs. + * + * ERRORS + */ + +#ifdef __STDC__ + +int passitem(char *from, Stat *asb, int ifd, char *dir) + +#else + +int passitem(from, asb, ifd, dir) +char *from; +Stat *asb; +int ifd; +char *dir; + +#endif +{ + int ofd; + time_t tstamp[2]; + char to[PATH_MAX + 1]; + + if (nameopt(strcat(strcat(strcpy(to, dir), "/"), from)) < 0) { + return (-1); + } + if (asb->sb_nlink > 1) { + linkto(to, asb); + } + if (f_link && islink(from, asb) == (Link *)NULL) { + linkto(from, asb); + } + if ((ofd = openout(to, asb, islink(to, asb), 1)) < 0) { + return (-1); + } + if (ofd > 0) { + passdata(from, ifd, to, ofd); + } + tstamp[0] = asb->sb_atime; + tstamp[1] = f_mtime ? asb->sb_mtime : time((time_t *) 0); + utime(to, tstamp); + return (ifd); +} |