snapraid/cov/cmdline/elem.c.gcov.html
2015-12-28 16:31:46 +01:00

869 lines
79 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - cmdline/elem.c</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">cmdline</a> - elem.c<span style="font-size: 80%;"> (source / <a href="elem.c.func.html">functions</a>)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">350</td>
<td class="headerCovTableEntry">384</td>
<td class="headerCovTableEntryHi">91.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-05-12</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">45</td>
<td class="headerCovTableEntry">47</td>
<td class="headerCovTableEntryHi">95.7 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td>
<pre class="sourceHeading"> Line data Source code</pre>
<pre class="source">
<a name="1"><span class="lineNum"> 1 </span> : /*</a>
<span class="lineNum"> 2 </span> : * Copyright (C) 2011 Andrea Mazzoleni
<span class="lineNum"> 3 </span> : *
<span class="lineNum"> 4 </span> : * This program is free software: you can redistribute it and/or modify
<span class="lineNum"> 5 </span> : * it under the terms of the GNU General Public License as published by
<span class="lineNum"> 6 </span> : * the Free Software Foundation, either version 3 of the License, or
<span class="lineNum"> 7 </span> : * (at your option) any later version.
<span class="lineNum"> 8 </span> : *
<span class="lineNum"> 9 </span> : * This program is distributed in the hope that it will be useful,
<span class="lineNum"> 10 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
<span class="lineNum"> 11 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
<span class="lineNum"> 12 </span> : * GNU General Public License for more details.
<span class="lineNum"> 13 </span> : *
<span class="lineNum"> 14 </span> : * You should have received a copy of the GNU General Public License
<span class="lineNum"> 15 </span> : * along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.
<span class="lineNum"> 16 </span> : */
<span class="lineNum"> 17 </span> :
<span class="lineNum"> 18 </span> : #include &quot;portable.h&quot;
<span class="lineNum"> 19 </span> :
<span class="lineNum"> 20 </span> : #include &quot;elem.h&quot;
<span class="lineNum"> 21 </span> : #include &quot;support.h&quot;
<span class="lineNum"> 22 </span> : #include &quot;util.h&quot;
<span class="lineNum"> 23 </span> :
<span class="lineNum"> 24 </span> : /****************************************************************************/
<a name="25"><span class="lineNum"> 25 </span> : /* snapraid */</a>
<span class="lineNum"> 26 </span> :
<span class="lineNum"> 27 </span><span class="lineCov"> 1362 : struct snapraid_content* content_alloc(const char* path, uint64_t dev)</span>
<span class="lineNum"> 28 </span> : {
<span class="lineNum"> 29 </span> : struct snapraid_content* content;
<span class="lineNum"> 30 </span> :
<span class="lineNum"> 31 </span><span class="lineCov"> 1362 : content = malloc_nofail(sizeof(struct snapraid_content));</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 1362 : pathimport(content-&gt;content, sizeof(content-&gt;content), path);</span>
<span class="lineNum"> 33 </span><span class="lineCov"> 1362 : content-&gt;device = dev;</span>
<span class="lineNum"> 34 </span> :
<span class="lineNum"> 35 </span><span class="lineCov"> 1362 : return content;</span>
<a name="36"><span class="lineNum"> 36 </span> : }</a>
<span class="lineNum"> 37 </span> :
<span class="lineNum"> 38 </span><span class="lineCov"> 1241 : void content_free(struct snapraid_content* content)</span>
<span class="lineNum"> 39 </span> : {
<span class="lineNum"> 40 </span><span class="lineCov"> 1241 : free(content);</span>
<a name="41"><span class="lineNum"> 41 </span><span class="lineCov"> 1241 : }</span></a>
<span class="lineNum"> 42 </span> :
<span class="lineNum"> 43 </span><span class="lineCov"> 473 : struct snapraid_filter* filter_alloc_file(int direction, const char* pattern)</span>
<span class="lineNum"> 44 </span> : {
<span class="lineNum"> 45 </span> : struct snapraid_filter* filter;
<span class="lineNum"> 46 </span> : char* i;
<span class="lineNum"> 47 </span> : char* first;
<span class="lineNum"> 48 </span> : char* last;
<span class="lineNum"> 49 </span> :
<span class="lineNum"> 50 </span><span class="lineCov"> 473 : filter = malloc_nofail(sizeof(struct snapraid_filter));</span>
<span class="lineNum"> 51 </span><span class="lineCov"> 473 : pathimport(filter-&gt;pattern, sizeof(filter-&gt;pattern), pattern);</span>
<span class="lineNum"> 52 </span><span class="lineCov"> 473 : filter-&gt;direction = direction;</span>
<span class="lineNum"> 53 </span> :
<span class="lineNum"> 54 </span> : /* find first and last slash */
<span class="lineNum"> 55 </span><span class="lineCov"> 473 : first = 0;</span>
<span class="lineNum"> 56 </span><span class="lineCov"> 473 : last = 0;</span>
<span class="lineNum"> 57 </span><span class="lineCov"> 5889 : for (i = filter-&gt;pattern; *i; ++i) {</span>
<span class="lineNum"> 58 </span><span class="lineCov"> 5416 : if (*i == '/') {</span>
<span class="lineNum"> 59 </span><span class="lineCov"> 3 : if (!first)</span>
<span class="lineNum"> 60 </span><span class="lineCov"> 2 : first = i;</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 3 : last = i;</span>
<span class="lineNum"> 62 </span> : }
<span class="lineNum"> 63 </span> : }
<span class="lineNum"> 64 </span> :
<span class="lineNum"> 65 </span> : /* it's a file filter */
<span class="lineNum"> 66 </span><span class="lineCov"> 473 : filter-&gt;is_disk = 0;</span>
<span class="lineNum"> 67 </span> :
<span class="lineNum"> 68 </span><span class="lineCov"> 473 : if (first == 0) {</span>
<span class="lineNum"> 69 </span> : /* no slash */
<span class="lineNum"> 70 </span><span class="lineCov"> 471 : filter-&gt;is_path = 0;</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 471 : filter-&gt;is_dir = 0;</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 2 : } else if (first == last &amp;&amp; last[1] == 0) {</span>
<span class="lineNum"> 73 </span> : /* one slash at the end */
<span class="lineNum"> 74 </span><span class="lineCov"> 1 : filter-&gt;is_path = 0;</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 1 : filter-&gt;is_dir = 1;</span>
<span class="lineNum"> 76 </span><span class="lineCov"> 1 : last[0] = 0;</span>
<span class="lineNum"> 77 </span> : } else {
<span class="lineNum"> 78 </span> : /* at least a slash not at the end */
<span class="lineNum"> 79 </span><span class="lineCov"> 1 : filter-&gt;is_path = 1;</span>
<span class="lineNum"> 80 </span><span class="lineCov"> 1 : if (last[1] == 0) {</span>
<span class="lineNum"> 81 </span><span class="lineNoCov"> 0 : filter-&gt;is_dir = 1;</span>
<span class="lineNum"> 82 </span><span class="lineNoCov"> 0 : last[0] = 0;</span>
<span class="lineNum"> 83 </span> : } else {
<span class="lineNum"> 84 </span><span class="lineCov"> 1 : filter-&gt;is_dir = 0;</span>
<span class="lineNum"> 85 </span> : }
<span class="lineNum"> 86 </span> :
<span class="lineNum"> 87 </span> : /* a slash must be the first char, as we reject PATH/DIR/FILE */
<span class="lineNum"> 88 </span><span class="lineCov"> 1 : if (filter-&gt;pattern[0] != '/') {</span>
<span class="lineNum"> 89 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 90 </span> : free(filter);
<span class="lineNum"> 91 </span> : return 0;
<span class="lineNum"> 92 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 93 </span> : }
<span class="lineNum"> 94 </span> : }
<span class="lineNum"> 95 </span> :
<span class="lineNum"> 96 </span><span class="lineCov"> 473 : return filter;</span>
<a name="97"><span class="lineNum"> 97 </span> : }</a>
<span class="lineNum"> 98 </span> :
<span class="lineNum"> 99 </span><span class="lineCov"> 3 : struct snapraid_filter* filter_alloc_disk(int direction, const char* pattern)</span>
<span class="lineNum"> 100 </span> : {
<span class="lineNum"> 101 </span> : struct snapraid_filter* filter;
<span class="lineNum"> 102 </span> :
<span class="lineNum"> 103 </span><span class="lineCov"> 3 : filter = malloc_nofail(sizeof(struct snapraid_filter));</span>
<span class="lineNum"> 104 </span><span class="lineCov"> 3 : pathimport(filter-&gt;pattern, sizeof(filter-&gt;pattern), pattern);</span>
<span class="lineNum"> 105 </span><span class="lineCov"> 3 : filter-&gt;direction = direction;</span>
<span class="lineNum"> 106 </span> :
<span class="lineNum"> 107 </span> : /* it's a disk filter */
<span class="lineNum"> 108 </span><span class="lineCov"> 3 : filter-&gt;is_disk = 1;</span>
<span class="lineNum"> 109 </span><span class="lineCov"> 3 : filter-&gt;is_path = 0;</span>
<span class="lineNum"> 110 </span><span class="lineCov"> 3 : filter-&gt;is_dir = 0;</span>
<span class="lineNum"> 111 </span> :
<span class="lineNum"> 112 </span> : /* no slash allowed in disk names */
<span class="lineNum"> 113 </span><span class="lineCov"> 3 : if (strchr(filter-&gt;pattern, '/') != 0) {</span>
<span class="lineNum"> 114 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 115 </span> : free(filter);
<span class="lineNum"> 116 </span> : return 0;
<span class="lineNum"> 117 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 118 </span> : }
<span class="lineNum"> 119 </span> :
<span class="lineNum"> 120 </span><span class="lineCov"> 3 : return filter;</span>
<a name="121"><span class="lineNum"> 121 </span> : }</a>
<span class="lineNum"> 122 </span> :
<span class="lineNum"> 123 </span><span class="lineCov"> 440 : void filter_free(struct snapraid_filter* filter)</span>
<span class="lineNum"> 124 </span> : {
<span class="lineNum"> 125 </span><span class="lineCov"> 440 : free(filter);</span>
<a name="126"><span class="lineNum"> 126 </span><span class="lineCov"> 440 : }</span></a>
<span class="lineNum"> 127 </span> :
<span class="lineNum"> 128 </span><span class="lineCov"> 125397 : const char* filter_type(struct snapraid_filter* filter, char* out, size_t out_size)</span>
<span class="lineNum"> 129 </span> : {
<span class="lineNum"> 130 </span> : const char* direction;
<span class="lineNum"> 131 </span><span class="lineCov"> 125397 : if (filter-&gt;direction &lt; 0)</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 125162 : direction = &quot;exclude&quot;;</span>
<span class="lineNum"> 133 </span> : else
<span class="lineNum"> 134 </span><span class="lineCov"> 235 : direction = &quot;include&quot;;</span>
<span class="lineNum"> 135 </span> :
<span class="lineNum"> 136 </span><span class="lineCov"> 125397 : if (filter-&gt;is_disk)</span>
<span class="lineNum"> 137 </span><span class="lineNoCov"> 0 : pathprint(out, out_size, &quot;%s %s:&quot;, direction, filter-&gt;pattern);</span>
<span class="lineNum"> 138 </span><span class="lineCov"> 125397 : else if (filter-&gt;is_dir)</span>
<span class="lineNum"> 139 </span><span class="lineNoCov"> 0 : pathprint(out, out_size, &quot;%s %s/&quot;, direction, filter-&gt;pattern);</span>
<span class="lineNum"> 140 </span> : else
<span class="lineNum"> 141 </span><span class="lineCov"> 125397 : pathprint(out, out_size, &quot;%s %s&quot;, direction, filter-&gt;pattern);</span>
<span class="lineNum"> 142 </span> :
<span class="lineNum"> 143 </span><span class="lineCov"> 125397 : return out;</span>
<a name="144"><span class="lineNum"> 144 </span> : }</a>
<span class="lineNum"> 145 </span> :
<span class="lineNum"> 146 </span><span class="lineCov"> 11927105 : static int filter_apply(struct snapraid_filter* filter, struct snapraid_filter** reason, const char* path, const char* name, int is_dir)</span>
<span class="lineNum"> 147 </span> : {
<span class="lineNum"> 148 </span><span class="lineCov"> 11927105 : int ret = 0;</span>
<span class="lineNum"> 149 </span> :
<span class="lineNum"> 150 </span> : /* matches dirs with dirs and files with files */
<span class="lineNum"> 151 </span><span class="lineCov"> 11927105 : if (filter-&gt;is_dir &amp;&amp; !is_dir)</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 2938 : return 0;</span>
<span class="lineNum"> 153 </span><span class="lineCov"> 11924167 : if (!filter-&gt;is_dir &amp;&amp; is_dir)</span>
<span class="lineNum"> 154 </span><span class="lineCov"> 5960270 : return 0;</span>
<span class="lineNum"> 155 </span> :
<span class="lineNum"> 156 </span><span class="lineCov"> 5963897 : if (filter-&gt;is_path) {</span>
<span class="lineNum"> 157 </span> : /* skip initial slash, as always missing from the path */
<span class="lineNum"> 158 </span><span class="lineCov"> 2938 : if (fnmatch(filter-&gt;pattern + 1, path, FNM_PATHNAME | FNM_CASEINSENSITIVE_FOR_WIN) == 0)</span>
<span class="lineNum"> 159 </span><span class="lineNoCov"> 0 : ret = filter-&gt;direction;</span>
<span class="lineNum"> 160 </span> : } else {
<span class="lineNum"> 161 </span><span class="lineCov"> 5960959 : if (fnmatch(filter-&gt;pattern, name, FNM_CASEINSENSITIVE_FOR_WIN) == 0)</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 127917 : ret = filter-&gt;direction;</span>
<span class="lineNum"> 163 </span> : }
<span class="lineNum"> 164 </span> :
<span class="lineNum"> 165 </span><span class="lineCov"> 5963897 : if (reason != 0 &amp;&amp; ret &lt; 0)</span>
<span class="lineNum"> 166 </span><span class="lineCov"> 124927 : *reason = filter;</span>
<span class="lineNum"> 167 </span> :
<span class="lineNum"> 168 </span><span class="lineCov"> 5963897 : return ret;</span>
<a name="169"><span class="lineNum"> 169 </span> : }</a>
<span class="lineNum"> 170 </span> :
<span class="lineNum"> 171 </span><span class="lineCov"> 5969644 : static int filter_recurse(struct snapraid_filter* filter, struct snapraid_filter** reason, const char* const_path, int is_dir)</span>
<span class="lineNum"> 172 </span> : {
<span class="lineNum"> 173 </span> : char path[PATH_MAX];
<span class="lineNum"> 174 </span> : char* name;
<span class="lineNum"> 175 </span> : unsigned i;
<span class="lineNum"> 176 </span> :
<span class="lineNum"> 177 </span><span class="lineCov"> 5969644 : pathcpy(path, sizeof(path), const_path);</span>
<span class="lineNum"> 178 </span> :
<span class="lineNum"> 179 </span> : /* filter for all the directories */
<span class="lineNum"> 180 </span><span class="lineCov"> 5969644 : name = path;</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 86217249 : for (i = 0; path[i] != 0; ++i) {</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 80250595 : if (path[i] == '/') {</span>
<span class="lineNum"> 183 </span> : /* set a terminator */
<span class="lineNum"> 184 </span><span class="lineCov"> 5960451 : path[i] = 0;</span>
<span class="lineNum"> 185 </span> :
<span class="lineNum"> 186 </span> : /* filter the directory */
<span class="lineNum"> 187 </span><span class="lineCov"> 5960451 : if (filter_apply(filter, reason, path, name, 1) != 0)</span>
<span class="lineNum"> 188 </span><span class="lineCov"> 2990 : return filter-&gt;direction;</span>
<span class="lineNum"> 189 </span> :
<span class="lineNum"> 190 </span> : /* restore the slash */
<span class="lineNum"> 191 </span><span class="lineCov"> 5957461 : path[i] = '/';</span>
<span class="lineNum"> 192 </span> :
<span class="lineNum"> 193 </span> : /* next name */
<span class="lineNum"> 194 </span><span class="lineCov"> 5957461 : name = path + i + 1;</span>
<span class="lineNum"> 195 </span> : }
<span class="lineNum"> 196 </span> : }
<span class="lineNum"> 197 </span> :
<span class="lineNum"> 198 </span> : /* filter the final file */
<span class="lineNum"> 199 </span><span class="lineCov"> 5966654 : if (filter_apply(filter, reason, path, name, is_dir) != 0)</span>
<span class="lineNum"> 200 </span><span class="lineCov"> 124927 : return filter-&gt;direction;</span>
<span class="lineNum"> 201 </span> :
<span class="lineNum"> 202 </span><span class="lineCov"> 5841727 : return 0;</span>
<a name="203"><span class="lineNum"> 203 </span> : }</a>
<span class="lineNum"> 204 </span> :
<span class="lineNum"> 205 </span><span class="lineCov"> 3187555 : static int filter_element(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub, int is_dir)</span>
<span class="lineNum"> 206 </span> : {
<span class="lineNum"> 207 </span> : tommy_node* i;
<span class="lineNum"> 208 </span> :
<span class="lineNum"> 209 </span><span class="lineCov"> 3187555 : int direction = 1; /* by default include all */</span>
<span class="lineNum"> 210 </span> :
<span class="lineNum"> 211 </span> : /* for each filter */
<span class="lineNum"> 212 </span><span class="lineCov"> 9072239 : for (i = tommy_list_head(filterlist); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 213 </span> : int ret;
<span class="lineNum"> 214 </span><span class="lineCov"> 6021268 : struct snapraid_filter* filter = i-&gt;data;</span>
<span class="lineNum"> 215 </span> :
<span class="lineNum"> 216 </span><span class="lineCov"> 6021268 : if (filter-&gt;is_disk) {</span>
<span class="lineNum"> 217 </span><span class="lineCov"> 51624 : if (fnmatch(filter-&gt;pattern, disk, FNM_CASEINSENSITIVE_FOR_WIN) == 0)</span>
<span class="lineNum"> 218 </span><span class="lineCov"> 8667 : ret = filter-&gt;direction;</span>
<span class="lineNum"> 219 </span> : else
<span class="lineNum"> 220 </span><span class="lineCov"> 42957 : ret = 0;</span>
<span class="lineNum"> 221 </span><span class="lineCov"> 51624 : if (reason != 0 &amp;&amp; ret &lt; 0)</span>
<span class="lineNum"> 222 </span><span class="lineNoCov"> 0 : *reason = filter;</span>
<span class="lineNum"> 223 </span> : } else {
<span class="lineNum"> 224 </span><span class="lineCov"> 5969644 : ret = filter_recurse(filter, reason, sub, is_dir);</span>
<span class="lineNum"> 225 </span> : }
<span class="lineNum"> 226 </span> :
<span class="lineNum"> 227 </span><span class="lineCov"> 6021268 : if (ret &gt; 0) {</span>
<span class="lineNum"> 228 </span> : /* include the file */
<span class="lineNum"> 229 </span><span class="lineCov"> 11657 : return 0;</span>
<span class="lineNum"> 230 </span><span class="lineCov"> 6009611 : } else if (ret &lt; 0) {</span>
<span class="lineNum"> 231 </span> : /* exclude the file */
<span class="lineNum"> 232 </span><span class="lineCov"> 124927 : return -1;</span>
<span class="lineNum"> 233 </span> : } else {
<span class="lineNum"> 234 </span> : /* default is opposite of the last filter */
<span class="lineNum"> 235 </span><span class="lineCov"> 5884684 : direction = -filter-&gt;direction;</span>
<span class="lineNum"> 236 </span><span class="lineCov"> 5884684 : if (reason != 0 &amp;&amp; direction &lt; 0)</span>
<span class="lineNum"> 237 </span><span class="lineCov"> 2977425 : *reason = filter;</span>
<span class="lineNum"> 238 </span> : /* continue with the next one */
<span class="lineNum"> 239 </span> : }
<span class="lineNum"> 240 </span> : }
<span class="lineNum"> 241 </span> :
<span class="lineNum"> 242 </span> : /* directories are always included by default, otherwise we cannot apply rules */
<span class="lineNum"> 243 </span> : /* to the contained files */
<span class="lineNum"> 244 </span><span class="lineCov"> 3050971 : if (is_dir)</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 2919 : return 0;</span>
<span class="lineNum"> 246 </span> :
<span class="lineNum"> 247 </span> : /* files are excluded/included depending of the last rule processed */
<span class="lineNum"> 248 </span><span class="lineCov"> 3048052 : if (direction &lt; 0)</span>
<span class="lineNum"> 249 </span><span class="lineCov"> 45888 : return -1;</span>
<span class="lineNum"> 250 </span> :
<span class="lineNum"> 251 </span><span class="lineCov"> 3002164 : return 0;</span>
<a name="252"><span class="lineNum"> 252 </span> : }</a>
<span class="lineNum"> 253 </span> :
<span class="lineNum"> 254 </span><span class="lineCov"> 3184635 : int filter_path(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub)</span>
<span class="lineNum"> 255 </span> : {
<span class="lineNum"> 256 </span><span class="lineCov"> 3184635 : return filter_element(filterlist, reason, disk, sub, 0);</span>
<a name="257"><span class="lineNum"> 257 </span> : }</a>
<span class="lineNum"> 258 </span> :
<span class="lineNum"> 259 </span><span class="lineCov"> 2920 : int filter_dir(tommy_list* filterlist, struct snapraid_filter** reason, const char* disk, const char* sub)</span>
<span class="lineNum"> 260 </span> : {
<span class="lineNum"> 261 </span><span class="lineCov"> 2920 : return filter_element(filterlist, reason, disk, sub, 1);</span>
<a name="262"><span class="lineNum"> 262 </span> : }</a>
<span class="lineNum"> 263 </span> :
<span class="lineNum"> 264 </span><span class="lineCov"> 80652 : int filter_existence(int filter_missing, const char* dir, const char* sub)</span>
<span class="lineNum"> 265 </span> : {
<span class="lineNum"> 266 </span> : char path[PATH_MAX];
<span class="lineNum"> 267 </span> : struct stat st;
<span class="lineNum"> 268 </span> :
<span class="lineNum"> 269 </span><span class="lineCov"> 80652 : if (!filter_missing)</span>
<span class="lineNum"> 270 </span><span class="lineCov"> 34956 : return 0;</span>
<span class="lineNum"> 271 </span> :
<span class="lineNum"> 272 </span> : /* we directly check if in the disk the file is present or not */
<span class="lineNum"> 273 </span><span class="lineCov"> 45696 : pathprint(path, sizeof(path), &quot;%s%s&quot;, dir, sub);</span>
<span class="lineNum"> 274 </span> :
<span class="lineNum"> 275 </span><span class="lineCov"> 45696 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 276 </span> : /* if the file doesn't exist, we don't filter it out */
<span class="lineNum"> 277 </span><span class="lineCov"> 5019 : if (errno == ENOENT)</span>
<span class="lineNum"> 278 </span><span class="lineCov"> 5019 : return 0;</span>
<span class="lineNum"> 279 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 280 </span> : log_fatal(&quot;Error in stat file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 281 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 282 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 283 </span> : }
<span class="lineNum"> 284 </span> :
<span class="lineNum"> 285 </span> : /* the file is present, so we filter it out */
<span class="lineNum"> 286 </span><span class="lineCov"> 40677 : return 1;</span>
<a name="287"><span class="lineNum"> 287 </span> : }</a>
<span class="lineNum"> 288 </span> :
<span class="lineNum"> 289 </span><span class="lineCov"> 38818 : int filter_correctness(int filter_error, tommy_arrayblkof* infoarr, struct snapraid_file* file)</span>
<span class="lineNum"> 290 </span> : {
<span class="lineNum"> 291 </span> : unsigned i;
<span class="lineNum"> 292 </span> :
<span class="lineNum"> 293 </span><span class="lineCov"> 38818 : if (!filter_error)</span>
<span class="lineNum"> 294 </span><span class="lineCov"> 16290 : return 0;</span>
<span class="lineNum"> 295 </span> :
<span class="lineNum"> 296 </span> : /* check each block of the file */
<span class="lineNum"> 297 </span><span class="lineCov"> 60129 : for (i = 0; i &lt; file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 298 </span> : struct snapraid_block* block;
<span class="lineNum"> 299 </span> : snapraid_info info;
<span class="lineNum"> 300 </span> :
<span class="lineNum"> 301 </span><span class="lineCov"> 46037 : block = &amp;file-&gt;blockvec[i];</span>
<span class="lineNum"> 302 </span> :
<span class="lineNum"> 303 </span><span class="lineCov"> 46037 : info = info_get(infoarr, block-&gt;parity_pos);</span>
<span class="lineNum"> 304 </span> :
<span class="lineNum"> 305 </span> : /* if the file has a bad block, don't exclude it */
<span class="lineNum"> 306 </span><span class="lineCov"> 46037 : if (info_get_bad(info))</span>
<span class="lineNum"> 307 </span><span class="lineCov"> 8436 : return 0;</span>
<span class="lineNum"> 308 </span> : }
<span class="lineNum"> 309 </span> :
<span class="lineNum"> 310 </span> : /* the file is correct, so we filter it out */
<span class="lineNum"> 311 </span><span class="lineCov"> 14092 : return 1;</span>
<a name="312"><span class="lineNum"> 312 </span> : }</a>
<span class="lineNum"> 313 </span> :
<span class="lineNum"> 314 </span><span class="lineCov"> 3039576 : int filter_content(tommy_list* contentlist, const char* path)</span>
<span class="lineNum"> 315 </span> : {
<span class="lineNum"> 316 </span> : tommy_node* i;
<span class="lineNum"> 317 </span> :
<span class="lineNum"> 318 </span><span class="lineCov"> 39360526 : for (i = tommy_list_head(contentlist); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 319 </span><span class="lineCov"> 16640687 : struct snapraid_content* content = i-&gt;data;</span>
<span class="lineNum"> 320 </span> : char tmp[PATH_MAX];
<span class="lineNum"> 321 </span> :
<span class="lineNum"> 322 </span><span class="lineCov"> 16640687 : if (pathcmp(content-&gt;content, path) == 0)</span>
<span class="lineNum"> 323 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 324 </span> :
<span class="lineNum"> 325 </span> : /* exclude also the &quot;.tmp&quot; copy used to save it */
<span class="lineNum"> 326 </span><span class="lineCov"> 16640687 : pathprint(tmp, sizeof(tmp), &quot;%s.tmp&quot;, content-&gt;content);</span>
<span class="lineNum"> 327 </span><span class="lineCov"> 16640687 : if (pathcmp(tmp, path) == 0)</span>
<span class="lineNum"> 328 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 329 </span> :
<span class="lineNum"> 330 </span> : /* exclude also the &quot;.lock&quot; file */
<span class="lineNum"> 331 </span><span class="lineCov"> 16640687 : pathprint(tmp, sizeof(tmp), &quot;%s.lock&quot;, content-&gt;content);</span>
<span class="lineNum"> 332 </span><span class="lineCov"> 16640687 : if (pathcmp(tmp, path) == 0)</span>
<span class="lineNum"> 333 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 334 </span> : }
<span class="lineNum"> 335 </span> :
<span class="lineNum"> 336 </span><span class="lineCov"> 3039576 : return 0;</span>
<a name="337"><span class="lineNum"> 337 </span> : }</a>
<span class="lineNum"> 338 </span> :
<span class="lineNum"> 339 </span><span class="lineCov"> 14832379 : block_off_t block_file_pos(struct snapraid_block* block)</span>
<span class="lineNum"> 340 </span> : {
<span class="lineNum"> 341 </span><span class="lineCov"> 14832379 : struct snapraid_file* file = block_file_get(block);</span>
<span class="lineNum"> 342 </span> :
<span class="lineNum"> 343 </span><span class="lineCov"> 14832379 : if (block &lt; file-&gt;blockvec || block &gt;= file-&gt;blockvec + file-&gt;blockmax) {</span>
<span class="lineNum"> 344 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 345 </span> : log_fatal(&quot;Internal inconsistency in block %u ownership\n&quot;, block-&gt;parity_pos);
<span class="lineNum"> 346 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 347 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 348 </span> : }
<span class="lineNum"> 349 </span> :
<span class="lineNum"> 350 </span><span class="lineCov"> 14832379 : return block - file-&gt;blockvec;</span>
<a name="351"><span class="lineNum"> 351 </span> : }</a>
<span class="lineNum"> 352 </span> :
<span class="lineNum"> 353 </span><span class="lineCov"> 5375510 : int block_is_last(struct snapraid_block* block)</span>
<span class="lineNum"> 354 </span> : {
<span class="lineNum"> 355 </span><span class="lineCov"> 5375510 : struct snapraid_file* file = block_file_get(block);</span>
<span class="lineNum"> 356 </span> :
<span class="lineNum"> 357 </span><span class="lineCov"> 5375510 : return block == file-&gt;blockvec + file-&gt;blockmax - 1;</span>
<a name="358"><span class="lineNum"> 358 </span> : }</a>
<span class="lineNum"> 359 </span> :
<span class="lineNum"> 360 </span><span class="lineCov"> 6527495 : unsigned block_file_size(struct snapraid_block* block, unsigned block_size)</span>
<span class="lineNum"> 361 </span> : {
<span class="lineNum"> 362 </span><span class="lineCov"> 6527495 : block_off_t pos = block_file_pos(block);</span>
<span class="lineNum"> 363 </span> :
<span class="lineNum"> 364 </span> : /* if it's the last block */
<span class="lineNum"> 365 </span><span class="lineCov"> 6527495 : if (pos + 1 == block_file_get(block)-&gt;blockmax) {</span>
<span class="lineNum"> 366 </span> : unsigned remainder;
<span class="lineNum"> 367 </span><span class="lineCov"> 2658644 : if (block_file_get(block)-&gt;size == 0)</span>
<span class="lineNum"> 368 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 369 </span><span class="lineCov"> 2658644 : remainder = block_file_get(block)-&gt;size % block_size;</span>
<span class="lineNum"> 370 </span><span class="lineCov"> 2658644 : if (remainder == 0)</span>
<span class="lineNum"> 371 </span><span class="lineCov"> 1529 : remainder = block_size;</span>
<span class="lineNum"> 372 </span><span class="lineCov"> 2658644 : return remainder;</span>
<span class="lineNum"> 373 </span> : }
<span class="lineNum"> 374 </span> :
<span class="lineNum"> 375 </span><span class="lineCov"> 3868851 : return block_size;</span>
<a name="376"><span class="lineNum"> 376 </span> : }</a>
<span class="lineNum"> 377 </span> :
<span class="lineNum"> 378 </span><span class="lineCov"> 164533 : struct snapraid_deleted* deleted_alloc(void)</span>
<span class="lineNum"> 379 </span> : {
<span class="lineNum"> 380 </span> : struct snapraid_deleted* deleted;
<span class="lineNum"> 381 </span> :
<span class="lineNum"> 382 </span><span class="lineCov"> 164533 : deleted = malloc_nofail(sizeof(struct snapraid_deleted));</span>
<span class="lineNum"> 383 </span> :
<span class="lineNum"> 384 </span> : /* set the state as deleted */
<span class="lineNum"> 385 </span><span class="lineCov"> 164533 : deleted-&gt;block.file_mixed = BLOCK_STATE_DELETED;</span>
<span class="lineNum"> 386 </span> :
<span class="lineNum"> 387 </span><span class="lineCov"> 164533 : return deleted;</span>
<a name="388"><span class="lineNum"> 388 </span> : }</a>
<span class="lineNum"> 389 </span> :
<span class="lineNum"> 390 </span><span class="lineCov"> 135934 : struct snapraid_deleted* deleted_dup(struct snapraid_block* block)</span>
<span class="lineNum"> 391 </span> : {
<span class="lineNum"> 392 </span> : struct snapraid_deleted* deleted;
<span class="lineNum"> 393 </span> :
<span class="lineNum"> 394 </span><span class="lineCov"> 135934 : deleted = deleted_alloc();</span>
<span class="lineNum"> 395 </span> :
<span class="lineNum"> 396 </span> : /* copy data from deleted block */
<span class="lineNum"> 397 </span><span class="lineCov"> 135934 : deleted-&gt;block.parity_pos = block-&gt;parity_pos;</span>
<span class="lineNum"> 398 </span><span class="lineCov"> 135934 : memcpy(deleted-&gt;block.hash, block-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 399 </span> :
<span class="lineNum"> 400 </span><span class="lineCov"> 135934 : return deleted;</span>
<a name="401"><span class="lineNum"> 401 </span> : }</a>
<span class="lineNum"> 402 </span> :
<span class="lineNum"> 403 </span><span class="lineCov"> 163984 : void deleted_free(struct snapraid_deleted* deleted)</span>
<span class="lineNum"> 404 </span> : {
<span class="lineNum"> 405 </span><span class="lineCov"> 163984 : free(deleted);</span>
<a name="406"><span class="lineNum"> 406 </span><span class="lineCov"> 163984 : }</span></a>
<span class="lineNum"> 407 </span> :
<span class="lineNum"> 408 </span><span class="lineCov"> 3578529 : struct snapraid_file* file_alloc(unsigned block_size, const char* sub, data_off_t size, uint64_t mtime_sec, int mtime_nsec, uint64_t inode, uint64_t physical)</span>
<span class="lineNum"> 409 </span> : {
<span class="lineNum"> 410 </span> : struct snapraid_file* file;
<span class="lineNum"> 411 </span> : block_off_t i;
<span class="lineNum"> 412 </span> :
<span class="lineNum"> 413 </span><span class="lineCov"> 3578529 : file = malloc_nofail(sizeof(struct snapraid_file));</span>
<span class="lineNum"> 414 </span><span class="lineCov"> 3578529 : file-&gt;sub = strdup_nofail(sub);</span>
<span class="lineNum"> 415 </span><span class="lineCov"> 3578529 : file-&gt;size = size;</span>
<span class="lineNum"> 416 </span><span class="lineCov"> 3578529 : file-&gt;blockmax = (size + block_size - 1) / block_size;</span>
<span class="lineNum"> 417 </span><span class="lineCov"> 3578529 : file-&gt;mtime_sec = mtime_sec;</span>
<span class="lineNum"> 418 </span><span class="lineCov"> 3578529 : file-&gt;mtime_nsec = mtime_nsec;</span>
<span class="lineNum"> 419 </span><span class="lineCov"> 3578529 : file-&gt;inode = inode;</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 3578529 : file-&gt;physical = physical;</span>
<span class="lineNum"> 421 </span><span class="lineCov"> 3578529 : file-&gt;flag = 0;</span>
<span class="lineNum"> 422 </span><span class="lineCov"> 3578529 : file-&gt;blockvec = malloc_nofail(file-&gt;blockmax * sizeof(struct snapraid_block));</span>
<span class="lineNum"> 423 </span> :
<span class="lineNum"> 424 </span> : /* set the back pointer */
<span class="lineNum"> 425 </span><span class="lineCov"> 12379416 : for (i = 0; i &lt; file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 426 </span><span class="lineCov"> 8800887 : file-&gt;blockvec[i].parity_pos = POS_INVALID;</span>
<span class="lineNum"> 427 </span><span class="lineCov"> 8800887 : file-&gt;blockvec[i].file_mixed = 0;</span>
<span class="lineNum"> 428 </span> :
<span class="lineNum"> 429 </span> : /* set the file */
<span class="lineNum"> 430 </span><span class="lineCov"> 8800887 : block_file_set(&amp;file-&gt;blockvec[i], file);</span>
<span class="lineNum"> 431 </span> :
<span class="lineNum"> 432 </span> : /* set an invalid hash */
<span class="lineNum"> 433 </span><span class="lineCov"> 8800887 : block_state_set(&amp;file-&gt;blockvec[i], BLOCK_STATE_CHG);</span>
<span class="lineNum"> 434 </span><span class="lineCov"> 8800887 : hash_invalid_set(file-&gt;blockvec[i].hash);</span>
<span class="lineNum"> 435 </span> : }
<span class="lineNum"> 436 </span> :
<span class="lineNum"> 437 </span><span class="lineCov"> 3578529 : return file;</span>
<a name="438"><span class="lineNum"> 438 </span> : }</a>
<span class="lineNum"> 439 </span> :
<span class="lineNum"> 440 </span><span class="lineCov"> 3426080 : void file_free(struct snapraid_file* file)</span>
<span class="lineNum"> 441 </span> : {
<span class="lineNum"> 442 </span><span class="lineCov"> 3426080 : free(file-&gt;sub);</span>
<span class="lineNum"> 443 </span><span class="lineCov"> 3426080 : free(file-&gt;blockvec);</span>
<span class="lineNum"> 444 </span><span class="lineCov"> 3426080 : free(file);</span>
<a name="445"><span class="lineNum"> 445 </span><span class="lineCov"> 3426080 : }</span></a>
<span class="lineNum"> 446 </span> :
<span class="lineNum"> 447 </span><span class="lineCov"> 155 : void file_rename(struct snapraid_file* file, const char* sub)</span>
<span class="lineNum"> 448 </span> : {
<span class="lineNum"> 449 </span><span class="lineCov"> 155 : free(file-&gt;sub);</span>
<span class="lineNum"> 450 </span><span class="lineCov"> 155 : file-&gt;sub = strdup_nofail(sub);</span>
<a name="451"><span class="lineNum"> 451 </span><span class="lineCov"> 155 : }</span></a>
<span class="lineNum"> 452 </span> :
<span class="lineNum"> 453 </span><span class="lineCov"> 6145 : void file_copy(struct snapraid_file* src_file, struct snapraid_file* dst_file)</span>
<span class="lineNum"> 454 </span> : {
<span class="lineNum"> 455 </span> : block_off_t i;
<span class="lineNum"> 456 </span> :
<span class="lineNum"> 457 </span><span class="lineCov"> 6145 : if (src_file-&gt;size != dst_file-&gt;size) {</span>
<span class="lineNum"> 458 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 459 </span> : log_fatal(&quot;Internal inconsistency in copy file with different size\n&quot;);
<span class="lineNum"> 460 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 461 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 462 </span> : }
<span class="lineNum"> 463 </span> :
<span class="lineNum"> 464 </span><span class="lineCov"> 6145 : if (src_file-&gt;mtime_sec != dst_file-&gt;mtime_sec) {</span>
<span class="lineNum"> 465 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 466 </span> : log_fatal(&quot;Internal inconsistency in copy file with different mtime_sec\n&quot;);
<span class="lineNum"> 467 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 468 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 469 </span> : }
<span class="lineNum"> 470 </span> :
<span class="lineNum"> 471 </span><span class="lineCov"> 6145 : if (src_file-&gt;mtime_nsec != dst_file-&gt;mtime_nsec) {</span>
<span class="lineNum"> 472 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 473 </span> : log_fatal(&quot;Internal inconsistency in copy file with different mtime_nsec\n&quot;);
<span class="lineNum"> 474 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 475 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 476 </span> : }
<span class="lineNum"> 477 </span> :
<span class="lineNum"> 478 </span><span class="lineCov"> 17785 : for (i = 0; i &lt; dst_file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 479 </span> : /* set a block with hash computed but without parity */
<span class="lineNum"> 480 </span><span class="lineCov"> 11640 : block_state_set(&amp;dst_file-&gt;blockvec[i], BLOCK_STATE_REP);</span>
<span class="lineNum"> 481 </span> :
<span class="lineNum"> 482 </span> : /* copy the hash */
<span class="lineNum"> 483 </span><span class="lineCov"> 11640 : memcpy(dst_file-&gt;blockvec[i].hash, src_file-&gt;blockvec[i].hash, HASH_SIZE);</span>
<span class="lineNum"> 484 </span> : }
<span class="lineNum"> 485 </span> :
<span class="lineNum"> 486 </span><span class="lineCov"> 6145 : file_flag_set(dst_file, FILE_IS_COPY);</span>
<a name="487"><span class="lineNum"> 487 </span><span class="lineCov"> 6145 : }</span></a>
<span class="lineNum"> 488 </span> :
<span class="lineNum"> 489 </span><span class="lineCov"> 47808 : const char* file_name(const struct snapraid_file* file)</span>
<span class="lineNum"> 490 </span> : {
<span class="lineNum"> 491 </span><span class="lineCov"> 47808 : const char* r = strrchr(file-&gt;sub, '/');</span>
<span class="lineNum"> 492 </span> :
<span class="lineNum"> 493 </span><span class="lineCov"> 47808 : if (!r)</span>
<span class="lineNum"> 494 </span><span class="lineCov"> 6 : r = file-&gt;sub;</span>
<span class="lineNum"> 495 </span> : else
<span class="lineNum"> 496 </span><span class="lineCov"> 47802 : ++r;</span>
<span class="lineNum"> 497 </span><span class="lineCov"> 47808 : return r;</span>
<a name="498"><span class="lineNum"> 498 </span> : }</a>
<span class="lineNum"> 499 </span> :
<span class="lineNum"> 500 </span><span class="lineCov"> 848716 : int file_inode_compare_to_arg(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 501 </span> : {
<span class="lineNum"> 502 </span><span class="lineCov"> 848716 : const uint64_t* arg = void_arg;</span>
<span class="lineNum"> 503 </span><span class="lineCov"> 848716 : const struct snapraid_file* file = void_data;</span>
<span class="lineNum"> 504 </span> :
<span class="lineNum"> 505 </span><span class="lineCov"> 848716 : if (*arg &lt; file-&gt;inode)</span>
<span class="lineNum"> 506 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 507 </span><span class="lineCov"> 848716 : if (*arg &gt; file-&gt;inode)</span>
<span class="lineNum"> 508 </span><span class="lineNoCov"> 0 : return 1;</span>
<span class="lineNum"> 509 </span><span class="lineCov"> 848716 : return 0;</span>
<a name="510"><span class="lineNum"> 510 </span> : }</a>
<span class="lineNum"> 511 </span> :
<span class="lineNum"> 512 </span><span class="lineNoCov"> 0 : int file_inode_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 513 </span> : {
<span class="lineNum"> 514 </span><span class="lineNoCov"> 0 : const struct snapraid_file* file_a = void_a;</span>
<span class="lineNum"> 515 </span><span class="lineNoCov"> 0 : const struct snapraid_file* file_b = void_b;</span>
<span class="lineNum"> 516 </span> :
<span class="lineNum"> 517 </span><span class="lineNoCov"> 0 : if (file_a-&gt;inode &lt; file_b-&gt;inode)</span>
<span class="lineNum"> 518 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 519 </span><span class="lineNoCov"> 0 : if (file_a-&gt;inode &gt; file_b-&gt;inode)</span>
<span class="lineNum"> 520 </span><span class="lineNoCov"> 0 : return 1;</span>
<span class="lineNum"> 521 </span><span class="lineNoCov"> 0 : return 0;</span>
<a name="522"><span class="lineNum"> 522 </span> : }</a>
<span class="lineNum"> 523 </span> :
<span class="lineNum"> 524 </span><span class="lineCov"> 125441 : int file_path_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 525 </span> : {
<span class="lineNum"> 526 </span><span class="lineCov"> 125441 : const struct snapraid_file* file_a = void_a;</span>
<span class="lineNum"> 527 </span><span class="lineCov"> 125441 : const struct snapraid_file* file_b = void_b;</span>
<span class="lineNum"> 528 </span> :
<span class="lineNum"> 529 </span><span class="lineCov"> 125441 : return strcmp(file_a-&gt;sub, file_b-&gt;sub);</span>
<a name="530"><span class="lineNum"> 530 </span> : }</a>
<span class="lineNum"> 531 </span> :
<span class="lineNum"> 532 </span><span class="lineCov"> 52928 : int file_physical_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 533 </span> : {
<span class="lineNum"> 534 </span><span class="lineCov"> 52928 : const struct snapraid_file* file_a = void_a;</span>
<span class="lineNum"> 535 </span><span class="lineCov"> 52928 : const struct snapraid_file* file_b = void_b;</span>
<span class="lineNum"> 536 </span> :
<span class="lineNum"> 537 </span><span class="lineCov"> 52928 : if (file_a-&gt;physical &lt; file_b-&gt;physical)</span>
<span class="lineNum"> 538 </span><span class="lineCov"> 34086 : return -1;</span>
<span class="lineNum"> 539 </span><span class="lineCov"> 18842 : if (file_a-&gt;physical &gt; file_b-&gt;physical)</span>
<span class="lineNum"> 540 </span><span class="lineCov"> 18842 : return 1;</span>
<span class="lineNum"> 541 </span><span class="lineNoCov"> 0 : return 0;</span>
<a name="542"><span class="lineNum"> 542 </span> : }</a>
<span class="lineNum"> 543 </span> :
<span class="lineNum"> 544 </span><span class="lineCov"> 98966 : int file_path_compare_to_arg(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 545 </span> : {
<span class="lineNum"> 546 </span><span class="lineCov"> 98966 : const char* arg = void_arg;</span>
<span class="lineNum"> 547 </span><span class="lineCov"> 98966 : const struct snapraid_file* file = void_data;</span>
<span class="lineNum"> 548 </span> :
<span class="lineNum"> 549 </span><span class="lineCov"> 98966 : return strcmp(arg, file-&gt;sub);</span>
<a name="550"><span class="lineNum"> 550 </span> : }</a>
<span class="lineNum"> 551 </span> :
<span class="lineNum"> 552 </span><span class="lineCov"> 23904 : int file_name_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 553 </span> : {
<span class="lineNum"> 554 </span><span class="lineCov"> 23904 : const struct snapraid_file* file_a = void_a;</span>
<span class="lineNum"> 555 </span><span class="lineCov"> 23904 : const struct snapraid_file* file_b = void_b;</span>
<span class="lineNum"> 556 </span><span class="lineCov"> 23904 : const char* name_a = file_name(file_a);</span>
<span class="lineNum"> 557 </span><span class="lineCov"> 23904 : const char* name_b = file_name(file_b);</span>
<span class="lineNum"> 558 </span> :
<span class="lineNum"> 559 </span><span class="lineCov"> 23904 : return strcmp(name_a, name_b);</span>
<a name="560"><span class="lineNum"> 560 </span> : }</a>
<span class="lineNum"> 561 </span> :
<span class="lineNum"> 562 </span><span class="lineCov"> 23658 : int file_stamp_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 563 </span> : {
<span class="lineNum"> 564 </span><span class="lineCov"> 23658 : const struct snapraid_file* file_a = void_a;</span>
<span class="lineNum"> 565 </span><span class="lineCov"> 23658 : const struct snapraid_file* file_b = void_b;</span>
<span class="lineNum"> 566 </span> :
<span class="lineNum"> 567 </span><span class="lineCov"> 23658 : if (file_a-&gt;size &lt; file_b-&gt;size)</span>
<span class="lineNum"> 568 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 569 </span><span class="lineCov"> 23658 : if (file_a-&gt;size &gt; file_b-&gt;size)</span>
<span class="lineNum"> 570 </span><span class="lineNoCov"> 0 : return 1;</span>
<span class="lineNum"> 571 </span> :
<span class="lineNum"> 572 </span><span class="lineCov"> 23658 : if (file_a-&gt;mtime_sec &lt; file_b-&gt;mtime_sec)</span>
<span class="lineNum"> 573 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 574 </span><span class="lineCov"> 23658 : if (file_a-&gt;mtime_sec &gt; file_b-&gt;mtime_sec)</span>
<span class="lineNum"> 575 </span><span class="lineNoCov"> 0 : return 1;</span>
<span class="lineNum"> 576 </span> :
<span class="lineNum"> 577 </span><span class="lineCov"> 23658 : if (file_a-&gt;mtime_nsec &lt; file_b-&gt;mtime_nsec)</span>
<span class="lineNum"> 578 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 579 </span><span class="lineCov"> 23658 : if (file_a-&gt;mtime_nsec &gt; file_b-&gt;mtime_nsec)</span>
<span class="lineNum"> 580 </span><span class="lineNoCov"> 0 : return 1;</span>
<span class="lineNum"> 581 </span> :
<span class="lineNum"> 582 </span><span class="lineCov"> 23658 : return 0;</span>
<a name="583"><span class="lineNum"> 583 </span> : }</a>
<span class="lineNum"> 584 </span> :
<span class="lineNum"> 585 </span><span class="lineCov"> 23904 : int file_namestamp_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 586 </span> : {
<span class="lineNum"> 587 </span> : int ret;
<span class="lineNum"> 588 </span> :
<span class="lineNum"> 589 </span><span class="lineCov"> 23904 : ret = file_name_compare(void_a, void_b);</span>
<span class="lineNum"> 590 </span><span class="lineCov"> 23904 : if (ret != 0)</span>
<span class="lineNum"> 591 </span><span class="lineCov"> 246 : return ret;</span>
<span class="lineNum"> 592 </span> :
<span class="lineNum"> 593 </span><span class="lineCov"> 23658 : return file_stamp_compare(void_a, void_b);</span>
<a name="594"><span class="lineNum"> 594 </span> : }</a>
<span class="lineNum"> 595 </span> :
<span class="lineNum"> 596 </span><span class="lineNoCov"> 0 : int file_pathstamp_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 597 </span> : {
<span class="lineNum"> 598 </span> : int ret;
<span class="lineNum"> 599 </span> :
<span class="lineNum"> 600 </span><span class="lineNoCov"> 0 : ret = file_path_compare(void_a, void_b);</span>
<span class="lineNum"> 601 </span><span class="lineNoCov"> 0 : if (ret != 0)</span>
<span class="lineNum"> 602 </span><span class="lineNoCov"> 0 : return ret;</span>
<span class="lineNum"> 603 </span> :
<span class="lineNum"> 604 </span><span class="lineNoCov"> 0 : return file_stamp_compare(void_a, void_b);</span>
<a name="605"><span class="lineNum"> 605 </span> : }</a>
<span class="lineNum"> 606 </span> :
<span class="lineNum"> 607 </span><span class="lineCov"> 115744 : struct snapraid_link* link_alloc(const char* sub, const char* linkto, unsigned link_flag)</span>
<span class="lineNum"> 608 </span> : {
<span class="lineNum"> 609 </span> : struct snapraid_link* link;
<span class="lineNum"> 610 </span> :
<span class="lineNum"> 611 </span><span class="lineCov"> 115744 : link = malloc_nofail(sizeof(struct snapraid_link));</span>
<span class="lineNum"> 612 </span><span class="lineCov"> 115744 : link-&gt;sub = strdup_nofail(sub);</span>
<span class="lineNum"> 613 </span><span class="lineCov"> 115744 : link-&gt;linkto = strdup_nofail(linkto);</span>
<span class="lineNum"> 614 </span><span class="lineCov"> 115744 : link-&gt;flag = link_flag;</span>
<span class="lineNum"> 615 </span> :
<span class="lineNum"> 616 </span><span class="lineCov"> 115744 : return link;</span>
<a name="617"><span class="lineNum"> 617 </span> : }</a>
<span class="lineNum"> 618 </span> :
<span class="lineNum"> 619 </span><span class="lineCov"> 110535 : void link_free(struct snapraid_link* link)</span>
<span class="lineNum"> 620 </span> : {
<span class="lineNum"> 621 </span><span class="lineCov"> 110535 : free(link-&gt;sub);</span>
<span class="lineNum"> 622 </span><span class="lineCov"> 110535 : free(link-&gt;linkto);</span>
<span class="lineNum"> 623 </span><span class="lineCov"> 110535 : free(link);</span>
<a name="624"><span class="lineNum"> 624 </span><span class="lineCov"> 110535 : }</span></a>
<span class="lineNum"> 625 </span> :
<span class="lineNum"> 626 </span><span class="lineCov"> 29409 : int link_name_compare_to_arg(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 627 </span> : {
<span class="lineNum"> 628 </span><span class="lineCov"> 29409 : const char* arg = void_arg;</span>
<span class="lineNum"> 629 </span><span class="lineCov"> 29409 : const struct snapraid_link* link = void_data;</span>
<span class="lineNum"> 630 </span> :
<span class="lineNum"> 631 </span><span class="lineCov"> 29409 : return strcmp(arg, link-&gt;sub);</span>
<a name="632"><span class="lineNum"> 632 </span> : }</a>
<span class="lineNum"> 633 </span> :
<span class="lineNum"> 634 </span><span class="lineCov"> 1252 : int link_alpha_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 635 </span> : {
<span class="lineNum"> 636 </span><span class="lineCov"> 1252 : const struct snapraid_link* link_a = void_a;</span>
<span class="lineNum"> 637 </span><span class="lineCov"> 1252 : const struct snapraid_link* link_b = void_b;</span>
<span class="lineNum"> 638 </span> :
<span class="lineNum"> 639 </span><span class="lineCov"> 1252 : return strcmp(link_a-&gt;sub, link_b-&gt;sub);</span>
<a name="640"><span class="lineNum"> 640 </span> : }</a>
<span class="lineNum"> 641 </span> :
<span class="lineNum"> 642 </span><span class="lineCov"> 760 : struct snapraid_dir* dir_alloc(const char* sub)</span>
<span class="lineNum"> 643 </span> : {
<span class="lineNum"> 644 </span> : struct snapraid_dir* dir;
<span class="lineNum"> 645 </span> :
<span class="lineNum"> 646 </span><span class="lineCov"> 760 : dir = malloc_nofail(sizeof(struct snapraid_dir));</span>
<span class="lineNum"> 647 </span><span class="lineCov"> 760 : dir-&gt;sub = strdup_nofail(sub);</span>
<span class="lineNum"> 648 </span><span class="lineCov"> 760 : dir-&gt;flag = 0;</span>
<span class="lineNum"> 649 </span> :
<span class="lineNum"> 650 </span><span class="lineCov"> 760 : return dir;</span>
<a name="651"><span class="lineNum"> 651 </span> : }</a>
<span class="lineNum"> 652 </span> :
<span class="lineNum"> 653 </span><span class="lineCov"> 716 : void dir_free(struct snapraid_dir* dir)</span>
<span class="lineNum"> 654 </span> : {
<span class="lineNum"> 655 </span><span class="lineCov"> 716 : free(dir-&gt;sub);</span>
<span class="lineNum"> 656 </span><span class="lineCov"> 716 : free(dir);</span>
<a name="657"><span class="lineNum"> 657 </span><span class="lineCov"> 716 : }</span></a>
<span class="lineNum"> 658 </span> :
<span class="lineNum"> 659 </span><span class="lineCov"> 209 : int dir_name_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 660 </span> : {
<span class="lineNum"> 661 </span><span class="lineCov"> 209 : const char* arg = void_arg;</span>
<span class="lineNum"> 662 </span><span class="lineCov"> 209 : const struct snapraid_dir* dir = void_data;</span>
<span class="lineNum"> 663 </span> :
<span class="lineNum"> 664 </span><span class="lineCov"> 209 : return strcmp(arg, dir-&gt;sub);</span>
<a name="665"><span class="lineNum"> 665 </span> : }</a>
<span class="lineNum"> 666 </span> :
<span class="lineNum"> 667 </span><span class="lineCov"> 1411 : struct snapraid_disk* disk_alloc(const char* name, const char* dir, uint64_t dev)</span>
<span class="lineNum"> 668 </span> : {
<span class="lineNum"> 669 </span> : struct snapraid_disk* disk;
<span class="lineNum"> 670 </span> :
<span class="lineNum"> 671 </span><span class="lineCov"> 1411 : disk = malloc_nofail(sizeof(struct snapraid_disk));</span>
<span class="lineNum"> 672 </span><span class="lineCov"> 1411 : pathcpy(disk-&gt;name, sizeof(disk-&gt;name), name);</span>
<span class="lineNum"> 673 </span><span class="lineCov"> 1411 : pathimport(disk-&gt;dir, sizeof(disk-&gt;dir), dir);</span>
<span class="lineNum"> 674 </span> :
<span class="lineNum"> 675 </span> : /* ensure that the dir terminate with &quot;/&quot; if it isn't empty */
<span class="lineNum"> 676 </span><span class="lineCov"> 1411 : pathslash(disk-&gt;dir, sizeof(disk-&gt;dir));</span>
<span class="lineNum"> 677 </span> :
<span class="lineNum"> 678 </span><span class="lineCov"> 1411 : disk-&gt;smartctl[0] = 0;</span>
<span class="lineNum"> 679 </span><span class="lineCov"> 1411 : disk-&gt;device = dev;</span>
<span class="lineNum"> 680 </span><span class="lineCov"> 1411 : disk-&gt;tick = 0;</span>
<span class="lineNum"> 681 </span><span class="lineCov"> 1411 : disk-&gt;total_blocks = 0;</span>
<span class="lineNum"> 682 </span><span class="lineCov"> 1411 : disk-&gt;free_blocks = 0;</span>
<span class="lineNum"> 683 </span><span class="lineCov"> 1411 : disk-&gt;first_free_block = 0;</span>
<span class="lineNum"> 684 </span><span class="lineCov"> 1411 : disk-&gt;has_volatile_inodes = 0;</span>
<span class="lineNum"> 685 </span><span class="lineCov"> 1411 : disk-&gt;has_unreliable_physical = 0;</span>
<span class="lineNum"> 686 </span><span class="lineCov"> 1411 : disk-&gt;has_different_uuid = 0;</span>
<span class="lineNum"> 687 </span><span class="lineCov"> 1411 : disk-&gt;has_unsupported_uuid = 0;</span>
<span class="lineNum"> 688 </span><span class="lineCov"> 1411 : disk-&gt;had_empty_uuid = 0;</span>
<span class="lineNum"> 689 </span><span class="lineCov"> 1411 : disk-&gt;mapping_idx = -1;</span>
<span class="lineNum"> 690 </span><span class="lineCov"> 1411 : tommy_list_init(&amp;disk-&gt;filelist);</span>
<span class="lineNum"> 691 </span><span class="lineCov"> 1411 : tommy_list_init(&amp;disk-&gt;deletedlist);</span>
<span class="lineNum"> 692 </span><span class="lineCov"> 1411 : tommy_hashdyn_init(&amp;disk-&gt;inodeset);</span>
<span class="lineNum"> 693 </span><span class="lineCov"> 1411 : tommy_hashdyn_init(&amp;disk-&gt;pathset);</span>
<span class="lineNum"> 694 </span><span class="lineCov"> 1411 : tommy_hashdyn_init(&amp;disk-&gt;stampset);</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 1411 : tommy_list_init(&amp;disk-&gt;linklist);</span>
<span class="lineNum"> 696 </span><span class="lineCov"> 1411 : tommy_hashdyn_init(&amp;disk-&gt;linkset);</span>
<span class="lineNum"> 697 </span><span class="lineCov"> 1411 : tommy_list_init(&amp;disk-&gt;dirlist);</span>
<span class="lineNum"> 698 </span><span class="lineCov"> 1411 : tommy_hashdyn_init(&amp;disk-&gt;dirset);</span>
<span class="lineNum"> 699 </span><span class="lineCov"> 1411 : tommy_arrayblk_init(&amp;disk-&gt;blockarr);</span>
<span class="lineNum"> 700 </span> :
<span class="lineNum"> 701 </span><span class="lineCov"> 1411 : return disk;</span>
<a name="702"><span class="lineNum"> 702 </span> : }</a>
<span class="lineNum"> 703 </span> :
<span class="lineNum"> 704 </span><span class="lineCov"> 1303 : void disk_free(struct snapraid_disk* disk)</span>
<span class="lineNum"> 705 </span> : {
<span class="lineNum"> 706 </span><span class="lineCov"> 1303 : tommy_list_foreach(&amp;disk-&gt;filelist, (tommy_foreach_func*)file_free);</span>
<span class="lineNum"> 707 </span><span class="lineCov"> 1303 : tommy_list_foreach(&amp;disk-&gt;deletedlist, (tommy_foreach_func*)deleted_free);</span>
<span class="lineNum"> 708 </span><span class="lineCov"> 1303 : tommy_hashdyn_done(&amp;disk-&gt;inodeset);</span>
<span class="lineNum"> 709 </span><span class="lineCov"> 1303 : tommy_hashdyn_done(&amp;disk-&gt;pathset);</span>
<span class="lineNum"> 710 </span><span class="lineCov"> 1303 : tommy_hashdyn_done(&amp;disk-&gt;stampset);</span>
<span class="lineNum"> 711 </span><span class="lineCov"> 1303 : tommy_list_foreach(&amp;disk-&gt;linklist, (tommy_foreach_func*)link_free);</span>
<span class="lineNum"> 712 </span><span class="lineCov"> 1303 : tommy_hashdyn_done(&amp;disk-&gt;linkset);</span>
<span class="lineNum"> 713 </span><span class="lineCov"> 1303 : tommy_list_foreach(&amp;disk-&gt;dirlist, (tommy_foreach_func*)dir_free);</span>
<span class="lineNum"> 714 </span><span class="lineCov"> 1303 : tommy_hashdyn_done(&amp;disk-&gt;dirset);</span>
<span class="lineNum"> 715 </span><span class="lineCov"> 1303 : tommy_arrayblk_done(&amp;disk-&gt;blockarr);</span>
<span class="lineNum"> 716 </span><span class="lineCov"> 1303 : free(disk);</span>
<a name="717"><span class="lineNum"> 717 </span><span class="lineCov"> 1303 : }</span></a>
<span class="lineNum"> 718 </span> :
<span class="lineNum"> 719 </span><span class="lineCov"> 720 : int disk_is_empty(struct snapraid_disk* disk, block_off_t blockmax)</span>
<span class="lineNum"> 720 </span> : {
<span class="lineNum"> 721 </span> : block_off_t i;
<span class="lineNum"> 722 </span> :
<span class="lineNum"> 723 </span> : /* if there is an element, it's not empty */
<span class="lineNum"> 724 </span> : /* even if links and dirs have no block allocation */
<span class="lineNum"> 725 </span><span class="lineCov"> 720 : if (!tommy_list_empty(&amp;disk-&gt;filelist))</span>
<span class="lineNum"> 726 </span><span class="lineCov"> 712 : return 0;</span>
<span class="lineNum"> 727 </span><span class="lineCov"> 8 : if (!tommy_list_empty(&amp;disk-&gt;linklist))</span>
<span class="lineNum"> 728 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 729 </span><span class="lineCov"> 8 : if (!tommy_list_empty(&amp;disk-&gt;dirlist))</span>
<span class="lineNum"> 730 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 731 </span> :
<span class="lineNum"> 732 </span> : /* limit the search to the size of the disk */
<span class="lineNum"> 733 </span><span class="lineCov"> 8 : if (blockmax &gt; tommy_arrayblk_size(&amp;disk-&gt;blockarr))</span>
<span class="lineNum"> 734 </span><span class="lineCov"> 2 : blockmax = tommy_arrayblk_size(&amp;disk-&gt;blockarr);</span>
<span class="lineNum"> 735 </span> :
<span class="lineNum"> 736 </span> : /* checks all the blocks to search for deleted ones */
<span class="lineNum"> 737 </span> : /* this search is slow, but it's done only if no file is present */
<span class="lineNum"> 738 </span><span class="lineCov"> 4641 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 739 </span><span class="lineCov"> 4634 : struct snapraid_block* block = tommy_arrayblk_get(&amp;disk-&gt;blockarr, i);</span>
<span class="lineNum"> 740 </span><span class="lineCov"> 4634 : unsigned block_state = block_state_get(block);</span>
<span class="lineNum"> 741 </span> :
<span class="lineNum"> 742 </span><span class="lineCov"> 4634 : switch (block_state) {</span>
<span class="lineNum"> 743 </span> : case BLOCK_STATE_EMPTY :
<span class="lineNum"> 744 </span> : /* empty block are expected for an empty disk */
<span class="lineNum"> 745 </span><span class="lineCov"> 4633 : break;</span>
<span class="lineNum"> 746 </span> : case BLOCK_STATE_DELETED :
<span class="lineNum"> 747 </span> : /* if there is a deleted block, the disk is not empty */
<span class="lineNum"> 748 </span><span class="lineCov"> 1 : return 0;</span>
<span class="lineNum"> 749 </span> : default :
<span class="lineNum"> 750 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 751 </span> : log_fatal(&quot;Internal inconsistency for used block in disk '%s' without files\n&quot;, disk-&gt;name);
<span class="lineNum"> 752 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 753 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 754 </span> : }
<span class="lineNum"> 755 </span> : }
<span class="lineNum"> 756 </span> :
<span class="lineNum"> 757 </span> : /* finally, it's empty */
<span class="lineNum"> 758 </span><span class="lineCov"> 7 : return 1;</span>
<a name="759"><span class="lineNum"> 759 </span> : }</a>
<span class="lineNum"> 760 </span> :
<span class="lineNum"> 761 </span><span class="lineCov"> 1381 : struct snapraid_map* map_alloc(const char* name, unsigned position, block_off_t total_blocks, block_off_t free_blocks, const char* uuid)</span>
<span class="lineNum"> 762 </span> : {
<span class="lineNum"> 763 </span> : struct snapraid_map* map;
<span class="lineNum"> 764 </span> :
<span class="lineNum"> 765 </span><span class="lineCov"> 1381 : map = malloc_nofail(sizeof(struct snapraid_map));</span>
<span class="lineNum"> 766 </span><span class="lineCov"> 1381 : pathcpy(map-&gt;name, sizeof(map-&gt;name), name);</span>
<span class="lineNum"> 767 </span><span class="lineCov"> 1381 : map-&gt;position = position;</span>
<span class="lineNum"> 768 </span><span class="lineCov"> 1381 : map-&gt;total_blocks = total_blocks;</span>
<span class="lineNum"> 769 </span><span class="lineCov"> 1381 : map-&gt;free_blocks = free_blocks;</span>
<span class="lineNum"> 770 </span><span class="lineCov"> 1381 : pathcpy(map-&gt;uuid, sizeof(map-&gt;uuid), uuid);</span>
<span class="lineNum"> 771 </span> :
<span class="lineNum"> 772 </span><span class="lineCov"> 1381 : return map;</span>
<a name="773"><span class="lineNum"> 773 </span> : }</a>
<span class="lineNum"> 774 </span> :
<span class="lineNum"> 775 </span><span class="lineCov"> 1279 : void map_free(struct snapraid_map* map)</span>
<span class="lineNum"> 776 </span> : {
<span class="lineNum"> 777 </span><span class="lineCov"> 1279 : free(map);</span>
<a name="778"><span class="lineNum"> 778 </span><span class="lineCov"> 1279 : }</span></a>
<span class="lineNum"> 779 </span> :
<span class="lineNum"> 780 </span><span class="lineCov"> 665521 : int info_time_compare(const void* void_a, const void* void_b)</span>
<span class="lineNum"> 781 </span> : {
<span class="lineNum"> 782 </span><span class="lineCov"> 665521 : const snapraid_info* info_a = void_a;</span>
<span class="lineNum"> 783 </span><span class="lineCov"> 665521 : const snapraid_info* info_b = void_b;</span>
<span class="lineNum"> 784 </span><span class="lineCov"> 665521 : time_t time_a = info_get_time(*info_a);</span>
<span class="lineNum"> 785 </span><span class="lineCov"> 665521 : time_t time_b = info_get_time(*info_b);</span>
<span class="lineNum"> 786 </span> :
<span class="lineNum"> 787 </span><span class="lineCov"> 665521 : if (time_a &lt; time_b)</span>
<span class="lineNum"> 788 </span><span class="lineCov"> 26639 : return -1;</span>
<span class="lineNum"> 789 </span><span class="lineCov"> 638882 : if (time_a &gt; time_b)</span>
<span class="lineNum"> 790 </span><span class="lineCov"> 160266 : return 1;</span>
<span class="lineNum"> 791 </span><span class="lineCov"> 478616 : return 0;</span>
<span class="lineNum"> 792 </span> : }
<span class="lineNum"> 793 </span> :
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.10</a></td></tr>
</table>
<br>
</body>
</html>