try to make sure that path-addrs always have <angle brackets>
[unix-history] / usr / src / usr.sbin / eeprom / eeprom.c
CommitLineData
bb377cb4 1/*-
c1c61666
KB
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
bb377cb4
CT
4 *
5 * This software was developed by the Computer Systems Engineering group
6 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7 * contributed to Berkeley.
8 *
9 * All advertising materials mentioning features or use of this software
10 * must display the following acknowledgement:
11 * This product includes software developed by the University of
12 * California, Lawrence Berkeley Laboratory.
13 *
14 * %sccs.include.redist.c%
bb377cb4 15 */
ce00e109
KB
16
17#ifndef lint
c1c61666
KB
18static char copyright[] =
19"@(#) Copyright (c) 1993\n\
20 The Regents of the University of California. All rights reserved.\n";
ce00e109
KB
21#endif /* not lint */
22
bb377cb4 23#ifndef lint
c1c61666 24static char sccsid[] = "@(#)eeprom.c 8.1 (Berkeley) %G%";
ce00e109 25#endif /* not lint */
bb377cb4
CT
26
27/*
28 * eeprom - openprom control utility
29 *
30 * usage:
31 *
32 * eeprom [field] [field=value]
33 */
34
35#include <sys/types.h>
36#include <sys/file.h>
37#include <sys/ioctl.h>
38
39#include <machine/openpromio.h>
40
41#include <errno.h>
42#include <stdio.h>
43#include <stdlib.h>
44#include <string.h>
45
46#include "pathnames.h"
47
48static char openprom[] = _PATH_OPENPROM;
49static char usage[] = "usage: %s [field] [field=value]\n";
50
51int
52main(argc, argv)
53 int argc;
54 char **argv;
55{
56 register char *cp;
57 register int i, op, fd, flags, status;
58 register struct opiocdesc *dp;
59 struct opiocdesc desc;
60 char buf[1024], buf2[sizeof(buf)];
61 char *prog, *name;
62
63 /* Determine simple program name for error messages */
64 if (cp = rindex(argv[0], '/'))
65 prog = cp + 1;
66 else
67 prog = argv[0];
68
69 /* Parse flags */
70 opterr = 0;
71 while ((op = getopt(argc, argv, "")) != EOF)
72 switch (op) {
73
74 default:
75 (void) fprintf(stderr, usage, prog);
76 exit(1);
77 }
78
79 argc -= optind;
80 argv += optind;
81
82 /* Determine flags and open device */
83 flags = O_RDONLY;
84 for (i = 0; i < argc; ++i)
85 if (index(argv[i], '=') != NULL) {
86 flags = O_RDWR;
87 break;
88 }
89 if ((fd = open(openprom, flags, 0)) < 0) {
90 fprintf(stderr, "%s: open %s: %s\n",
91 prog, openprom, strerror(errno));
92 exit(1);
93 }
94
95 dp = &desc;
96 bzero(dp, sizeof(*dp));
97 if (ioctl(fd, OPIOCGETOPTNODE, &dp->op_nodeid) < 0) {
98 fprintf(stderr, "%s: get optionsnode: %s\n",
99 prog, strerror(errno));
100 exit(1);
101 }
102
103 if (argc <= 0) {
104 /* Prime the pump with a zero length name */
105 dp->op_name = buf;
106 dp->op_name[0] = '\0';
107 dp->op_namelen = 0;
108 dp->op_buf = buf2;
109 for (;;) {
110 /* Get the next property name */
111 dp->op_buflen = sizeof(buf);
112 if (ioctl(fd, OPIOCNEXTPROP, dp) < 0) {
113 fprintf(stderr, "%s: get next: %s\n",
114 prog, strerror(errno));
115 exit(1);
116 }
117
118 /* Zero length name means we're done */
119 if (dp->op_buflen <= 0)
120 break;
121
122 /* Clever hack, swap buffers */
123 cp = dp->op_buf;
124 dp->op_buf = dp->op_name;
125 dp->op_name = cp;
126 dp->op_namelen = dp->op_buflen;
127
128 /* Get the value */
129 dp->op_buflen = sizeof(buf);
130 if (ioctl(fd, OPIOCGET, dp) < 0) {
131 fprintf(stderr, "%s: get \"%s\": %s\n",
132 prog, cp, strerror(errno));
133 exit(1);
134 }
135 printf("%.*s=%.*s\n", dp->op_namelen, dp->op_name,
136 dp->op_buflen, dp->op_buf);
137 }
138 exit(0);
139 }
140
141 status = 0;
142 for (i = 0; i < argc; ++i) {
143 dp->op_name = name = argv[i];
144 cp = index(name, '=');
145 if (cp) {
146 *cp++ = '\0';
147 dp->op_buf = cp;
148 dp->op_buflen = strlen(dp->op_buf);
149 } else {
150 dp->op_buf = buf;
151 dp->op_buflen = sizeof(buf);
152 }
153 dp->op_namelen = strlen(name);
154 if (ioctl(fd, cp ? OPIOCSET : OPIOCGET, dp) < 0) {
155 fprintf(stderr, "%s: %s \"%s\": %s\n",
156 prog, cp ? "set" : "get", name, strerror(errno));
157 status |= 1;
158 continue;
159 }
160
161 /* If setting an entry, we're done */
162 if (cp)
163 continue;
164 if (dp->op_buflen < 0) {
165 fprintf(stderr, "%s: \"%s\" not found\n", prog, name);
166 status |= 1;
167 continue;
168 }
169 if (dp->op_buflen >= sizeof(buf)) {
170 fprintf(stderr, "%s: \"%s\" truncated\n", prog, name);
171 status |= 1;
172 /* fall thorugh and print truncated value */
173 }
174 printf("%s=%.*s\n", name, dp->op_buflen, buf);
175 }
176
177 exit(status);
178}