]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/global/lib/test.c
This commit was generated by cvs2svn to compensate for changes in r48743,
[FreeBSD/FreeBSD.git] / contrib / global / lib / test.c
1 /*
2  * Copyright (c) 1996, 1997, 1998 Shigio Yamaguchi. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  * 3. All advertising materials mentioning features or use of this software
13  *    must display the following acknowledgement:
14  *      This product includes software developed by Shigio Yamaguchi.
15  * 4. Neither the name of the author nor the names of any co-contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *      test.c                                   12-Dec-97
32  *
33  */
34 #include <sys/types.h>
35 #include <sys/stat.h>
36
37 #include <unistd.h>
38
39 #include "test.h"
40
41 /*
42  * test: 
43  *
44  *      i)      flags   file flags
45  *
46  *                      "f"     [ -f path ]
47  *                      "d"     [ -d path ]
48  *                      "r"     [ -r path ]
49  *                      "w"     [ -w path ]
50  *                      "x"     [ -x path ]
51  *
52  *      i)      path    path
53  *                      if NULL then previous path.
54  *      r)              0: no, 1: ok
55  *
56  * You can specify more than one character. It assumed 'and' test.
57  */
58 int
59 test(flags, path)
60 const char *flags;
61 const char *path;
62 {
63         static struct stat sb;
64         int     c;
65
66         if (path != NULL)
67                 if (stat(path, &sb) < 0)
68                         return 0;
69         while ((c = *flags++) != 0) {
70                 switch (c) {
71                 case 'f':
72                         if (!S_ISREG(sb.st_mode))
73                                 return 0;
74                         break;
75                 case 'd':
76                         if (!S_ISDIR(sb.st_mode))
77                                 return 0;
78                         break;
79                 case 'r':
80                         if (access(path, R_OK) < 0)
81                                 return 0;
82                         break;
83                 case 'w':
84                         if (access(path, W_OK) < 0)
85                                 return 0;
86                         break;
87                 case 'x':
88                         if (access(path, X_OK) < 0)
89                                 return 0;
90                         break;
91                 default:
92                         break;
93                 }
94         }
95         return 1;
96 }