| GCC Code Coverage Report | |||||||||||||||||||||
        
  | 
    |||||||||||||||||||||
| Line | Branch | Exec | Source | 
1  | 
    /* $OpenBSD: mtree.c,v 1.24 2015/12/20 19:53:24 benno Exp $ */  | 
    ||
2  | 
    /* $NetBSD: mtree.c,v 1.7 1996/09/05 23:29:22 thorpej Exp $ */  | 
    ||
3  | 
    |||
4  | 
    /*-  | 
    ||
5  | 
    * Copyright (c) 1989, 1990, 1993  | 
    ||
6  | 
    * The Regents of the University of California. All rights reserved.  | 
    ||
7  | 
    *  | 
    ||
8  | 
    * Redistribution and use in source and binary forms, with or without  | 
    ||
9  | 
    * modification, are permitted provided that the following conditions  | 
    ||
10  | 
    * are met:  | 
    ||
11  | 
    * 1. Redistributions of source code must retain the above copyright  | 
    ||
12  | 
    * notice, this list of conditions and the following disclaimer.  | 
    ||
13  | 
    * 2. Redistributions in binary form must reproduce the above copyright  | 
    ||
14  | 
    * notice, this list of conditions and the following disclaimer in the  | 
    ||
15  | 
    * documentation and/or other materials provided with the distribution.  | 
    ||
16  | 
    * 3. Neither the name of the University nor the names of its contributors  | 
    ||
17  | 
    * may be used to endorse or promote products derived from this software  | 
    ||
18  | 
    * without specific prior written permission.  | 
    ||
19  | 
    *  | 
    ||
20  | 
    * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND  | 
    ||
21  | 
    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | 
    ||
22  | 
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | 
    ||
23  | 
    * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE  | 
    ||
24  | 
    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | 
    ||
25  | 
    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | 
    ||
26  | 
    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | 
    ||
27  | 
    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | 
    ||
28  | 
    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | 
    ||
29  | 
    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | 
    ||
30  | 
    * SUCH DAMAGE.  | 
    ||
31  | 
    */  | 
    ||
32  | 
    |||
33  | 
    #include <sys/stat.h>  | 
    ||
34  | 
    #include <err.h>  | 
    ||
35  | 
    #include <errno.h>  | 
    ||
36  | 
    #include <unistd.h>  | 
    ||
37  | 
    #include <stdio.h>  | 
    ||
38  | 
    #include <limits.h>  | 
    ||
39  | 
    #include <fts.h>  | 
    ||
40  | 
    #include "mtree.h"  | 
    ||
41  | 
    #include "extern.h"  | 
    ||
42  | 
    |||
43  | 
    extern u_int32_t crc_total;  | 
    ||
44  | 
    |||
45  | 
    int ftsoptions = FTS_PHYSICAL;  | 
    ||
46  | 
    int cflag, dflag, eflag, iflag, lflag, nflag, qflag, rflag, sflag, tflag,  | 
    ||
47  | 
    uflag, Uflag;  | 
    ||
48  | 
    u_int keys;  | 
    ||
49  | 
    char fullpath[PATH_MAX];  | 
    ||
50  | 
    |||
51  | 
    static void usage(void);  | 
    ||
52  | 
    |||
53  | 
    int  | 
    ||
54  | 
    main(int argc, char *argv[])  | 
    ||
