1 1.31 christos /* $NetBSD: tables.c,v 1.31 2013/10/18 19:53:34 christos Exp $ */ 2 1.4 cgd 3 1.1 jtc /*- 4 1.22 agc * Copyright (c) 1992 Keith Muller. 5 1.1 jtc * Copyright (c) 1992, 1993 6 1.1 jtc * The Regents of the University of California. All rights reserved. 7 1.1 jtc * 8 1.1 jtc * This code is derived from software contributed to Berkeley by 9 1.1 jtc * Keith Muller of the University of California, San Diego. 10 1.1 jtc * 11 1.1 jtc * Redistribution and use in source and binary forms, with or without 12 1.1 jtc * modification, are permitted provided that the following conditions 13 1.1 jtc * are met: 14 1.1 jtc * 1. Redistributions of source code must retain the above copyright 15 1.1 jtc * notice, this list of conditions and the following disclaimer. 16 1.1 jtc * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 jtc * notice, this list of conditions and the following disclaimer in the 18 1.1 jtc * documentation and/or other materials provided with the distribution. 19 1.21 agc * 3. Neither the name of the University nor the names of its contributors 20 1.21 agc * may be used to endorse or promote products derived from this software 21 1.21 agc * without specific prior written permission. 22 1.21 agc * 23 1.21 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 1.21 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 1.21 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 1.21 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 1.21 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 1.21 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 1.21 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 1.21 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 1.21 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 1.21 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 1.21 agc * SUCH DAMAGE. 34 1.21 agc */ 35 1.21 agc 36 1.23 lukem #if HAVE_NBTOOL_CONFIG_H 37 1.23 lukem #include "nbtool_config.h" 38 1.23 lukem #endif 39 1.23 lukem 40 1.7 christos #include <sys/cdefs.h> 41 1.23 lukem #if !defined(lint) 42 1.4 cgd #if 0 43 1.4 cgd static char sccsid[] = "@(#)tables.c 8.1 (Berkeley) 5/31/93"; 44 1.4 cgd #else 45 1.31 christos __RCSID("$NetBSD: tables.c,v 1.31 2013/10/18 19:53:34 christos Exp $"); 46 1.4 cgd #endif 47 1.1 jtc #endif /* not lint */ 48 1.1 jtc 49 1.1 jtc #include <sys/types.h> 50 1.1 jtc #include <sys/time.h> 51 1.1 jtc #include <sys/stat.h> 52 1.1 jtc #include <sys/param.h> 53 1.1 jtc #include <stdio.h> 54 1.1 jtc #include <ctype.h> 55 1.8 kleink #include <fcntl.h> 56 1.9 kleink #include <paths.h> 57 1.1 jtc #include <string.h> 58 1.1 jtc #include <unistd.h> 59 1.1 jtc #include <errno.h> 60 1.1 jtc #include <stdlib.h> 61 1.1 jtc #include "pax.h" 62 1.1 jtc #include "tables.h" 63 1.1 jtc #include "extern.h" 64 1.1 jtc 65 1.1 jtc /* 66 1.1 jtc * Routines for controlling the contents of all the different databases pax 67 1.1 jtc * keeps. Tables are dynamically created only when they are needed. The 68 1.1 jtc * goal was speed and the ability to work with HUGE archives. The databases 69 1.1 jtc * were kept simple, but do have complex rules for when the contents change. 70 1.24 christos * As of this writing, the POSIX library functions were more complex than 71 1.1 jtc * needed for this application (pax databases have very short lifetimes and 72 1.1 jtc * do not survive after pax is finished). Pax is required to handle very 73 1.1 jtc * large archives. These database routines carefully combine memory usage and 74 1.1 jtc * temporary file storage in ways which will not significantly impact runtime 75 1.1 jtc * performance while allowing the largest possible archives to be handled. 76 1.24 christos * Trying to force the fit to the POSIX database routines was not considered 77 1.1 jtc * time well spent. 78 1.1 jtc */ 79 1.1 jtc 80 1.1 jtc static HRDLNK **ltab = NULL; /* hard link table for detecting hard links */ 81 1.1 jtc static FTM **ftab = NULL; /* file time table for updating arch */ 82 1.1 jtc static NAMT **ntab = NULL; /* interactive rename storage table */ 83 1.1 jtc static DEVT **dtab = NULL; /* device/inode mapping tables */ 84 1.1 jtc static ATDIR **atab = NULL; /* file tree directory time reset table */ 85 1.13 thorpej #ifdef DIRS_USE_FILE 86 1.1 jtc static int dirfd = -1; /* storage for setting created dir time/mode */ 87 1.1 jtc static u_long dircnt; /* entries in dir time/mode storage */ 88 1.13 thorpej #endif 89 1.1 jtc static int ffd = -1; /* tmp file for file time table name storage */ 90 1.1 jtc 91 1.15 lukem static DEVT *chk_dev(dev_t, int); 92 1.1 jtc 93 1.1 jtc /* 94 1.1 jtc * hard link table routines 95 1.1 jtc * 96 1.12 itohy * The hard link table tries to detect hard links to files using the device and 97 1.1 jtc * inode values. We do this when writing an archive, so we can tell the format 98 1.1 jtc * write routine that this file is a hard link to another file. The format 99 1.1 jtc * write routine then can store this file in whatever way it wants (as a hard 100 1.1 jtc * link if the format supports that like tar, or ignore this info like cpio). 101 1.1 jtc * (Actually a field in the format driver table tells us if the format wants 102 1.1 jtc * hard link info. if not, we do not waste time looking for them). We also use 103 1.1 jtc * the same table when reading an archive. In that situation, this table is 104 1.1 jtc * used by the format read routine to detect hard links from stored dev and 105 1.1 jtc * inode numbers (like cpio). This will allow pax to create a link when one 106 1.1 jtc * can be detected by the archive format. 107 1.1 jtc */ 108 1.1 jtc 109 1.1 jtc /* 110 1.1 jtc * lnk_start 111 1.1 jtc * Creates the hard link table. 112 1.1 jtc * Return: 113 1.1 jtc * 0 if created, -1 if failure 114 1.1 jtc */ 115 1.1 jtc 116 1.1 jtc int 117 1.1 jtc lnk_start(void) 118 1.1 jtc { 119 1.1 jtc if (ltab != NULL) 120 1.25 dsl return 0; 121 1.12 itohy if ((ltab = (HRDLNK **)calloc(L_TAB_SZ, sizeof(HRDLNK *))) == NULL) { 122 1.12 itohy tty_warn(1, "Cannot allocate memory for hard link table"); 123 1.25 dsl return -1; 124 1.12 itohy } 125 1.25 dsl return 0; 126 1.1 jtc } 127 1.1 jtc 128 1.1 jtc /* 129 1.1 jtc * chk_lnk() 130 1.1 jtc * Looks up entry in hard link hash table. If found, it copies the name 131 1.1 jtc * of the file it is linked to (we already saw that file) into ln_name. 132 1.1 jtc * lnkcnt is decremented and if goes to 1 the node is deleted from the 133 1.1 jtc * database. (We have seen all the links to this file). If not found, 134 1.1 jtc * we add the file to the database if it has the potential for having 135 1.1 jtc * hard links to other files we may process (it has a link count > 1) 136 1.1 jtc * Return: 137 1.1 jtc * if found returns 1; if not found returns 0; -1 on error 138 1.1 jtc */ 139 1.1 jtc 140 1.1 jtc int 141 1.5 tls chk_lnk(ARCHD *arcn) 142 1.1 jtc { 143 1.5 tls HRDLNK *pt; 144 1.5 tls HRDLNK **ppt; 145 1.5 tls u_int indx; 146 1.1 jtc 147 1.1 jtc if (ltab == NULL) 148 1.25 dsl return -1; 149 1.1 jtc /* 150 1.1 jtc * ignore those nodes that cannot have hard links 151 1.1 jtc */ 152 1.1 jtc if ((arcn->type == PAX_DIR) || (arcn->sb.st_nlink <= 1)) 153 1.25 dsl return 0; 154 1.1 jtc 155 1.1 jtc /* 156 1.1 jtc * hash inode number and look for this file 157 1.1 jtc */ 158 1.1 jtc indx = ((unsigned)arcn->sb.st_ino) % L_TAB_SZ; 159 1.1 jtc if ((pt = ltab[indx]) != NULL) { 160 1.1 jtc /* 161 1.27 snj * its hash chain is not empty, walk down looking for it 162 1.1 jtc */ 163 1.1 jtc ppt = &(ltab[indx]); 164 1.1 jtc while (pt != NULL) { 165 1.1 jtc if ((pt->ino == arcn->sb.st_ino) && 166 1.1 jtc (pt->dev == arcn->sb.st_dev)) 167 1.1 jtc break; 168 1.1 jtc ppt = &(pt->fow); 169 1.1 jtc pt = pt->fow; 170 1.1 jtc } 171 1.1 jtc 172 1.1 jtc if (pt != NULL) { 173 1.1 jtc /* 174 1.1 jtc * found a link. set the node type and copy in the 175 1.1 jtc * name of the file it is to link to. we need to 176 1.1 jtc * handle hardlinks to regular files differently than 177 1.1 jtc * other links. 178 1.1 jtc */ 179 1.18 christos arcn->ln_nlen = strlcpy(arcn->ln_name, pt->name, 180 1.18 christos sizeof(arcn->ln_name)); 181 1.1 jtc if (arcn->type == PAX_REG) 182 1.1 jtc arcn->type = PAX_HRG; 183 1.1 jtc else 184 1.1 jtc arcn->type = PAX_HLK; 185 1.1 jtc 186 1.1 jtc /* 187 1.1 jtc * if we have found all the links to this file, remove 188 1.1 jtc * it from the database 189 1.1 jtc */ 190 1.1 jtc if (--pt->nlink <= 1) { 191 1.1 jtc *ppt = pt->fow; 192 1.1 jtc (void)free((char *)pt->name); 193 1.1 jtc (void)free((char *)pt); 194 1.1 jtc } 195 1.25 dsl return 1; 196 1.1 jtc } 197 1.1 jtc } 198 1.1 jtc 199 1.1 jtc /* 200 1.1 jtc * we never saw this file before. It has links so we add it to the 201 1.1 jtc * front of this hash chain 202 1.1 jtc */ 203 1.1 jtc if ((pt = (HRDLNK *)malloc(sizeof(HRDLNK))) != NULL) { 204 1.1 jtc if ((pt->name = strdup(arcn->name)) != NULL) { 205 1.1 jtc pt->dev = arcn->sb.st_dev; 206 1.1 jtc pt->ino = arcn->sb.st_ino; 207 1.1 jtc pt->nlink = arcn->sb.st_nlink; 208 1.1 jtc pt->fow = ltab[indx]; 209 1.1 jtc ltab[indx] = pt; 210 1.25 dsl return 0; 211 1.1 jtc } 212 1.1 jtc (void)free((char *)pt); 213 1.1 jtc } 214 1.1 jtc 215 1.7 christos tty_warn(1, "Hard link table out of memory"); 216 1.25 dsl return -1; 217 1.1 jtc } 218 1.1 jtc 219 1.1 jtc /* 220 1.1 jtc * purg_lnk 221 1.1 jtc * remove reference for a file that we may have added to the data base as 222 1.1 jtc * a potential source for hard links. We ended up not using the file, so 223 1.28 christos * we do not want to accidentally point another file at it later on. 224 1.1 jtc */ 225 1.1 jtc 226 1.1 jtc void 227 1.5 tls purg_lnk(ARCHD *arcn) 228 1.1 jtc { 229 1.5 tls HRDLNK *pt; 230 1.5 tls HRDLNK **ppt; 231 1.5 tls u_int indx; 232 1.1 jtc 233 1.1 jtc if (ltab == NULL) 234 1.1 jtc return; 235 1.1 jtc /* 236 1.1 jtc * do not bother to look if it could not be in the database 237 1.1 jtc */ 238 1.1 jtc if ((arcn->sb.st_nlink <= 1) || (arcn->type == PAX_DIR) || 239 1.1 jtc (arcn->type == PAX_HLK) || (arcn->type == PAX_HRG)) 240 1.1 jtc return; 241 1.1 jtc 242 1.1 jtc /* 243 1.1 jtc * find the hash chain for this inode value, if empty return 244 1.1 jtc */ 245 1.1 jtc indx = ((unsigned)arcn->sb.st_ino) % L_TAB_SZ; 246 1.1 jtc if ((pt = ltab[indx]) == NULL) 247 1.1 jtc return; 248 1.1 jtc 249 1.1 jtc /* 250 1.1 jtc * walk down the list looking for the inode/dev pair, unlink and 251 1.1 jtc * free if found 252 1.1 jtc */ 253 1.1 jtc ppt = &(ltab[indx]); 254 1.1 jtc while (pt != NULL) { 255 1.1 jtc if ((pt->ino == arcn->sb.st_ino) && 256 1.1 jtc (pt->dev == arcn->sb.st_dev)) 257 1.1 jtc break; 258 1.1 jtc ppt = &(pt->fow); 259 1.1 jtc pt = pt->fow; 260 1.1 jtc } 261 1.1 jtc if (pt == NULL) 262 1.1 jtc return; 263 1.1 jtc 264 1.1 jtc /* 265 1.1 jtc * remove and free it 266 1.1 jtc */ 267 1.1 jtc *ppt = pt->fow; 268 1.1 jtc (void)free((char *)pt->name); 269 1.1 jtc (void)free((char *)pt); 270 1.1 jtc } 271 1.1 jtc 272 1.1 jtc /* 273 1.1 jtc * lnk_end() 274 1.1 jtc * pull apart a existing link table so we can reuse it. We do this between 275 1.1 jtc * read and write phases of append with update. (The format may have 276 1.1 jtc * used the link table, and we need to start with a fresh table for the 277 1.1 jtc * write phase 278 1.1 jtc */ 279 1.1 jtc 280 1.1 jtc void 281 1.1 jtc lnk_end(void) 282 1.1 jtc { 283 1.5 tls int i; 284 1.5 tls HRDLNK *pt; 285 1.5 tls HRDLNK *ppt; 286 1.1 jtc 287 1.1 jtc if (ltab == NULL) 288 1.1 jtc return; 289 1.1 jtc 290 1.1 jtc for (i = 0; i < L_TAB_SZ; ++i) { 291 1.1 jtc if (ltab[i] == NULL) 292 1.1 jtc continue; 293 1.1 jtc pt = ltab[i]; 294 1.1 jtc ltab[i] = NULL; 295 1.1 jtc 296 1.1 jtc /* 297 1.1 jtc * free up each entry on this chain 298 1.1 jtc */ 299 1.1 jtc while (pt != NULL) { 300 1.1 jtc ppt = pt; 301 1.1 jtc pt = ppt->fow; 302 1.1 jtc (void)free((char *)ppt->name); 303 1.1 jtc (void)free((char *)ppt); 304 1.1 jtc } 305 1.1 jtc } 306 1.1 jtc return; 307 1.1 jtc } 308 1.1 jtc 309 1.1 jtc /* 310 1.1 jtc * modification time table routines 311 1.1 jtc * 312 1.1 jtc * The modification time table keeps track of last modification times for all 313 1.1 jtc * files stored in an archive during a write phase when -u is set. We only 314 1.1 jtc * add a file to the archive if it is newer than a file with the same name 315 1.1 jtc * already stored on the archive (if there is no other file with the same 316 1.1 jtc * name on the archive it is added). This applies to writes and appends. 317 1.1 jtc * An append with an -u must read the archive and store the modification time 318 1.1 jtc * for every file on that archive before starting the write phase. It is clear 319 1.1 jtc * that this is one HUGE database. To save memory space, the actual file names 320 1.20 wiz * are stored in a scratch file and indexed by an in-memory hash table. The 321 1.1 jtc * hash table is indexed by hashing the file path. The nodes in the table store 322 1.12 itohy * the length of the filename and the lseek offset within the scratch file 323 1.20 wiz * where the actual name is stored. Since there are never any deletions from this 324 1.1 jtc * table, fragmentation of the scratch file is never a issue. Lookups seem to 325 1.12 itohy * not exhibit any locality at all (files in the database are rarely 326 1.20 wiz * looked up more than once...), so caching is just a waste of memory. The 327 1.20 wiz * only limitation is the amount of scratch file space available to store the 328 1.1 jtc * path names. 329 1.1 jtc */ 330 1.1 jtc 331 1.1 jtc /* 332 1.1 jtc * ftime_start() 333 1.1 jtc * create the file time hash table and open for read/write the scratch 334 1.1 jtc * file. (after created it is unlinked, so when we exit we leave 335 1.1 jtc * no witnesses). 336 1.1 jtc * Return: 337 1.1 jtc * 0 if the table and file was created ok, -1 otherwise 338 1.1 jtc */ 339 1.1 jtc 340 1.1 jtc int 341 1.1 jtc ftime_start(void) 342 1.1 jtc { 343 1.1 jtc if (ftab != NULL) 344 1.25 dsl return 0; 345 1.12 itohy if ((ftab = (FTM **)calloc(F_TAB_SZ, sizeof(FTM *))) == NULL) { 346 1.12 itohy tty_warn(1, "Cannot allocate memory for file time table"); 347 1.25 dsl return -1; 348 1.12 itohy } 349 1.1 jtc 350 1.1 jtc /* 351 1.1 jtc * get random name and create temporary scratch file, unlink name 352 1.1 jtc * so it will get removed on exit 353 1.1 jtc */ 354 1.18 christos memcpy(tempbase, _TFILE_BASE, sizeof(_TFILE_BASE)); 355 1.18 christos if ((ffd = mkstemp(tempfile)) == -1) { 356 1.9 kleink syswarn(1, errno, "Unable to create temporary file: %s", 357 1.18 christos tempfile); 358 1.25 dsl return -1; 359 1.1 jtc } 360 1.1 jtc 361 1.18 christos (void)unlink(tempfile); 362 1.25 dsl return 0; 363 1.1 jtc } 364 1.1 jtc 365 1.1 jtc /* 366 1.1 jtc * chk_ftime() 367 1.1 jtc * looks up entry in file time hash table. If not found, the file is 368 1.1 jtc * added to the hash table and the file named stored in the scratch file. 369 1.1 jtc * If a file with the same name is found, the file times are compared and 370 1.1 jtc * the most recent file time is retained. If the new file was younger (or 371 1.1 jtc * was not in the database) the new file is selected for storage. 372 1.1 jtc * Return: 373 1.1 jtc * 0 if file should be added to the archive, 1 if it should be skipped, 374 1.1 jtc * -1 on error 375 1.1 jtc */ 376 1.1 jtc 377 1.1 jtc int 378 1.5 tls chk_ftime(ARCHD *arcn) 379 1.1 jtc { 380 1.5 tls FTM *pt; 381 1.5 tls int namelen; 382 1.5 tls u_int indx; 383 1.1 jtc char ckname[PAXPATHLEN+1]; 384 1.1 jtc 385 1.1 jtc /* 386 1.1 jtc * no info, go ahead and add to archive 387 1.1 jtc */ 388 1.1 jtc if (ftab == NULL) 389 1.25 dsl return 0; 390 1.1 jtc 391 1.1 jtc /* 392 1.1 jtc * hash the pathname and look up in table 393 1.1 jtc */ 394 1.1 jtc namelen = arcn->nlen; 395 1.1 jtc indx = st_hash(arcn->name, namelen, F_TAB_SZ); 396 1.1 jtc if ((pt = ftab[indx]) != NULL) { 397 1.1 jtc /* 398 1.1 jtc * the hash chain is not empty, walk down looking for match 399 1.1 jtc * only read up the path names if the lengths match, speeds 400 1.1 jtc * up the search a lot 401 1.1 jtc */ 402 1.1 jtc while (pt != NULL) { 403 1.1 jtc if (pt->namelen == namelen) { 404 1.1 jtc /* 405 1.1 jtc * potential match, have to read the name 406 1.1 jtc * from the scratch file. 407 1.1 jtc */ 408 1.1 jtc if (lseek(ffd,pt->seek,SEEK_SET) != pt->seek) { 409 1.1 jtc syswarn(1, errno, 410 1.1 jtc "Failed ftime table seek"); 411 1.25 dsl return -1; 412 1.1 jtc } 413 1.11 itohy if (xread(ffd, ckname, namelen) != namelen) { 414 1.1 jtc syswarn(1, errno, 415 1.1 jtc "Failed ftime table read"); 416 1.25 dsl return -1; 417 1.1 jtc } 418 1.1 jtc 419 1.1 jtc /* 420 1.1 jtc * if the names match, we are done 421 1.1 jtc */ 422 1.1 jtc if (!strncmp(ckname, arcn->name, namelen)) 423 1.1 jtc break; 424 1.1 jtc } 425 1.1 jtc 426 1.1 jtc /* 427 1.1 jtc * try the next entry on the chain 428 1.1 jtc */ 429 1.1 jtc pt = pt->fow; 430 1.1 jtc } 431 1.1 jtc 432 1.1 jtc if (pt != NULL) { 433 1.1 jtc /* 434 1.1 jtc * found the file, compare the times, save the newer 435 1.1 jtc */ 436 1.1 jtc if (arcn->sb.st_mtime > pt->mtime) { 437 1.1 jtc /* 438 1.1 jtc * file is newer 439 1.1 jtc */ 440 1.1 jtc pt->mtime = arcn->sb.st_mtime; 441 1.25 dsl return 0; 442 1.12 itohy } 443 1.1 jtc /* 444 1.1 jtc * file is older 445 1.1 jtc */ 446 1.25 dsl return 1; 447 1.1 jtc } 448 1.1 jtc } 449 1.1 jtc 450 1.1 jtc /* 451 1.1 jtc * not in table, add it 452 1.1 jtc */ 453 1.1 jtc if ((pt = (FTM *)malloc(sizeof(FTM))) != NULL) { 454 1.1 jtc /* 455 1.1 jtc * add the name at the end of the scratch file, saving the 456 1.1 jtc * offset. add the file to the head of the hash chain 457 1.1 jtc */ 458 1.1 jtc if ((pt->seek = lseek(ffd, (off_t)0, SEEK_END)) >= 0) { 459 1.11 itohy if (xwrite(ffd, arcn->name, namelen) == namelen) { 460 1.1 jtc pt->mtime = arcn->sb.st_mtime; 461 1.1 jtc pt->namelen = namelen; 462 1.1 jtc pt->fow = ftab[indx]; 463 1.1 jtc ftab[indx] = pt; 464 1.25 dsl return 0; 465 1.1 jtc } 466 1.1 jtc syswarn(1, errno, "Failed write to file time table"); 467 1.12 itohy } else 468 1.1 jtc syswarn(1, errno, "Failed seek on file time table"); 469 1.1 jtc } else 470 1.7 christos tty_warn(1, "File time table ran out of memory"); 471 1.1 jtc 472 1.1 jtc if (pt != NULL) 473 1.1 jtc (void)free((char *)pt); 474 1.25 dsl return -1; 475 1.1 jtc } 476 1.1 jtc 477 1.1 jtc /* 478 1.1 jtc * Interactive rename table routines 479 1.1 jtc * 480 1.1 jtc * The interactive rename table keeps track of the new names that the user 481 1.12 itohy * assigns to files from tty input. Since this map is unique for each file 482 1.1 jtc * we must store it in case there is a reference to the file later in archive 483 1.1 jtc * (a link). Otherwise we will be unable to find the file we know was 484 1.1 jtc * extracted. The remapping of these files is stored in a memory based hash 485 1.1 jtc * table (it is assumed since input must come from /dev/tty, it is unlikely to 486 1.1 jtc * be a very large table). 487 1.1 jtc */ 488 1.1 jtc 489 1.1 jtc /* 490 1.1 jtc * name_start() 491 1.1 jtc * create the interactive rename table 492 1.1 jtc * Return: 493 1.1 jtc * 0 if successful, -1 otherwise 494 1.1 jtc */ 495 1.1 jtc 496 1.1 jtc int 497 1.1 jtc name_start(void) 498 1.1 jtc { 499 1.1 jtc if (ntab != NULL) 500 1.25 dsl return 0; 501 1.12 itohy if ((ntab = (NAMT **)calloc(N_TAB_SZ, sizeof(NAMT *))) == NULL) { 502 1.12 itohy tty_warn(1, 503 1.7 christos "Cannot allocate memory for interactive rename table"); 504 1.25 dsl return -1; 505 1.12 itohy } 506 1.25 dsl return 0; 507 1.1 jtc } 508 1.1 jtc 509 1.1 jtc /* 510 1.1 jtc * add_name() 511 1.1 jtc * add the new name to old name mapping just created by the user. 512 1.1 jtc * If an old name mapping is found (there may be duplicate names on an 513 1.1 jtc * archive) only the most recent is kept. 514 1.1 jtc * Return: 515 1.1 jtc * 0 if added, -1 otherwise 516 1.1 jtc */ 517 1.1 jtc 518 1.1 jtc int 519 1.5 tls add_name(char *oname, int onamelen, char *nname) 520 1.1 jtc { 521 1.5 tls NAMT *pt; 522 1.5 tls u_int indx; 523 1.1 jtc 524 1.1 jtc if (ntab == NULL) { 525 1.1 jtc /* 526 1.1 jtc * should never happen 527 1.1 jtc */ 528 1.7 christos tty_warn(0, "No interactive rename table, links may fail\n"); 529 1.25 dsl return 0; 530 1.1 jtc } 531 1.1 jtc 532 1.1 jtc /* 533 1.1 jtc * look to see if we have already mapped this file, if so we 534 1.1 jtc * will update it 535 1.1 jtc */ 536 1.1 jtc indx = st_hash(oname, onamelen, N_TAB_SZ); 537 1.1 jtc if ((pt = ntab[indx]) != NULL) { 538 1.1 jtc /* 539 1.1 jtc * look down the has chain for the file 540 1.1 jtc */ 541 1.1 jtc while ((pt != NULL) && (strcmp(oname, pt->oname) != 0)) 542 1.1 jtc pt = pt->fow; 543 1.1 jtc 544 1.1 jtc if (pt != NULL) { 545 1.1 jtc /* 546 1.1 jtc * found an old mapping, replace it with the new one 547 1.1 jtc * the user just input (if it is different) 548 1.1 jtc */ 549 1.1 jtc if (strcmp(nname, pt->nname) == 0) 550 1.25 dsl return 0; 551 1.1 jtc 552 1.1 jtc (void)free((char *)pt->nname); 553 1.1 jtc if ((pt->nname = strdup(nname)) == NULL) { 554 1.7 christos tty_warn(1, "Cannot update rename table"); 555 1.25 dsl return -1; 556 1.1 jtc } 557 1.25 dsl return 0; 558 1.1 jtc } 559 1.1 jtc } 560 1.1 jtc 561 1.1 jtc /* 562 1.1 jtc * this is a new mapping, add it to the table 563 1.1 jtc */ 564 1.1 jtc if ((pt = (NAMT *)malloc(sizeof(NAMT))) != NULL) { 565 1.1 jtc if ((pt->oname = strdup(oname)) != NULL) { 566 1.1 jtc if ((pt->nname = strdup(nname)) != NULL) { 567 1.1 jtc pt->fow = ntab[indx]; 568 1.1 jtc ntab[indx] = pt; 569 1.25 dsl return 0; 570 1.1 jtc } 571 1.1 jtc (void)free((char *)pt->oname); 572 1.1 jtc } 573 1.1 jtc (void)free((char *)pt); 574 1.1 jtc } 575 1.7 christos tty_warn(1, "Interactive rename table out of memory"); 576 1.25 dsl return -1; 577 1.1 jtc } 578 1.1 jtc 579 1.1 jtc /* 580 1.1 jtc * sub_name() 581 1.1 jtc * look up a link name to see if it points at a file that has been 582 1.1 jtc * remapped by the user. If found, the link is adjusted to contain the 583 1.1 jtc * new name (oname is the link to name) 584 1.1 jtc */ 585 1.1 jtc 586 1.1 jtc void 587 1.18 christos sub_name(char *oname, int *onamelen, size_t onamesize) 588 1.1 jtc { 589 1.5 tls NAMT *pt; 590 1.5 tls u_int indx; 591 1.1 jtc 592 1.1 jtc if (ntab == NULL) 593 1.1 jtc return; 594 1.1 jtc /* 595 1.1 jtc * look the name up in the hash table 596 1.1 jtc */ 597 1.1 jtc indx = st_hash(oname, *onamelen, N_TAB_SZ); 598 1.1 jtc if ((pt = ntab[indx]) == NULL) 599 1.1 jtc return; 600 1.1 jtc 601 1.1 jtc while (pt != NULL) { 602 1.1 jtc /* 603 1.14 lukem * walk down the hash chain looking for a match 604 1.1 jtc */ 605 1.1 jtc if (strcmp(oname, pt->oname) == 0) { 606 1.1 jtc /* 607 1.1 jtc * found it, replace it with the new name 608 1.1 jtc * and return (we know that oname has enough space) 609 1.1 jtc */ 610 1.18 christos *onamelen = strlcpy(oname, pt->nname, onamesize); 611 1.1 jtc return; 612 1.1 jtc } 613 1.1 jtc pt = pt->fow; 614 1.1 jtc } 615 1.1 jtc 616 1.1 jtc /* 617 1.1 jtc * no match, just return 618 1.1 jtc */ 619 1.1 jtc return; 620 1.1 jtc } 621 1.12 itohy 622 1.1 jtc /* 623 1.1 jtc * device/inode mapping table routines 624 1.1 jtc * (used with formats that store device and inodes fields) 625 1.1 jtc * 626 1.29 msaitoh * device/inode mapping tables remap the device field in an archive header. The 627 1.1 jtc * device/inode fields are used to determine when files are hard links to each 628 1.1 jtc * other. However these values have very little meaning outside of that. This 629 1.1 jtc * database is used to solve one of two different problems. 630 1.1 jtc * 631 1.1 jtc * 1) when files are appended to an archive, while the new files may have hard 632 1.1 jtc * links to each other, you cannot determine if they have hard links to any 633 1.1 jtc * file already stored on the archive from a prior run of pax. We must assume 634 1.1 jtc * that these inode/device pairs are unique only within a SINGLE run of pax 635 1.1 jtc * (which adds a set of files to an archive). So we have to make sure the 636 1.1 jtc * inode/dev pairs we add each time are always unique. We do this by observing 637 1.1 jtc * while the inode field is very dense, the use of the dev field is fairly 638 1.1 jtc * sparse. Within each run of pax, we remap any device number of a new archive 639 1.1 jtc * member that has a device number used in a prior run and already stored in a 640 1.1 jtc * file on the archive. During the read phase of the append, we store the 641 1.1 jtc * device numbers used and mark them to not be used by any file during the 642 1.1 jtc * write phase. If during write we go to use one of those old device numbers, 643 1.1 jtc * we remap it to a new value. 644 1.1 jtc * 645 1.1 jtc * 2) Often the fields in the archive header used to store these values are 646 1.1 jtc * too small to store the entire value. The result is an inode or device value 647 1.1 jtc * which can be truncated. This really can foul up an archive. With truncation 648 1.1 jtc * we end up creating links between files that are really not links (after 649 1.1 jtc * truncation the inodes are the same value). We address that by detecting 650 1.1 jtc * truncation and forcing a remap of the device field to split truncated 651 1.1 jtc * inodes away from each other. Each truncation creates a pattern of bits that 652 1.1 jtc * are removed. We use this pattern of truncated bits to partition the inodes 653 1.1 jtc * on a single device to many different devices (each one represented by the 654 1.1 jtc * truncated bit pattern). All inodes on the same device that have the same 655 1.1 jtc * truncation pattern are mapped to the same new device. Two inodes that 656 1.1 jtc * truncate to the same value clearly will always have different truncation 657 1.1 jtc * bit patterns, so they will be split from away each other. When we spot 658 1.1 jtc * device truncation we remap the device number to a non truncated value. 659 1.1 jtc * (for more info see table.h for the data structures involved). 660 1.1 jtc */ 661 1.1 jtc 662 1.1 jtc /* 663 1.1 jtc * dev_start() 664 1.1 jtc * create the device mapping table 665 1.1 jtc * Return: 666 1.1 jtc * 0 if successful, -1 otherwise 667 1.1 jtc */ 668 1.1 jtc 669 1.1 jtc int 670 1.1 jtc dev_start(void) 671 1.1 jtc { 672 1.1 jtc if (dtab != NULL) 673 1.25 dsl return 0; 674 1.12 itohy if ((dtab = (DEVT **)calloc(D_TAB_SZ, sizeof(DEVT *))) == NULL) { 675 1.12 itohy tty_warn(1, "Cannot allocate memory for device mapping table"); 676 1.25 dsl return -1; 677 1.12 itohy } 678 1.25 dsl return 0; 679 1.1 jtc } 680 1.1 jtc 681 1.1 jtc /* 682 1.1 jtc * add_dev() 683 1.1 jtc * add a device number to the table. this will force the device to be 684 1.1 jtc * remapped to a new value if it be used during a write phase. This 685 1.1 jtc * function is called during the read phase of an append to prohibit the 686 1.1 jtc * use of any device number already in the archive. 687 1.1 jtc * Return: 688 1.1 jtc * 0 if added ok, -1 otherwise 689 1.1 jtc */ 690 1.1 jtc 691 1.1 jtc int 692 1.5 tls add_dev(ARCHD *arcn) 693 1.1 jtc { 694 1.1 jtc if (chk_dev(arcn->sb.st_dev, 1) == NULL) 695 1.25 dsl return -1; 696 1.25 dsl return 0; 697 1.1 jtc } 698 1.1 jtc 699 1.1 jtc /* 700 1.1 jtc * chk_dev() 701 1.1 jtc * check for a device value in the device table. If not found and the add 702 1.1 jtc * flag is set, it is added. This does NOT assign any mapping values, just 703 1.1 jtc * adds the device number as one that need to be remapped. If this device 704 1.12 itohy * is already mapped, just return with a pointer to that entry. 705 1.1 jtc * Return: 706 1.1 jtc * pointer to the entry for this device in the device map table. Null 707 1.1 jtc * if the add flag is not set and the device is not in the table (it is 708 1.1 jtc * not been seen yet). If add is set and the device cannot be added, null 709 1.1 jtc * is returned (indicates an error). 710 1.1 jtc */ 711 1.1 jtc 712 1.1 jtc static DEVT * 713 1.1 jtc chk_dev(dev_t dev, int add) 714 1.1 jtc { 715 1.5 tls DEVT *pt; 716 1.5 tls u_int indx; 717 1.1 jtc 718 1.1 jtc if (dtab == NULL) 719 1.25 dsl return NULL; 720 1.1 jtc /* 721 1.1 jtc * look to see if this device is already in the table 722 1.1 jtc */ 723 1.1 jtc indx = ((unsigned)dev) % D_TAB_SZ; 724 1.1 jtc if ((pt = dtab[indx]) != NULL) { 725 1.1 jtc while ((pt != NULL) && (pt->dev != dev)) 726 1.1 jtc pt = pt->fow; 727 1.1 jtc 728 1.1 jtc /* 729 1.1 jtc * found it, return a pointer to it 730 1.1 jtc */ 731 1.1 jtc if (pt != NULL) 732 1.25 dsl return pt; 733 1.1 jtc } 734 1.1 jtc 735 1.1 jtc /* 736 1.1 jtc * not in table, we add it only if told to as this may just be a check 737 1.1 jtc * to see if a device number is being used. 738 1.1 jtc */ 739 1.1 jtc if (add == 0) 740 1.25 dsl return NULL; 741 1.1 jtc 742 1.1 jtc /* 743 1.1 jtc * allocate a node for this device and add it to the front of the hash 744 1.1 jtc * chain. Note we do not assign remaps values here, so the pt->list 745 1.1 jtc * list must be NULL. 746 1.1 jtc */ 747 1.1 jtc if ((pt = (DEVT *)malloc(sizeof(DEVT))) == NULL) { 748 1.7 christos tty_warn(1, "Device map table out of memory"); 749 1.25 dsl return NULL; 750 1.1 jtc } 751 1.1 jtc pt->dev = dev; 752 1.1 jtc pt->list = NULL; 753 1.1 jtc pt->fow = dtab[indx]; 754 1.1 jtc dtab[indx] = pt; 755 1.25 dsl return pt; 756 1.1 jtc } 757 1.1 jtc /* 758 1.1 jtc * map_dev() 759 1.1 jtc * given an inode and device storage mask (the mask has a 1 for each bit 760 1.1 jtc * the archive format is able to store in a header), we check for inode 761 1.1 jtc * and device truncation and remap the device as required. Device mapping 762 1.1 jtc * can also occur when during the read phase of append a device number was 763 1.1 jtc * seen (and was marked as do not use during the write phase). WE ASSUME 764 1.1 jtc * that unsigned longs are the same size or bigger than the fields used 765 1.1 jtc * for ino_t and dev_t. If not the types will have to be changed. 766 1.1 jtc * Return: 767 1.1 jtc * 0 if all ok, -1 otherwise. 768 1.1 jtc */ 769 1.1 jtc 770 1.1 jtc int 771 1.5 tls map_dev(ARCHD *arcn, u_long dev_mask, u_long ino_mask) 772 1.1 jtc { 773 1.5 tls DEVT *pt; 774 1.5 tls DLIST *dpt; 775 1.1 jtc static dev_t lastdev = 0; /* next device number to try */ 776 1.1 jtc int trc_ino = 0; 777 1.1 jtc int trc_dev = 0; 778 1.1 jtc ino_t trunc_bits = 0; 779 1.1 jtc ino_t nino; 780 1.1 jtc 781 1.1 jtc if (dtab == NULL) 782 1.25 dsl return 0; 783 1.1 jtc /* 784 1.1 jtc * check for device and inode truncation, and extract the truncated 785 1.12 itohy * bit pattern. 786 1.1 jtc */ 787 1.1 jtc if ((arcn->sb.st_dev & (dev_t)dev_mask) != arcn->sb.st_dev) 788 1.1 jtc ++trc_dev; 789 1.1 jtc if ((nino = arcn->sb.st_ino & (ino_t)ino_mask) != arcn->sb.st_ino) { 790 1.1 jtc ++trc_ino; 791 1.1 jtc trunc_bits = arcn->sb.st_ino & (ino_t)(~ino_mask); 792 1.1 jtc } 793 1.1 jtc 794 1.1 jtc /* 795 1.1 jtc * see if this device is already being mapped, look up the device 796 1.1 jtc * then find the truncation bit pattern which applies 797 1.1 jtc */ 798 1.1 jtc if ((pt = chk_dev(arcn->sb.st_dev, 0)) != NULL) { 799 1.1 jtc /* 800 1.1 jtc * this device is already marked to be remapped 801 1.1 jtc */ 802 1.1 jtc for (dpt = pt->list; dpt != NULL; dpt = dpt->fow) 803 1.1 jtc if (dpt->trunc_bits == trunc_bits) 804 1.1 jtc break; 805 1.1 jtc 806 1.1 jtc if (dpt != NULL) { 807 1.1 jtc /* 808 1.1 jtc * we are being remapped for this device and pattern 809 1.1 jtc * change the device number to be stored and return 810 1.1 jtc */ 811 1.1 jtc arcn->sb.st_dev = dpt->dev; 812 1.1 jtc arcn->sb.st_ino = nino; 813 1.25 dsl return 0; 814 1.1 jtc } 815 1.1 jtc } else { 816 1.1 jtc /* 817 1.1 jtc * this device is not being remapped YET. if we do not have any 818 1.1 jtc * form of truncation, we do not need a remap 819 1.1 jtc */ 820 1.1 jtc if (!trc_ino && !trc_dev) 821 1.25 dsl return 0; 822 1.1 jtc 823 1.1 jtc /* 824 1.1 jtc * we have truncation, have to add this as a device to remap 825 1.1 jtc */ 826 1.1 jtc if ((pt = chk_dev(arcn->sb.st_dev, 1)) == NULL) 827 1.1 jtc goto bad; 828 1.1 jtc 829 1.1 jtc /* 830 1.1 jtc * if we just have a truncated inode, we have to make sure that 831 1.1 jtc * all future inodes that do not truncate (they have the 832 1.1 jtc * truncation pattern of all 0's) continue to map to the same 833 1.1 jtc * device number. We probably have already written inodes with 834 1.1 jtc * this device number to the archive with the truncation 835 1.1 jtc * pattern of all 0's. So we add the mapping for all 0's to the 836 1.1 jtc * same device number. 837 1.1 jtc */ 838 1.1 jtc if (!trc_dev && (trunc_bits != 0)) { 839 1.1 jtc if ((dpt = (DLIST *)malloc(sizeof(DLIST))) == NULL) 840 1.1 jtc goto bad; 841 1.1 jtc dpt->trunc_bits = 0; 842 1.1 jtc dpt->dev = arcn->sb.st_dev; 843 1.1 jtc dpt->fow = pt->list; 844 1.1 jtc pt->list = dpt; 845 1.1 jtc } 846 1.1 jtc } 847 1.1 jtc 848 1.1 jtc /* 849 1.1 jtc * look for a device number not being used. We must watch for wrap 850 1.1 jtc * around on lastdev (so we do not get stuck looking forever!) 851 1.1 jtc */ 852 1.1 jtc while (++lastdev > 0) { 853 1.1 jtc if (chk_dev(lastdev, 0) != NULL) 854 1.1 jtc continue; 855 1.1 jtc /* 856 1.1 jtc * found an unused value. If we have reached truncation point 857 1.1 jtc * for this format we are hosed, so we give up. Otherwise we 858 1.1 jtc * mark it as being used. 859 1.1 jtc */ 860 1.1 jtc if (((lastdev & ((dev_t)dev_mask)) != lastdev) || 861 1.1 jtc (chk_dev(lastdev, 1) == NULL)) 862 1.1 jtc goto bad; 863 1.1 jtc break; 864 1.1 jtc } 865 1.1 jtc 866 1.1 jtc if ((lastdev <= 0) || ((dpt = (DLIST *)malloc(sizeof(DLIST))) == NULL)) 867 1.1 jtc goto bad; 868 1.1 jtc 869 1.1 jtc /* 870 1.1 jtc * got a new device number, store it under this truncation pattern. 871 1.1 jtc * change the device number this file is being stored with. 872 1.1 jtc */ 873 1.1 jtc dpt->trunc_bits = trunc_bits; 874 1.1 jtc dpt->dev = lastdev; 875 1.1 jtc dpt->fow = pt->list; 876 1.1 jtc pt->list = dpt; 877 1.1 jtc arcn->sb.st_dev = lastdev; 878 1.1 jtc arcn->sb.st_ino = nino; 879 1.25 dsl return 0; 880 1.1 jtc 881 1.1 jtc bad: 882 1.7 christos tty_warn(1, 883 1.7 christos "Unable to fix truncated inode/device field when storing %s", 884 1.1 jtc arcn->name); 885 1.7 christos tty_warn(0, "Archive may create improper hard links when extracted"); 886 1.25 dsl return 0; 887 1.1 jtc } 888 1.1 jtc 889 1.1 jtc /* 890 1.1 jtc * directory access/mod time reset table routines (for directories READ by pax) 891 1.1 jtc * 892 1.1 jtc * The pax -t flag requires that access times of archive files to be the same 893 1.20 wiz * as before being read by pax. For regular files, access time is restored after 894 1.1 jtc * the file has been copied. This database provides the same functionality for 895 1.1 jtc * directories read during file tree traversal. Restoring directory access time 896 1.1 jtc * is more complex than files since directories may be read several times until 897 1.1 jtc * all the descendants in their subtree are visited by fts. Directory access 898 1.1 jtc * and modification times are stored during the fts pre-order visit (done 899 1.1 jtc * before any descendants in the subtree is visited) and restored after the 900 1.1 jtc * fts post-order visit (after all the descendants have been visited). In the 901 1.1 jtc * case of premature exit from a subtree (like from the effects of -n), any 902 1.1 jtc * directory entries left in this database are reset during final cleanup 903 1.1 jtc * operations of pax. Entries are hashed by inode number for fast lookup. 904 1.1 jtc */ 905 1.1 jtc 906 1.1 jtc /* 907 1.1 jtc * atdir_start() 908 1.1 jtc * create the directory access time database for directories READ by pax. 909 1.1 jtc * Return: 910 1.1 jtc * 0 is created ok, -1 otherwise. 911 1.1 jtc */ 912 1.1 jtc 913 1.1 jtc int 914 1.1 jtc atdir_start(void) 915 1.1 jtc { 916 1.1 jtc if (atab != NULL) 917 1.25 dsl return 0; 918 1.12 itohy if ((atab = (ATDIR **)calloc(A_TAB_SZ, sizeof(ATDIR *))) == NULL) { 919 1.12 itohy tty_warn(1, 920 1.7 christos "Cannot allocate space for directory access time table"); 921 1.25 dsl return -1; 922 1.12 itohy } 923 1.25 dsl return 0; 924 1.1 jtc } 925 1.1 jtc 926 1.1 jtc 927 1.1 jtc /* 928 1.1 jtc * atdir_end() 929 1.1 jtc * walk through the directory access time table and reset the access time 930 1.1 jtc * of any directory who still has an entry left in the database. These 931 1.1 jtc * entries are for directories READ by pax 932 1.1 jtc */ 933 1.1 jtc 934 1.1 jtc void 935 1.1 jtc atdir_end(void) 936 1.1 jtc { 937 1.5 tls ATDIR *pt; 938 1.5 tls int i; 939 1.1 jtc 940 1.1 jtc if (atab == NULL) 941 1.1 jtc return; 942 1.1 jtc /* 943 1.1 jtc * for each non-empty hash table entry reset all the directories 944 1.1 jtc * chained there. 945 1.1 jtc */ 946 1.1 jtc for (i = 0; i < A_TAB_SZ; ++i) { 947 1.1 jtc if ((pt = atab[i]) == NULL) 948 1.1 jtc continue; 949 1.1 jtc /* 950 1.1 jtc * remember to force the times, set_ftime() looks at pmtime 951 1.1 jtc * and patime, which only applies to things CREATED by pax, 952 1.1 jtc * not read by pax. Read time reset is controlled by -t. 953 1.1 jtc */ 954 1.1 jtc for (; pt != NULL; pt = pt->fow) 955 1.30 tls set_ftime(pt->name, pt->mtime, pt->atime, 1, 0); 956 1.1 jtc } 957 1.1 jtc } 958 1.1 jtc 959 1.1 jtc /* 960 1.1 jtc * add_atdir() 961 1.1 jtc * add a directory to the directory access time table. Table is hashed 962 1.1 jtc * and chained by inode number. This is for directories READ by pax 963 1.1 jtc */ 964 1.1 jtc 965 1.1 jtc void 966 1.1 jtc add_atdir(char *fname, dev_t dev, ino_t ino, time_t mtime, time_t atime) 967 1.1 jtc { 968 1.5 tls ATDIR *pt; 969 1.5 tls u_int indx; 970 1.1 jtc 971 1.1 jtc if (atab == NULL) 972 1.1 jtc return; 973 1.1 jtc 974 1.1 jtc /* 975 1.12 itohy * make sure this directory is not already in the table, if so just 976 1.1 jtc * return (the older entry always has the correct time). The only 977 1.1 jtc * way this will happen is when the same subtree can be traversed by 978 1.1 jtc * different args to pax and the -n option is aborting fts out of a 979 1.20 wiz * subtree before all the post-order visits have been made. 980 1.1 jtc */ 981 1.1 jtc indx = ((unsigned)ino) % A_TAB_SZ; 982 1.1 jtc if ((pt = atab[indx]) != NULL) { 983 1.1 jtc while (pt != NULL) { 984 1.1 jtc if ((pt->ino == ino) && (pt->dev == dev)) 985 1.1 jtc break; 986 1.1 jtc pt = pt->fow; 987 1.1 jtc } 988 1.1 jtc 989 1.1 jtc /* 990 1.1 jtc * oops, already there. Leave it alone. 991 1.1 jtc */ 992 1.1 jtc if (pt != NULL) 993 1.1 jtc return; 994 1.1 jtc } 995 1.1 jtc 996 1.1 jtc /* 997 1.1 jtc * add it to the front of the hash chain 998 1.1 jtc */ 999 1.1 jtc if ((pt = (ATDIR *)malloc(sizeof(ATDIR))) != NULL) { 1000 1.1 jtc if ((pt->name = strdup(fname)) != NULL) { 1001 1.1 jtc pt->dev = dev; 1002 1.1 jtc pt->ino = ino; 1003 1.1 jtc pt->mtime = mtime; 1004 1.1 jtc pt->atime = atime; 1005 1.1 jtc pt->fow = atab[indx]; 1006 1.1 jtc atab[indx] = pt; 1007 1.1 jtc return; 1008 1.1 jtc } 1009 1.1 jtc (void)free((char *)pt); 1010 1.1 jtc } 1011 1.1 jtc 1012 1.7 christos tty_warn(1, "Directory access time reset table ran out of memory"); 1013 1.1 jtc return; 1014 1.1 jtc } 1015 1.1 jtc 1016 1.1 jtc /* 1017 1.1 jtc * get_atdir() 1018 1.1 jtc * look up a directory by inode and device number to obtain the access 1019 1.1 jtc * and modification time you want to set to. If found, the modification 1020 1.1 jtc * and access time parameters are set and the entry is removed from the 1021 1.1 jtc * table (as it is no longer needed). These are for directories READ by 1022 1.1 jtc * pax 1023 1.1 jtc * Return: 1024 1.1 jtc * 0 if found, -1 if not found. 1025 1.1 jtc */ 1026 1.1 jtc 1027 1.1 jtc int 1028 1.1 jtc get_atdir(dev_t dev, ino_t ino, time_t *mtime, time_t *atime) 1029 1.1 jtc { 1030 1.5 tls ATDIR *pt; 1031 1.5 tls ATDIR **ppt; 1032 1.5 tls u_int indx; 1033 1.1 jtc 1034 1.1 jtc if (atab == NULL) 1035 1.25 dsl return -1; 1036 1.1 jtc /* 1037 1.1 jtc * hash by inode and search the chain for an inode and device match 1038 1.1 jtc */ 1039 1.1 jtc indx = ((unsigned)ino) % A_TAB_SZ; 1040 1.1 jtc if ((pt = atab[indx]) == NULL) 1041 1.25 dsl return -1; 1042 1.1 jtc 1043 1.1 jtc ppt = &(atab[indx]); 1044 1.1 jtc while (pt != NULL) { 1045 1.1 jtc if ((pt->ino == ino) && (pt->dev == dev)) 1046 1.1 jtc break; 1047 1.1 jtc /* 1048 1.1 jtc * no match, go to next one 1049 1.1 jtc */ 1050 1.1 jtc ppt = &(pt->fow); 1051 1.1 jtc pt = pt->fow; 1052 1.1 jtc } 1053 1.1 jtc 1054 1.1 jtc /* 1055 1.1 jtc * return if we did not find it. 1056 1.1 jtc */ 1057 1.1 jtc if (pt == NULL) 1058 1.25 dsl return -1; 1059 1.1 jtc 1060 1.1 jtc /* 1061 1.1 jtc * found it. return the times and remove the entry from the table. 1062 1.1 jtc */ 1063 1.1 jtc *ppt = pt->fow; 1064 1.1 jtc *mtime = pt->mtime; 1065 1.1 jtc *atime = pt->atime; 1066 1.1 jtc (void)free((char *)pt->name); 1067 1.1 jtc (void)free((char *)pt); 1068 1.25 dsl return 0; 1069 1.1 jtc } 1070 1.1 jtc 1071 1.1 jtc /* 1072 1.1 jtc * directory access mode and time storage routines (for directories CREATED 1073 1.1 jtc * by pax). 1074 1.1 jtc * 1075 1.1 jtc * Pax requires that extracted directories, by default, have their access/mod 1076 1.1 jtc * times and permissions set to the values specified in the archive. During the 1077 1.1 jtc * actions of extracting (and creating the destination subtree during -rw copy) 1078 1.1 jtc * directories extracted may be modified after being created. Even worse is 1079 1.1 jtc * that these directories may have been created with file permissions which 1080 1.1 jtc * prohibits any descendants of these directories from being extracted. When 1081 1.1 jtc * directories are created by pax, access rights may be added to permit the 1082 1.1 jtc * creation of files in their subtree. Every time pax creates a directory, the 1083 1.1 jtc * times and file permissions specified by the archive are stored. After all 1084 1.1 jtc * files have been extracted (or copied), these directories have their times 1085 1.1 jtc * and file modes reset to the stored values. The directory info is restored in 1086 1.1 jtc * reverse order as entries were added to the data file from root to leaf. To 1087 1.1 jtc * restore atime properly, we must go backwards. The data file consists of 1088 1.1 jtc * records with two parts, the file name followed by a DIRDATA trailer. The 1089 1.1 jtc * fixed sized trailer contains the size of the name plus the off_t location in 1090 1.1 jtc * the file. To restore we work backwards through the file reading the trailer 1091 1.1 jtc * then the file name. 1092 1.1 jtc */ 1093 1.1 jtc 1094 1.13 thorpej #ifndef DIRS_USE_FILE 1095 1.13 thorpej static DIRDATA *dirdata_head; 1096 1.13 thorpej #endif 1097 1.13 thorpej 1098 1.1 jtc /* 1099 1.1 jtc * dir_start() 1100 1.1 jtc * set up the directory time and file mode storage for directories CREATED 1101 1.1 jtc * by pax. 1102 1.1 jtc * Return: 1103 1.1 jtc * 0 if ok, -1 otherwise 1104 1.1 jtc */ 1105 1.1 jtc 1106 1.1 jtc int 1107 1.1 jtc dir_start(void) 1108 1.1 jtc { 1109 1.13 thorpej #ifdef DIRS_USE_FILE 1110 1.1 jtc if (dirfd != -1) 1111 1.25 dsl return 0; 1112 1.1 jtc 1113 1.1 jtc /* 1114 1.1 jtc * unlink the file so it goes away at termination by itself 1115 1.1 jtc */ 1116 1.18 christos memcpy(tempbase, _TFILE_BASE, sizeof(_TFILE_BASE)); 1117 1.18 christos if ((dirfd = mkstemp(tempfile)) >= 0) { 1118 1.18 christos (void)unlink(tempfile); 1119 1.25 dsl return 0; 1120 1.1 jtc } 1121 1.7 christos tty_warn(1, "Unable to create temporary file for directory times: %s", 1122 1.18 christos tempfile); 1123 1.25 dsl return -1; 1124 1.13 thorpej #else 1125 1.13 thorpej return (0); 1126 1.13 thorpej #endif /* DIRS_USE_FILE */ 1127 1.1 jtc } 1128 1.1 jtc 1129 1.1 jtc /* 1130 1.1 jtc * add_dir() 1131 1.1 jtc * add the mode and times for a newly CREATED directory 1132 1.1 jtc * name is name of the directory, psb the stat buffer with the data in it, 1133 1.1 jtc * frc_mode is a flag that says whether to force the setting of the mode 1134 1.1 jtc * (ignoring the user set values for preserving file mode). Frc_mode is 1135 1.12 itohy * for the case where we created a file and found that the resulting 1136 1.19 wiz * directory was not writable and the user asked for file modes to NOT 1137 1.1 jtc * be preserved. (we have to preserve what was created by default, so we 1138 1.1 jtc * have to force the setting at the end. this is stated explicitly in the 1139 1.1 jtc * pax spec) 1140 1.1 jtc */ 1141 1.1 jtc 1142 1.1 jtc void 1143 1.1 jtc add_dir(char *name, int nlen, struct stat *psb, int frc_mode) 1144 1.1 jtc { 1145 1.13 thorpej #ifdef DIRS_USE_FILE 1146 1.1 jtc DIRDATA dblk; 1147 1.26 christos #else 1148 1.26 christos DIRDATA *dblk; 1149 1.26 christos #endif 1150 1.26 christos char realname[MAXPATHLEN], *rp; 1151 1.1 jtc 1152 1.26 christos if (havechd && *name != '/') { 1153 1.26 christos if ((rp = realpath(name, realname)) == NULL) { 1154 1.26 christos tty_warn(1, "Cannot canonicalize %s", name); 1155 1.26 christos return; 1156 1.26 christos } 1157 1.26 christos name = rp; 1158 1.31 christos #ifdef DIRS_USE_FILE 1159 1.26 christos nlen = strlen(name); 1160 1.31 christos #endif 1161 1.26 christos } 1162 1.26 christos 1163 1.26 christos #ifdef DIRS_USE_FILE 1164 1.1 jtc if (dirfd < 0) 1165 1.1 jtc return; 1166 1.1 jtc 1167 1.1 jtc /* 1168 1.1 jtc * get current position (where file name will start) so we can store it 1169 1.1 jtc * in the trailer 1170 1.1 jtc */ 1171 1.1 jtc if ((dblk.npos = lseek(dirfd, 0L, SEEK_CUR)) < 0) { 1172 1.7 christos tty_warn(1, 1173 1.7 christos "Unable to store mode and times for directory: %s",name); 1174 1.1 jtc return; 1175 1.1 jtc } 1176 1.1 jtc 1177 1.1 jtc /* 1178 1.1 jtc * write the file name followed by the trailer 1179 1.1 jtc */ 1180 1.1 jtc dblk.nlen = nlen + 1; 1181 1.1 jtc dblk.mode = psb->st_mode & 0xffff; 1182 1.1 jtc dblk.mtime = psb->st_mtime; 1183 1.1 jtc dblk.atime = psb->st_atime; 1184 1.16 tv #if HAVE_STRUCT_STAT_ST_FLAGS 1185 1.10 mrg dblk.fflags = psb->st_flags; 1186 1.16 tv #else 1187 1.16 tv dblk.fflags = 0; 1188 1.16 tv #endif 1189 1.1 jtc dblk.frc_mode = frc_mode; 1190 1.11 itohy if ((xwrite(dirfd, name, dblk.nlen) == dblk.nlen) && 1191 1.11 itohy (xwrite(dirfd, (char *)&dblk, sizeof(dblk)) == sizeof(dblk))) { 1192 1.1 jtc ++dircnt; 1193 1.1 jtc return; 1194 1.1 jtc } 1195 1.1 jtc 1196 1.7 christos tty_warn(1, 1197 1.7 christos "Unable to store mode and times for created directory: %s",name); 1198 1.1 jtc return; 1199 1.13 thorpej #else 1200 1.13 thorpej 1201 1.13 thorpej if ((dblk = malloc(sizeof(*dblk))) == NULL || 1202 1.13 thorpej (dblk->name = strdup(name)) == NULL) { 1203 1.13 thorpej tty_warn(1, 1204 1.13 thorpej "Unable to store mode and times for directory: %s",name); 1205 1.13 thorpej if (dblk != NULL) 1206 1.13 thorpej free(dblk); 1207 1.13 thorpej return; 1208 1.13 thorpej } 1209 1.13 thorpej 1210 1.13 thorpej dblk->mode = psb->st_mode & 0xffff; 1211 1.13 thorpej dblk->mtime = psb->st_mtime; 1212 1.13 thorpej dblk->atime = psb->st_atime; 1213 1.16 tv #if HAVE_STRUCT_STAT_ST_FLAGS 1214 1.13 thorpej dblk->fflags = psb->st_flags; 1215 1.16 tv #else 1216 1.16 tv dblk->fflags = 0; 1217 1.16 tv #endif 1218 1.13 thorpej dblk->frc_mode = frc_mode; 1219 1.13 thorpej 1220 1.13 thorpej dblk->next = dirdata_head; 1221 1.13 thorpej dirdata_head = dblk; 1222 1.13 thorpej return; 1223 1.13 thorpej #endif /* DIRS_USE_FILE */ 1224 1.1 jtc } 1225 1.1 jtc 1226 1.1 jtc /* 1227 1.1 jtc * proc_dir() 1228 1.1 jtc * process all file modes and times stored for directories CREATED 1229 1.1 jtc * by pax 1230 1.1 jtc */ 1231 1.1 jtc 1232 1.1 jtc void 1233 1.1 jtc proc_dir(void) 1234 1.1 jtc { 1235 1.13 thorpej #ifdef DIRS_USE_FILE 1236 1.1 jtc char name[PAXPATHLEN+1]; 1237 1.1 jtc DIRDATA dblk; 1238 1.1 jtc u_long cnt; 1239 1.1 jtc 1240 1.1 jtc if (dirfd < 0) 1241 1.1 jtc return; 1242 1.1 jtc /* 1243 1.1 jtc * read backwards through the file and process each directory 1244 1.1 jtc */ 1245 1.1 jtc for (cnt = 0; cnt < dircnt; ++cnt) { 1246 1.1 jtc /* 1247 1.1 jtc * read the trailer, then the file name, if this fails 1248 1.1 jtc * just give up. 1249 1.1 jtc */ 1250 1.12 itohy if (lseek(dirfd, -((off_t)sizeof(dblk)), SEEK_CUR) < 0) 1251 1.1 jtc break; 1252 1.11 itohy if (xread(dirfd,(char *)&dblk, sizeof(dblk)) != sizeof(dblk)) 1253 1.1 jtc break; 1254 1.12 itohy if (lseek(dirfd, dblk.npos, SEEK_SET) < 0) 1255 1.1 jtc break; 1256 1.11 itohy if (xread(dirfd, name, dblk.nlen) != dblk.nlen) 1257 1.1 jtc break; 1258 1.12 itohy if (lseek(dirfd, dblk.npos, SEEK_SET) < 0) 1259 1.1 jtc break; 1260 1.1 jtc 1261 1.1 jtc /* 1262 1.1 jtc * frc_mode set, make sure we set the file modes even if 1263 1.1 jtc * the user didn't ask for it (see file_subs.c for more info) 1264 1.1 jtc */ 1265 1.1 jtc if (pmode || dblk.frc_mode) 1266 1.1 jtc set_pmode(name, dblk.mode); 1267 1.1 jtc if (patime || pmtime) 1268 1.30 tls set_ftime(name, dblk.mtime, dblk.atime, 0, 0); 1269 1.10 mrg if (pfflags) 1270 1.10 mrg set_chflags(name, dblk.fflags); 1271 1.1 jtc } 1272 1.1 jtc 1273 1.1 jtc (void)close(dirfd); 1274 1.1 jtc dirfd = -1; 1275 1.1 jtc if (cnt != dircnt) 1276 1.7 christos tty_warn(1, 1277 1.7 christos "Unable to set mode and times for created directories"); 1278 1.1 jtc return; 1279 1.13 thorpej #else 1280 1.13 thorpej DIRDATA *dblk; 1281 1.13 thorpej 1282 1.13 thorpej for (dblk = dirdata_head; dblk != NULL; dblk = dirdata_head) { 1283 1.13 thorpej dirdata_head = dblk->next; 1284 1.13 thorpej 1285 1.13 thorpej /* 1286 1.13 thorpej * frc_mode set, make sure we set the file modes even if 1287 1.13 thorpej * the user didn't ask for it (see file_subs.c for more info) 1288 1.13 thorpej */ 1289 1.13 thorpej if (pmode || dblk->frc_mode) 1290 1.13 thorpej set_pmode(dblk->name, dblk->mode); 1291 1.13 thorpej if (patime || pmtime) 1292 1.30 tls set_ftime(dblk->name, dblk->mtime, dblk->atime, 0, 0); 1293 1.13 thorpej if (pfflags) 1294 1.13 thorpej set_chflags(dblk->name, dblk->fflags); 1295 1.13 thorpej 1296 1.13 thorpej free(dblk->name); 1297 1.13 thorpej free(dblk); 1298 1.13 thorpej } 1299 1.13 thorpej #endif /* DIRS_USE_FILE */ 1300 1.1 jtc } 1301 1.1 jtc 1302 1.1 jtc /* 1303 1.1 jtc * database independent routines 1304 1.1 jtc */ 1305 1.1 jtc 1306 1.1 jtc /* 1307 1.1 jtc * st_hash() 1308 1.1 jtc * hashes filenames to a u_int for hashing into a table. Looks at the tail 1309 1.1 jtc * end of file, as this provides far better distribution than any other 1310 1.1 jtc * part of the name. For performance reasons we only care about the last 1311 1.1 jtc * MAXKEYLEN chars (should be at LEAST large enough to pick off the file 1312 1.1 jtc * name). Was tested on 500,000 name file tree traversal from the root 1313 1.1 jtc * and gave almost a perfectly uniform distribution of keys when used with 1314 1.1 jtc * prime sized tables (MAXKEYLEN was 128 in test). Hashes (sizeof int) 1315 1.1 jtc * chars at a time and pads with 0 for last addition. 1316 1.1 jtc * Return: 1317 1.1 jtc * the hash value of the string MOD (%) the table size. 1318 1.1 jtc */ 1319 1.1 jtc 1320 1.1 jtc u_int 1321 1.1 jtc st_hash(char *name, int len, int tabsz) 1322 1.1 jtc { 1323 1.5 tls char *pt; 1324 1.5 tls char *dest; 1325 1.5 tls char *end; 1326 1.5 tls int i; 1327 1.5 tls u_int key = 0; 1328 1.5 tls int steps; 1329 1.5 tls int res; 1330 1.1 jtc u_int val; 1331 1.1 jtc 1332 1.1 jtc /* 1333 1.1 jtc * only look at the tail up to MAXKEYLEN, we do not need to waste 1334 1.1 jtc * time here (remember these are pathnames, the tail is what will 1335 1.1 jtc * spread out the keys) 1336 1.1 jtc */ 1337 1.1 jtc if (len > MAXKEYLEN) { 1338 1.12 itohy pt = &(name[len - MAXKEYLEN]); 1339 1.1 jtc len = MAXKEYLEN; 1340 1.1 jtc } else 1341 1.1 jtc pt = name; 1342 1.1 jtc 1343 1.1 jtc /* 1344 1.1 jtc * calculate the number of u_int size steps in the string and if 1345 1.1 jtc * there is a runt to deal with 1346 1.1 jtc */ 1347 1.1 jtc steps = len/sizeof(u_int); 1348 1.1 jtc res = len % sizeof(u_int); 1349 1.1 jtc 1350 1.1 jtc /* 1351 1.1 jtc * add up the value of the string in unsigned integer sized pieces 1352 1.1 jtc * too bad we cannot have unsigned int aligned strings, then we 1353 1.1 jtc * could avoid the expensive copy. 1354 1.1 jtc */ 1355 1.1 jtc for (i = 0; i < steps; ++i) { 1356 1.1 jtc end = pt + sizeof(u_int); 1357 1.1 jtc dest = (char *)&val; 1358 1.1 jtc while (pt < end) 1359 1.1 jtc *dest++ = *pt++; 1360 1.1 jtc key += val; 1361 1.1 jtc } 1362 1.1 jtc 1363 1.1 jtc /* 1364 1.1 jtc * add in the runt padded with zero to the right 1365 1.1 jtc */ 1366 1.1 jtc if (res) { 1367 1.1 jtc val = 0; 1368 1.1 jtc end = pt + res; 1369 1.1 jtc dest = (char *)&val; 1370 1.1 jtc while (pt < end) 1371 1.1 jtc *dest++ = *pt++; 1372 1.1 jtc key += val; 1373 1.1 jtc } 1374 1.1 jtc 1375 1.1 jtc /* 1376 1.1 jtc * return the result mod the table size 1377 1.1 jtc */ 1378 1.25 dsl return key % tabsz; 1379 1.1 jtc } 1380