OpenCoverage

cp-hash.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/cp-hash.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* cp-hash.c -- file copying (hash search routines)-
2 Copyright (C) 1989-2018 Free Software Foundation, Inc.-
3-
4 This program is free software: you can redistribute it and/or modify-
5 it under the terms of the GNU General Public License as published by-
6 the Free Software Foundation, either version 3 of the License, or-
7 (at your option) any later version.-
8-
9 This program is distributed in the hope that it will be useful,-
10 but WITHOUT ANY WARRANTY; without even the implied warranty of-
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
12 GNU General Public License for more details.-
13-
14 You should have received a copy of the GNU General Public License-
15 along with this program. If not, see <https://www.gnu.org/licenses/>.-
16-
17 Written by Torbjorn Granlund, Sweden (tege@sics.se).-
18 Rewritten to use lib/hash.c by Jim Meyering. */-
19-
20#include <config.h>-
21-
22#include <sys/types.h>-
23#include "system.h"-
24-
25#include "hash.h"-
26#include "cp-hash.h"-
27-
28/* Use ST_DEV and ST_INO as the key, FILENAME as the value.-
29 These are used e.g., in copy.c to associate the destination name with-
30 the source device/inode pair so that if we encounter a matching dev/ino-
31 pair in the source tree we can arrange to create a hard link between-
32 the corresponding names in the destination tree. */-
33struct Src_to_dest-
34{-
35 ino_t st_ino;-
36 dev_t st_dev;-
37 /* Destination file name (of non-directory or pre-existing directory)-
38 corresponding to the dev/ino of a copied file, or the destination file-
39 name corresponding to a dev/ino pair for a newly-created directory. */-
40 char *name;-
41};-
42-
43/* This table maps source dev/ino to destination file name.-
44 We use it to preserve hard links when copying. */-
45static Hash_table *src_to_dest;-
46-
47/* Initial size of the above hash table. */-
48#define INITIAL_TABLE_SIZE 103-
49-
50static size_t-
51src_to_dest_hash (void const *x, size_t table_size)-
52{-
53 struct Src_to_dest const *p = x;-
54-
55 /* Ignoring the device number here should be fine. */-
56 /* The cast to uintmax_t prevents negative remainders-
57 if st_ino is negative. */-
58 return (uintmax_t) p->st_ino % table_size;
executed 60272 times by 2 tests: return (uintmax_t) p->st_ino % table_size;
Executed by:
  • cp
  • mv
60272
59}-
60-
61/* Compare two Src_to_dest entries.-
62 Return true if their keys are judged 'equal'. */-
63static bool-
64src_to_dest_compare (void const *x, void const *y)-
65{-
66 struct Src_to_dest const *a = x;-
67 struct Src_to_dest const *b = y;-
68 return SAME_INODE (*a, *b) ? true : false;
executed 11704 times by 2 tests: return ((*a).st_ino == (*b).st_ino && (*a).st_dev == (*b).st_dev) ? 1 : 0 ;
Executed by:
  • cp
  • mv
11704
69}-
70-
71static void-
72src_to_dest_free (void *x)-
73{-
74 struct Src_to_dest *a = x;-
75 free (a->name);-
76 free (x);-
77}
executed 27 times by 2 tests: end of block
Executed by:
  • cp
  • mv
27
78-
79/* Remove the entry matching INO/DEV from the table-
80 that maps source ino/dev to destination file name. */-
81extern void-
82forget_created (ino_t ino, dev_t dev)-
83{-
84 struct Src_to_dest probe;-
85 struct Src_to_dest *ent;-
86-
87 probe.st_ino = ino;-
88 probe.st_dev = dev;-
89 probe.name = NULL;-
90-
91 ent = hash_delete (src_to_dest, &probe);-
92 if (ent)
entDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 9 times by 2 tests
Evaluated by:
  • cp
  • mv
4-9
93 src_to_dest_free (ent);
executed 4 times by 1 test: src_to_dest_free (ent);
Executed by:
  • mv
4
94}
executed 13 times by 2 tests: end of block
Executed by:
  • cp
  • mv
13
95-
96/* If INO/DEV correspond to an already-copied source file, return the-
97 name of the corresponding destination file. Otherwise, return NULL. */-
98-
99extern char *-
100src_to_dest_lookup (ino_t ino, dev_t dev)-
101{-
102 struct Src_to_dest ent;-
103 struct Src_to_dest const *e;-
104 ent.st_ino = ino;-
105 ent.st_dev = dev;-
106 e = hash_lookup (src_to_dest, &ent);-
107 return e ? e->name : NULL;
executed 34481 times by 2 tests: return e ? e->name : ((void *)0) ;
Executed by:
  • cp
  • mv
34481
108}-
109-
110/* Add file NAME, copied from inode number INO and device number DEV,-
111 to the list of files we have copied.-
112 Return NULL if inserted, otherwise non-NULL. */-
113-
114extern char *-
115remember_copied (const char *name, ino_t ino, dev_t dev)-
116{-
117 struct Src_to_dest *ent;-
118 struct Src_to_dest *ent_from_table;-
119-
120 ent = xmalloc (sizeof *ent);-
121 ent->name = xstrdup (name);-
122 ent->st_ino = ino;-
123 ent->st_dev = dev;-
124-
125 ent_from_table = hash_insert (src_to_dest, ent);-
126 if (ent_from_table == NULL)
ent_from_table == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 7959 times by 2 tests
Evaluated by:
  • cp
  • mv
0-7959
127 {-
128 /* Insertion failed due to lack of memory. */-
129 xalloc_die ();-
130 }
never executed: end of block
0
131-
132 /* Determine whether there was already an entry in the table-
133 with a matching key. If so, free ENT (it wasn't inserted) and-
134 return the 'name' from the table entry. */-
135 if (ent_from_table != ent)
ent_from_table != entDescription
TRUEevaluated 23 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 7936 times by 2 tests
Evaluated by:
  • cp
  • mv
23-7936
136 {-
137 src_to_dest_free (ent);-
138 return (char *) ent_from_table->name;
executed 23 times by 2 tests: return (char *) ent_from_table->name;
Executed by:
  • cp
  • mv
23
139 }-
140-
141 /* New key; insertion succeeded. */-
142 return NULL;
executed 7936 times by 2 tests: return ((void *)0) ;
Executed by:
  • cp
  • mv
7936
143}-
144-
145/* Initialize the hash table. */-
146extern void-
147hash_init (void)-
148{-
149 src_to_dest = hash_initialize (INITIAL_TABLE_SIZE, NULL,-
150 src_to_dest_hash,-
151 src_to_dest_compare,-
152 src_to_dest_free);-
153 if (src_to_dest == NULL)
src_to_dest == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1336 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-1336
154 xalloc_die ();
never executed: xalloc_die ();
0
155}
executed 1336 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
1336
156-
157/* Reset the hash structure in the global variable 'htab' to-
158 contain no entries. */-
159-
160extern void-
161forget_all (void)-
162{-
163 hash_free (src_to_dest);-
164}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2