pass.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /* $Source: /u/mark/src/pax/RCS/pass.c,v $
  2. *
  3. * $Revision: 1.3 $
  4. *
  5. * pass.c - handle the pass option of cpio
  6. *
  7. * DESCRIPTION
  8. *
  9. * These functions implement the pass options in PAX. The pass option
  10. * copies files from one directory hierarchy to another.
  11. *
  12. * AUTHOR
  13. *
  14. * Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
  15. *
  16. * Sponsored by The USENIX Association for public distribution.
  17. *
  18. * Copyright (c) 1989 Mark H. Colburn.
  19. * All rights reserved.
  20. *
  21. * Redistribution and use in source and binary forms are permitted
  22. * provided that the above copyright notice is duplicated in all such
  23. * forms and that any documentation, advertising materials, and other
  24. * materials related to such distribution and use acknowledge that the
  25. * software was developed * by Mark H. Colburn and sponsored by The
  26. * USENIX Association.
  27. *
  28. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  29. * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  30. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  31. *
  32. * $Log: pass.c,v $
  33. * Revision 1.3 89/02/12 10:29:51 mark
  34. * Fixed misspelling of Replstr
  35. *
  36. * Revision 1.2 89/02/12 10:05:09 mark
  37. * 1.2 release fixes
  38. *
  39. * Revision 1.1 88/12/23 18:02:20 mark
  40. * Initial revision
  41. *
  42. */
  43. #ifndef lint
  44. static char *ident = "$Id: pass.c,v 1.3 89/02/12 10:29:51 mark Exp $";
  45. static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  46. #endif /* ! lint */
  47. /* Headers */
  48. #include "pax.h"
  49. /* pass - copy within the filesystem
  50. *
  51. * DESCRIPTION
  52. *
  53. * Pass copies the named files from the current directory hierarchy to
  54. * the directory pointed to by dirname.
  55. *
  56. * PARAMETERS
  57. *
  58. * char *dirname - name of directory to copy named files to.
  59. *
  60. */
  61. #ifdef __STDC__
  62. int pass(char *dirname)
  63. #else
  64. int pass(dirname)
  65. char *dirname;
  66. #endif
  67. {
  68. char name[PATH_MAX + 1];
  69. int fd;
  70. Stat sb;
  71. while (name_next(name, &sb) >= 0 && (fd = openin(name, &sb)) >= 0) {
  72. if (rplhead != (Replstr *)NULL) {
  73. rpl_name(name);
  74. }
  75. if (get_disposition("pass", name) || get_newname(name, sizeof(name))) {
  76. /* skip file... */
  77. if (fd) {
  78. close(fd);
  79. }
  80. continue;
  81. }
  82. if (passitem(name, &sb, fd, dirname)) {
  83. close(fd);
  84. }
  85. if (f_verbose) {
  86. fprintf(stderr, "%s/%s\n", dirname, name);
  87. }
  88. }
  89. }
  90. /* passitem - copy one file
  91. *
  92. * DESCRIPTION
  93. *
  94. * Passitem copies a specific file to the named directory
  95. *
  96. * PARAMETERS
  97. *
  98. * char *from - the name of the file to open
  99. * Stat *asb - the stat block associated with the file to copy
  100. * int ifd - the input file descriptor for the file to copy
  101. * char *dir - the directory to copy it to
  102. *
  103. * RETURNS
  104. *
  105. * Returns given input file descriptor or -1 if an error occurs.
  106. *
  107. * ERRORS
  108. */
  109. #ifdef __STDC__
  110. int passitem(char *from, Stat *asb, int ifd, char *dir)
  111. #else
  112. int passitem(from, asb, ifd, dir)
  113. char *from;
  114. Stat *asb;
  115. int ifd;
  116. char *dir;
  117. #endif
  118. {
  119. int ofd;
  120. time_t tstamp[2];
  121. char to[PATH_MAX + 1];
  122. if (nameopt(strcat(strcat(strcpy(to, dir), "/"), from)) < 0) {
  123. return (-1);
  124. }
  125. if (asb->sb_nlink > 1) {
  126. linkto(to, asb);
  127. }
  128. if (f_link && islink(from, asb) == (Link *)NULL) {
  129. linkto(from, asb);
  130. }
  131. if ((ofd = openout(to, asb, islink(to, asb), 1)) < 0) {
  132. return (-1);
  133. }
  134. if (ofd > 0) {
  135. passdata(from, ifd, to, ofd);
  136. }
  137. tstamp[0] = asb->sb_atime;
  138. tstamp[1] = f_mtime ? asb->sb_mtime : time((time_t *) 0);
  139. utime(to, tstamp);
  140. return (ifd);
  141. }