|
|
1.1 root 1: #define _DDI_DKI 1
2: #define _SYSV4 1
3:
4: /*
5: * This program performs some simple processing on a device master-file,
6: * mdevice (4) as specified in the "System File and Devices Reference
7: * Manual" for Unix System V, Release 4.
8: *
9: * The first part of the program inhales the 'mdevice' file. Other processing
10: * is dependent on the internal details of the character-device interface
11: * used by Coherent - our aim is to supply details for a mapping layer that
12: * converts the Coherent device system calling format.
13: */
14: /*
15: *-IMPORTS:
16: * <sys/compat.h>
17: * CONST
18: * PROTO
19: * ARGS ()
20: * LOCAL
21: * <stdlib.h>
22: * EXIT_SUCCESS
23: * EXIT_FAILURE
24: * NULL
25: * free ()
26: * malloc ()
27: * <unistd.h>
28: * STDERR_FILENO
29: * "mdev.h"
30: * read_mdev_file ()
31: * "sdev.h"
32: * read_sdev_file ()
33: * "symbol.h"
34: * symbol_init ()
35: * "assign.h"
36: * assign_imajors ()
37: * "mkconf.c"
38: * write_conf_c ()
39: */
40:
41: #include <sys/compat.h>
42: #include <stdlib.h>
43: #include <unistd.h>
44: #include <stdio.h>
45: #include <string.h>
46: #include <errno.h>
47:
48: #include "mdev.h"
49: #include "sdev.h"
50: #include "mtune.h"
51: #include "stune.h"
52: #include "symbol.h"
53: #include "assign.h"
54: #include "mkconf.h"
55: #include "ehand.h"
56:
57: /*
58: * Some ancient systems do not define EXIT_SUCCESS or EXIT_FAILURE.
59: */
60:
61: #ifndef EXIT_SUCCESS
62: #define EXIT_SUCCESS 0
63: #define EXIT_FAILURE 1
64: #endif
65:
66:
67: LOCAL int _report_mode = 0;
68:
69: /*
70: * Test whether we are in report mode or not.
71: */
72:
73: #if USE_PROTO
74: int (report_mode) (void)
75: #else
76: int
77: report_mode ARGS (())
78: #endif
79: {
80: return _report_mode;
81: }
82:
83:
84: /*
85: * For some applications, we need to be able to report conflicts in a special
86: * way. By convention, "item1" is something new and "item2" is the old item
87: * that it conflicts with.
88: */
89:
90: #if USE_PROTO
91: void (report_conflict) (CONST unsigned char * item1,
92: CONST unsigned char * item2, CONST char * msg)
93: #else
94: void
95: report_conflict ARGS ((item1, item2, msg))
96: CONST unsigned char * item1;
97: CONST unsigned char * item2;
98: CONST char * msg;
99: #endif
100: {
101: if (_report_mode)
102: fprintf (stdout, "%s ", item2);
103: else
104: fprintf (stderr, "%s: %s with %s\n", item1, msg, item2);
105: }
106:
107: #if TRACE
108: /*
109: * If some modules have been compiled with debugging on, this enables that
110: * debugging output with -V
111: */
112:
113: int do_debug;
114: #endif
115:
116:
117: #if USE_PROTO
118: void usage (void)
119: #else
120: void
121: usage ()
122: #endif
123: {
124: static char usage_msg [] = {
125: "Usage:\t-d\t\tGenerate device configuration tables and makefiles\n"
126: "\t-t\t\tGenerate tunable parameter tables\n"
127: "\t-M mdevice\tSet a line in \"mdevice\" to the values in the argument\n"
128: "\t-S sdevice\tSet a line in \"sdevice\" to the values in the argument\n"
129: "\t-m mtune\tSet a line in \"mtune\" to the values in the argument\n"
130: "\t-s stune\tSet a line in \"stune\" to the values in the argument\n"
131: "\t-W\t\tWrite out changed files\n"
132: "\t-r\t\tReport conflicts caused by proposed changes\n"
133: "\t-I dir\t\tDirectory where files are located\n"
134: };
135:
136: write (STDERR_FILENO, usage_msg, sizeof (usage_msg) - 1);
137: }
138:
139:
140: #if USE_PROTO
141: int main (int argc, char * argv [])
142: #else
143: int
144: main (argc, argv)
145: int argc;
146: char * argv [];
147: #endif
148: {
149: extinfo_t * extinfop;
150: int do_devices = 0;
151: int do_tune = 0;
152: int need_mdev = 0;
153: int need_sdev = 0;
154: int need_mtune = 0;
155: int need_stune = 0;
156: int write_changes = 0;
157: mdev_t * mdev_changes = NULL;
158: sdev_t * sdev_changes = NULL;
159: mtune_t * mtune_changes = NULL;
160: stune_t * stune_changes = NULL;
161: int i;
162:
163: symbol_init ();
164:
165: if (argc == 1) {
166:
167: usage ();
168: return EXIT_FAILURE;
169: }
170:
171: for (i = 1 ; i < argc ; i ++) {
172: int switches;
173: int j;
174:
175: if (argv [i][0] != '-') {
176: usage ();
177: return EXIT_FAILURE;
178: }
179:
180: switches = strlen (argv [i]);
181:
182: for (j = 1 ; j < switches ; j ++) {
183: char * string_arg;
184: int next_arg;
185:
186: if (argv [i][j + 1] == 0)
187: string_arg = argv [next_arg = i + 1];
188: else
189: string_arg = & argv [next_arg = i][j + 1];
190:
191:
192: switch (argv [i][j]) {
193:
194: case 'd':
195: do_devices ++;
196: need_mdev ++;
197: need_sdev ++;
198: break;
199:
200: case 't':
201: do_tune ++;
202: need_mtune ++;
203: need_stune ++;
204: break;
205:
206: #if TRACE
207: case 'V':
208: do_debug ++;
209: need_mdev ++;
210: need_sdev ++;
211: need_mtune ++;
212: need_stune ++;
213: break;
214: #endif
215:
216: case 'M':
217: read_mdev_string (string_arg, & mdev_changes);
218: need_mdev ++;
219: switches = 0;
220: break;
221:
222: case 'S':
223: read_sdev_string (string_arg, & sdev_changes);
224: need_mdev ++;
225: need_sdev ++;
226: switches = 0;
227: break;
228:
229: case 'm':
230: read_mtune_string (string_arg,
231: & mtune_changes);
232: need_mtune ++;
233: switches = 0;
234: break;
235:
236: case 's':
237: read_stune_string (string_arg,
238: & stune_changes);
239: need_mtune ++;
240: need_stune ++;
241: switches = 0;
242: break;
243:
244: case 'I':
245: if (chdir (string_arg) == 0) {
246: switches = 0;
247: break;
248: }
249:
250: throw_error ("Cannot change directory to %s, "
251: "OS says %s", string_arg,
252: strerror (errno));
253: return EXIT_FAILURE;
254:
255: case 'W':
256: write_changes ++;
257: break;
258:
259: case 'r':
260: _report_mode ++;
261: break;
262:
263: default:
264: usage ();
265: return EXIT_FAILURE;
266: }
267:
268: if (switches == 0) {
269: i = next_arg;
270: break;
271: }
272: }
273: }
274:
275: if (need_mdev) {
276: need_mdev = mdev_changes != NULL && write_changes;
277: read_mdev_file ("mdevice", need_mdev ? "mdevice.new" : NULL,
278: & mdev_changes);
279: }
280: if (need_sdev) {
281: need_sdev = sdev_changes != NULL && write_changes;
282: read_sdev_file ("sdevice", need_sdev ? "sdevice.new" : NULL,
283: & sdev_changes);
284: }
285: if (need_mtune) {
286: need_mtune = mtune_changes != NULL && write_changes;
287: read_mtune_file ("mtune", need_mtune ? "mtune.new" : NULL,
288: & mtune_changes);
289: }
290: if (need_stune) {
291: need_stune = stune_changes != NULL && write_changes;
292: read_stune_file ("stune", need_stune ? "stune.new" : NULL,
293: & stune_changes);
294: }
295:
296: if (do_devices) {
297: if ((extinfop = assign_imajors ()) != NULL) {
298:
299: write_conf_c ("conf.c", extinfop);
300: free (extinfop);
301: }
302:
303: write_link ("drvbld.mak", "template.mak");
304: }
305:
306: if (do_tune)
307: write_conf_h ("conf.h");
308:
309: if (need_mdev) {
310: remove ("mdevice.old");
311: if (rename ("mdevice", "mdevice.old") != 0 ||
312: rename ("mdevice.new", "mdevice") != 0)
313: throw_error ("Unable to update 'mdevice' file with "
314: "new entries, OS says %s",
315: strerror (errno));
316: }
317: if (need_sdev) {
318: remove ("sdevice.old");
319: if (rename ("sdevice", "sdevice.old") != 0 ||
320: rename ("sdevice.new", "sdevice") != 0)
321: throw_error ("Unable to update 'sdevice' file with "
322: "new entries, OS says %s",
323: strerror (errno));
324: }
325: if (need_mtune) {
326: remove ("mtune.old");
327: if (rename ("mtune", "mtune.old") != 0 ||
328: rename ("mtune.new", "mtune") != 0)
329: throw_error ("Unable to update 'mtune' file with "
330: "new entries, OS says %s",
331: strerror (errno));
332: }
333: if (need_stune) {
334: remove ("stune.old");
335: if (rename ("stune", "stune.old") != 0 ||
336: rename ("stune.new", "stune") != 0)
337: throw_error ("Unable to update 'stune' file with "
338: "new entries, OS says %s",
339: strerror (errno));
340: }
341: return EXIT_SUCCESS;
342: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.