annotate kpathsea/kpsestat.c @ 4303:e15a96673976

[project @ 2003-01-23 03:03:08 by jwe]
author jwe
date Thu, 23 Jan 2003 03:03:08 +0000
parents 1f0b06020e36
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
1 /* kpsestat -- show file permissions of a file in octal form.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
2 Copyright (C) 1997 Olaf Weber.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
3
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
7 any later version.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
8
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
12 GNU General Public License for more details.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
13
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
17
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
18 #include <kpathsea/config.h>
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
19 #include <kpathsea/c-stat.h>
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
20 #include <stdio.h>
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
21 #include <stdlib.h>
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
22
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
23 #ifdef WIN32
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
24 #include <string.h>
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
25 #endif
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
26
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
27 /*
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
28 * kpsestat mode x
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
29 * Print stat bits of file x on stdout, as modified by mode.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
30 */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
31
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
32 int main (argc, argv)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
33 int argc;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
34 char *argv[];
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
35 {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
36 char * mode_string;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
37 int to_set, to_keep, to_clear;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
38 int result;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
39 struct stat f;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
40
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
41 if (argc > 1 && strcmp (argv[1], "--help") == 0) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
42 printf ("Usage: %s MODE FILE\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
43 Print octal permissions of FILE as modified by MODE on standard output.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
44 MODE is a subset of the symbolic permissions accepted by chmod.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
45 Use MODE = to obtain the unchanged permissions.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
46 \n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
47 --help display this help and exit\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
48 --version output version information and exit\n\n", argv[0]);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
49 fputs ("Email bug reports to tex-k@mail.tug.org.\n", stdout);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
50 exit(0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
51 } else if (argc > 1 && strcmp (argv[1], "--version") == 0) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
52 printf ("%s (%s)\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
53 Copyright (C) 1997 Olaf Weber.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
54 There is NO warranty. You may redistribute this software\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
55 under the terms of the GNU General Public License.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
56 For more information about these matters, see the file named COPYING.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
57 Primary author of %s: Olaf Weber.\n",
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
58 argv[0], KPSEVERSION, argv[0]);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
59 exit (0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
60 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
61
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
62 /* insist on exactly two args */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
63 if (argc != 3) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
64 fprintf (stderr, "%s: Need exactly two arguments.\n\
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
65 Try `%s --help' for more information.\n", argv[0], argv[0]);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
66 exit(1);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
67 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
68
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
69 mode_string = argv[1];
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
70 to_set = to_keep = to_clear = 0;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
71 for (;;++mode_string) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
72 int affected = 0;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
73 int action = 0;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
74 int value = 0;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
75
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
76 for (;;++mode_string)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
77 switch (*mode_string) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
78 case 'u': affected |= 04700; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
79 case 'g': affected |= 02070; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
80 case 'o': affected |= 01007; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
81 case 'a': affected |= 07777; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
82 default: goto no_more_affected;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
83 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
84 no_more_affected:
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
85 if (affected == 0)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
86 affected = 07777;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
87 action = *mode_string;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
88 ++mode_string;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
89 for (;;++mode_string)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
90 switch (*mode_string) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
91 case 'r': value |= 00444 & affected; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
92 case 'w': value |= 00222 & affected; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
93 case 'x': value |= 00111 & affected; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
94 case 's': value |= 06000 & affected; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
95 case 't': value |= 01000 & affected; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
96 default: goto no_more_values;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
97 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
98 no_more_values:
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
99 switch (action) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
100 case '-': to_clear |= value; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
101 case '=': to_keep |= value; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
102 case '+': to_set |= value; break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
103 default:
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
104 fprintf(stderr, "%s: Invalid mode\n", argv[0]);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
105 exit(1);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
106 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
107 if (*mode_string != ',')
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
108 break;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
109 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
110 if (*mode_string != 0) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
111 fprintf(stderr, "%s: Invalid mode.\n", argv[0]);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
112 exit(1);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
113 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
114
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
115 /* does the file exist? */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
116 if (stat (argv[2], &f) < 0) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
117 perror(argv[0]);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
118 return 1;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
119 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
120
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
121 result = f.st_mode & ~S_IFMT;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
122 result |= to_set;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
123 result |= to_keep & result;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
124 result &= ~to_clear;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
125
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
126 printf("%o\n", result);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
127
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
128 return 0;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents:
diff changeset
129 }