55  | 
    { | 
    ||
56  | 
    extern int optind;  | 
    ||
57  | 
    extern char *optarg;  | 
    ||
58  | 
    int ch;  | 
    ||
59  | 
    20  | 
    char *dir, *p;  | 
    |
60  | 
    int status;  | 
    ||
61  | 
    |||
62  | 
    dir = NULL;  | 
    ||
63  | 
    10  | 
    keys = KEYDEFAULT;  | 
    |
64  | 
    ✓✓ | 57  | 
    while ((ch = getopt(argc, argv, "cdef:iK:k:lnp:qrs:tUux")) != -1)  | 
    
65  | 
    ✗✓✓✓ ✗✗✗✓ ✗✓✓✗ ✗✗✓✗ ✗✗  | 
    37  | 
    		switch(ch) { | 
    
66  | 
    case 'c':  | 
    ||
67  | 
    cflag = 1;  | 
    ||
68  | 
    break;  | 
    ||
69  | 
    case 'd':  | 
    ||
70  | 
    2  | 
    dflag = 1;  | 
    |
71  | 
    2  | 
    break;  | 
    |
72  | 
    case 'e':  | 
    ||
73  | 
    10  | 
    eflag = 1;  | 
    |
74  | 
    10  | 
    break;  | 
    |
75  | 
    case 'f':  | 
    ||
76  | 
    ✓✗ | 10  | 
    if (!(freopen(optarg, "r", stdin)))  | 
    
77  | 
    				error("%s: %s", optarg, strerror(errno)); | 
    ||
78  | 
    break;  | 
    ||
79  | 
    case 'i':  | 
    ||
80  | 
    iflag = 1;  | 
    ||
81  | 
    break;  | 
    ||
82  | 
    case 'K':  | 
    ||
83  | 
    while ((p = strsep(&optarg, " \t,")) != NULL)  | 
    ||
84  | 
    if (*p != '\0')  | 
    ||
85  | 
    keys |= parsekey(p, NULL);  | 
    ||
86  | 
    break;  | 
    ||
87  | 
    case 'k':  | 
    ||
88  | 
    keys = F_TYPE;  | 
    ||
89  | 
    while ((p = strsep(&optarg, " \t,")) != NULL)  | 
    ||
90  | 
    if (*p != '\0')  | 
    ||
91  | 
    keys |= parsekey(p, NULL);  | 
    ||
92  | 
    break;  | 
    ||
93  | 
    case 'l':  | 
    ||
94  | 
    1  | 
    lflag = 1;  | 
    |
95  | 
    1  | 
    break;  | 
    |
96  | 
    case 'n':  | 
    ||
97  | 
    nflag = 1;  | 
    ||
98  | 
    break;  | 
    ||
99  | 
    case 'p':  | 
    ||
100  | 
    10  | 
    dir = optarg;  | 
    |
101  | 
    10  | 
    break;  | 
    |
102  | 
    case 'q':  | 
    ||
103  | 
    2  | 
    qflag = 1;  | 
    |
104  | 
    2  | 
    break;  | 
    |
105  | 
    case 'r':  | 
    ||
106  | 
    rflag = 1;  | 
    ||
107  | 
    break;  | 
    ||
108  | 
    case 's':  | 
    ||
109  | 
    sflag = 1;  | 
    ||
110  | 
    crc_total = ~strtol(optarg, &p, 0);  | 
    ||
111  | 
    if (*p)  | 
    ||
112  | 
    				error("illegal seed value -- %s", optarg); | 
    ||
113  | 
    break;  | 
    ||
114  | 
    case 't':  | 
    ||
115  | 
    tflag = 1;  | 
    ||
116  | 
    break;  | 
    ||
117  | 
    case 'U':  | 
    ||
118  | 
    2  | 
    Uflag = 1;  | 
    |
119  | 
    2  | 
    uflag = 1;  | 
    |
120  | 
    2  | 
    break;  | 
    |
121  | 
    case 'u':  | 
    ||
122  | 
    uflag = 1;  | 
    ||
123  | 
    break;  | 
    ||
124  | 
    case 'x':  | 
    ||
125  | 
    ftsoptions |= FTS_XDEV;  | 
    ||
126  | 
    break;  | 
    ||
127  | 
    case '?':  | 
    ||
128  | 
    default:  | 
    ||
129  | 
    usage();  | 
    ||
130  | 
    }  | 
    ||
131  | 
    10  | 
    argc -= optind;  | 
    |
132  | 
    10  | 
    argv += optind;  | 
    |
133  | 
    |||
134  | 
    ✗✓ | 10  | 
    if (argc)  | 
    
135  | 
    usage();  | 
    ||
136  | 
    |||
137  | 
    /*  | 
    ||
138  | 
    * If uflag is set we can't make any pledges because we must be able  | 
    ||
139  | 
    * to chown and place setugid bits. Make sure that we're pledged  | 
    ||
140  | 
    * when -c was specified.  | 
    ||
141  | 
    */  | 
    ||
142  | 
    ✓✓ | 10  | 
    	if (!uflag || cflag) { | 
    
143  | 
    ✗✓ | 8  | 
    		if (rflag && tflag) { | 
    
144  | 
    			if (pledge("stdio rpath cpath getpw fattr flock wpath", NULL) == -1) | 
    ||
145  | 
    err(1, "pledge");  | 
    ||
146  | 
    ✗✓ | 8  | 
    		} else if (rflag && !tflag) { | 
    
147  | 
    			if (pledge("stdio rpath cpath getpw flock wpath", NULL) == -1) | 
    ||
148  | 
    err(1, "pledge");  | 
    ||
149  | 
    ✗✓ | 8  | 
    		} else if (!rflag && tflag) { | 
    
150  | 
    			if (pledge("stdio rpath getpw fattr flock cpath wpath", NULL) == -1) | 
    ||
151  | 
    err(1, "pledge");  | 
    ||
152  | 
    		} else { | 
    ||
153  | 
    ✗✓ | 8  | 
    			if (pledge("stdio rpath getpw flock cpath wpath", NULL) == -1) | 
    
154  | 
    err(1, "pledge");  | 
    ||
155  | 
    }  | 
    ||
156  | 
    }  | 
    ||
157  | 
    |||
158  | 
    ✓✗✗✓ | 
    20  | 
    if (dir && chdir(dir))  | 
    
159  | 
    		error("%s: %s", dir, strerror(errno)); | 
    ||
160  | 
    |||
161  | 
    ✗✓✗✗ | 
    10  | 
    if ((cflag || sflag) && !getcwd(fullpath, sizeof fullpath))  | 
    
162  | 
    		error("getcwd: %s", strerror(errno)); | 
    ||
163  | 
    |||
164  | 
    ✗✓ | 10  | 
    if (lflag == 1 && uflag == 1)  | 
    
165  | 
    		error("-l and -u flags are mutually exclusive"); | 
    ||
166  | 
    |||
167  | 
    ✗✓ | 10  | 
    	if (cflag) { | 
    
168  | 
    cwalk();  | 
    ||
169  | 
    exit(0);  | 
    ||
170  | 
    }  | 
    ||
171  | 
    status = verify();  | 
    ||
172  | 
    if (Uflag && (status == MISMATCHEXIT))  | 
    ||
173  | 
    status = 0;  | 
    ||
174  | 
    exit(status);  | 
    ||
175  | 
    }  | 
    ||
176  | 
    |||
177  | 
    static void  | 
    ||
178  | 
    usage(void)  | 
    ||
179  | 
    { | 
    ||
180  | 
    (void)fprintf(stderr,  | 
    ||
181  | 
    "usage: mtree [-cdeilnqrtUux] [-f spec] [-K keywords] "  | 
    ||
182  | 
    "[-k keywords] [-p path]\n"  | 
    ||
183  | 
    " [-s seed]\n");  | 
    ||
184  | 
    exit(1);  | 
    ||
185  | 
    }  | 
    
| Generated by: GCOVR (Version 3.3) |