Deleted Added
full compact
chio.c (79253) chio.c (90107)
1/* $NetBSD: chio.c,v 1.6 1998/01/04 23:53:58 thorpej Exp $ */
2/*
3 * Copyright (c) 1996 Jason R. Thorpe <thorpej@and.com>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 25 unchanged lines hidden (view full) ---

34 * Additional Copyright (c) 1997, by Matthew Jacob, for NASA/Ames Research Ctr.
35 * Addidional Copyright (c) 2000, by C. Stephen Gunn, Waterspout Communications
36 */
37
38#ifndef lint
39static const char copyright[] =
40 "@(#) Copyright (c) 1996 Jason R. Thorpe. All rights reserved.";
41static const char rcsid[] =
1/* $NetBSD: chio.c,v 1.6 1998/01/04 23:53:58 thorpej Exp $ */
2/*
3 * Copyright (c) 1996 Jason R. Thorpe <thorpej@and.com>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 25 unchanged lines hidden (view full) ---

34 * Additional Copyright (c) 1997, by Matthew Jacob, for NASA/Ames Research Ctr.
35 * Addidional Copyright (c) 2000, by C. Stephen Gunn, Waterspout Communications
36 */
37
38#ifndef lint
39static const char copyright[] =
40 "@(#) Copyright (c) 1996 Jason R. Thorpe. All rights reserved.";
41static const char rcsid[] =
42 "$FreeBSD: head/bin/chio/chio.c 79253 2001-07-04 21:35:15Z mikeh $";
42 "$FreeBSD: head/bin/chio/chio.c 90107 2002-02-02 06:15:22Z imp $";
43#endif /* not lint */
44
45#include <sys/param.h>
46#include <sys/chio.h>
47#include <err.h>
48#include <fcntl.h>
49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <unistd.h>
53
54#include "defs.h"
55#include "pathnames.h"
56
57extern char *__progname; /* from crt0.o */
58
43#endif /* not lint */
44
45#include <sys/param.h>
46#include <sys/chio.h>
47#include <err.h>
48#include <fcntl.h>
49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <unistd.h>
53
54#include "defs.h"
55#include "pathnames.h"
56
57extern char *__progname; /* from crt0.o */
58
59static void usage __P((void));
60static void cleanup __P((void));
61static int parse_element_type __P((char *));
62static int parse_element_unit __P((char *));
63static const char * element_type_name __P((int et));
64static int parse_special __P((char *));
65static int is_special __P((char *));
66static const char *bits_to_string __P((ces_status_flags, const char *));
59static void usage(void);
60static void cleanup(void);
61static int parse_element_type(char *);
62static int parse_element_unit(char *);
63static const char * element_type_name(int et);
64static int parse_special(char *);
65static int is_special(char *);
66static const char *bits_to_string(ces_status_flags, const char *);
67
67
68static void find_element __P((char *, u_int16_t *, u_int16_t *));
68static void find_element(char *, u_int16_t *, u_int16_t *);
69static struct changer_element_status *get_element_status
69static struct changer_element_status *get_element_status
70 __P((unsigned int, unsigned int));
70 (unsigned int, unsigned int);
71
71
72static int do_move __P((const char *, int, char **));
73static int do_exchange __P((const char *, int, char **));
74static int do_position __P((const char *, int, char **));
75static int do_params __P((const char *, int, char **));
76static int do_getpicker __P((const char *, int, char **));
77static int do_setpicker __P((const char *, int, char **));
78static int do_status __P((const char *, int, char **));
79static int do_ielem __P((const char *, int, char **));
80static int do_return __P((const char *, int, char **));
81static int do_voltag __P((const char *, int, char **));
72static int do_move(const char *, int, char **);
73static int do_exchange(const char *, int, char **);
74static int do_position(const char *, int, char **);
75static int do_params(const char *, int, char **);
76static int do_getpicker(const char *, int, char **);
77static int do_setpicker(const char *, int, char **);
78static int do_status(const char *, int, char **);
79static int do_ielem(const char *, int, char **);
80static int do_return(const char *, int, char **);
81static int do_voltag(const char *, int, char **);
82
83#ifndef CHET_VT
84#define CHET_VT 10 /* Completely Arbitrary */
85#endif
86
87/* Valid changer element types. */
88const struct element_type elements[] = {
89 { "drive", CHET_DT },

--- 26 unchanged lines hidden (view full) ---

116 { "inv2", SW_INVERT2 },
117 { NULL, 0 },
118};
119
120static int changer_fd;
121static const char *changer_name;
122
123int
82
83#ifndef CHET_VT
84#define CHET_VT 10 /* Completely Arbitrary */
85#endif
86
87/* Valid changer element types. */
88const struct element_type elements[] = {
89 { "drive", CHET_DT },

--- 26 unchanged lines hidden (view full) ---

116 { "inv2", SW_INVERT2 },
117 { NULL, 0 },
118};
119
120static int changer_fd;
121static const char *changer_name;
122
123int
124main(argc, argv)
125 int argc;
126 char **argv;
124main(int argc, char **argv)
127{
128 int ch, i;
129
130 while ((ch = getopt(argc, argv, "f:")) != -1) {
131 switch (ch) {
132 case 'f':
133 changer_name = optarg;
134 break;

--- 36 unchanged lines hidden (view full) ---

171 if (commands[i].cc_name == NULL)
172 errx(1, "unknown command: %s", *argv);
173
174 exit ((*commands[i].cc_handler)(commands[i].cc_name, argc, argv));
175 /* NOTREACHED */
176}
177
178static int
125{
126 int ch, i;
127
128 while ((ch = getopt(argc, argv, "f:")) != -1) {
129 switch (ch) {
130 case 'f':
131 changer_name = optarg;
132 break;

--- 36 unchanged lines hidden (view full) ---

169 if (commands[i].cc_name == NULL)
170 errx(1, "unknown command: %s", *argv);
171
172 exit ((*commands[i].cc_handler)(commands[i].cc_name, argc, argv));
173 /* NOTREACHED */
174}
175
176static int
179do_move(cname, argc, argv)
180 const char *cname;
181 int argc;
182 char **argv;
177do_move(const char *cname, int argc, char **argv)
183{
184 struct changer_move cmd;
185 int val;
186
187 /*
188 * On a move command, we expect the following:
189 *
190 * <from ET> <from EU> <to ET> <to EU> [inv]

--- 61 unchanged lines hidden (view full) ---

252
253 usage:
254 (void) fprintf(stderr, "usage: %s %s "
255 "<from ET> <from EU> <to ET> <to EU> [inv]\n", __progname, cname);
256 return (1);
257}
258
259static int
178{
179 struct changer_move cmd;
180 int val;
181
182 /*
183 * On a move command, we expect the following:
184 *
185 * <from ET> <from EU> <to ET> <to EU> [inv]

--- 61 unchanged lines hidden (view full) ---

247
248 usage:
249 (void) fprintf(stderr, "usage: %s %s "
250 "<from ET> <from EU> <to ET> <to EU> [inv]\n", __progname, cname);
251 return (1);
252}
253
254static int
260do_exchange(cname, argc, argv)
261 const char *cname;
262 int argc;
263 char **argv;
255do_exchange(const char *cname, int argc, char **argv)
264{
265 struct changer_exchange cmd;
266 int val;
267
268 /*
269 * On an exchange command, we expect the following:
270 *
271 * <src ET> <src EU> <dst1 ET> <dst1 EU> [<dst2 ET> <dst2 EU>] [inv1] [inv2]

--- 92 unchanged lines hidden (view full) ---

364 (void) fprintf(stderr,
365 "usage: %s %s <src ET> <src EU> <dst1 ET> <dst1 EU>\n"
366 " [<dst2 ET> <dst2 EU>] [inv1] [inv2]\n",
367 __progname, cname);
368 return (1);
369}
370
371static int
256{
257 struct changer_exchange cmd;
258 int val;
259
260 /*
261 * On an exchange command, we expect the following:
262 *
263 * <src ET> <src EU> <dst1 ET> <dst1 EU> [<dst2 ET> <dst2 EU>] [inv1] [inv2]

--- 92 unchanged lines hidden (view full) ---

356 (void) fprintf(stderr,
357 "usage: %s %s <src ET> <src EU> <dst1 ET> <dst1 EU>\n"
358 " [<dst2 ET> <dst2 EU>] [inv1] [inv2]\n",
359 __progname, cname);
360 return (1);
361}
362
363static int
372do_position(cname, argc, argv)
373 const char *cname;
374 int argc;
375 char **argv;
364do_position(const char *cname, int argc, char **argv)
376{
377 struct changer_position cmd;
378 int val;
379
380 /*
381 * On a position command, we expect the following:
382 *
383 * <to ET> <to EU> [inv]

--- 44 unchanged lines hidden (view full) ---

428 usage:
429 (void) fprintf(stderr, "usage: %s %s <to ET> <to EU> [inv]\n",
430 __progname, cname);
431 return (1);
432}
433
434/* ARGSUSED */
435static int
365{
366 struct changer_position cmd;
367 int val;
368
369 /*
370 * On a position command, we expect the following:
371 *
372 * <to ET> <to EU> [inv]

--- 44 unchanged lines hidden (view full) ---

417 usage:
418 (void) fprintf(stderr, "usage: %s %s <to ET> <to EU> [inv]\n",
419 __progname, cname);
420 return (1);
421}
422
423/* ARGSUSED */
424static int
436do_params(cname, argc, argv)
437 const char *cname;
438 int argc;
439 char **argv;
425do_params(const char *cname, int argc, char **argv)
440{
441 struct changer_params data;
442 int picker;
443
444 /* No arguments to this command. */
445
446 ++argv; --argc;
447

--- 26 unchanged lines hidden (view full) ---

474
475 usage:
476 (void) fprintf(stderr, "usage: %s %s\n", __progname, cname);
477 return (1);
478}
479
480/* ARGSUSED */
481static int
426{
427 struct changer_params data;
428 int picker;
429
430 /* No arguments to this command. */
431
432 ++argv; --argc;
433

--- 26 unchanged lines hidden (view full) ---

460
461 usage:
462 (void) fprintf(stderr, "usage: %s %s\n", __progname, cname);
463 return (1);
464}
465
466/* ARGSUSED */
467static int
482do_getpicker(cname, argc, argv)
483 const char *cname;
484 int argc;
485 char **argv;
468do_getpicker(const char *cname, int argc, char **argv)
486{
487 int picker;
488
489 /* No arguments to this command. */
490
491 ++argv; --argc;
492
493 if (argc) {

--- 10 unchanged lines hidden (view full) ---

504 return (0);
505
506 usage:
507 (void) fprintf(stderr, "usage: %s %s\n", __progname, cname);
508 return (1);
509}
510
511static int
469{
470 int picker;
471
472 /* No arguments to this command. */
473
474 ++argv; --argc;
475
476 if (argc) {

--- 10 unchanged lines hidden (view full) ---

487 return (0);
488
489 usage:
490 (void) fprintf(stderr, "usage: %s %s\n", __progname, cname);
491 return (1);
492}
493
494static int
512do_setpicker(cname, argc, argv)
513 const char *cname;
514 int argc;
515 char **argv;
495do_setpicker(const char *cname, int argc, char **argv)
516{
517 int picker;
518
519 ++argv; --argc;
520
521 if (argc < 1) {
522 warnx("%s: too few arguments", cname);
523 goto usage;

--- 11 unchanged lines hidden (view full) ---

535 return (0);
536
537 usage:
538 (void) fprintf(stderr, "usage: %s %s <picker>\n", __progname, cname);
539 return (1);
540}
541
542static int
496{
497 int picker;
498
499 ++argv; --argc;
500
501 if (argc < 1) {
502 warnx("%s: too few arguments", cname);
503 goto usage;

--- 11 unchanged lines hidden (view full) ---

515 return (0);
516
517 usage:
518 (void) fprintf(stderr, "usage: %s %s <picker>\n", __progname, cname);
519 return (1);
520}
521
522static int
543do_status(cname, argc, argv)
544 const char *cname;
545 int argc;
546 char **argv;
523do_status(const char *cname, int argc, char **argv)
547{
548 struct changer_params cp;
549 struct changer_element_status_request cesr;
550 int i, count, base, chet, schet, echet;
551 const char *description;
552 int pvoltag = 0;
553 int avoltag = 0;
554 int sense = 0;

--- 202 unchanged lines hidden (view full) ---

757
758 usage:
759 (void) fprintf(stderr, "usage: %s %s [-vVsSbaA] [<element type> [<start-addr> [<end-addr>] ] ]\n",
760 __progname, cname);
761 return (1);
762}
763
764static int
524{
525 struct changer_params cp;
526 struct changer_element_status_request cesr;
527 int i, count, base, chet, schet, echet;
528 const char *description;
529 int pvoltag = 0;
530 int avoltag = 0;
531 int sense = 0;

--- 202 unchanged lines hidden (view full) ---

734
735 usage:
736 (void) fprintf(stderr, "usage: %s %s [-vVsSbaA] [<element type> [<start-addr> [<end-addr>] ] ]\n",
737 __progname, cname);
738 return (1);
739}
740
741static int
765do_ielem(cname, argc, argv)
766 const char *cname;
767 int argc;
768 char **argv;
742do_ielem(const char *cname, int argc, char **argv)
769{
770 int timeout = 0;
771
772 if (argc == 2) {
773 timeout = atol(argv[1]);
774 } else if (argc > 1) {
775 warnx("%s: too many arguments", cname);
776 goto usage;

--- 6 unchanged lines hidden (view full) ---

783
784 usage:
785 (void) fprintf(stderr, "usage: %s %s [<timeout>]\n",
786 __progname, cname);
787 return (1);
788}
789
790static int
743{
744 int timeout = 0;
745
746 if (argc == 2) {
747 timeout = atol(argv[1]);
748 } else if (argc > 1) {
749 warnx("%s: too many arguments", cname);
750 goto usage;

--- 6 unchanged lines hidden (view full) ---

757
758 usage:
759 (void) fprintf(stderr, "usage: %s %s [<timeout>]\n",
760 __progname, cname);
761 return (1);
762}
763
764static int
791do_voltag(cname, argc, argv)
792 const char *cname;
793 int argc;
794 char **argv;
765do_voltag(const char *cname, int argc, char **argv)
795{
796 int force = 0;
797 int clear = 0;
798 int alternate = 0;
799 int c;
800 struct changer_set_voltag_request csvr;
801
802 bzero(&csvr, sizeof(csvr));

--- 68 unchanged lines hidden (view full) ---

871 usage:
872 (void) fprintf(stderr,
873 "usage: %s %s [-fca] <element> [<voltag> [<vsn>] ]\n",
874 __progname, cname);
875 return 1;
876}
877
878static int
766{
767 int force = 0;
768 int clear = 0;
769 int alternate = 0;
770 int c;
771 struct changer_set_voltag_request csvr;
772
773 bzero(&csvr, sizeof(csvr));

--- 68 unchanged lines hidden (view full) ---

842 usage:
843 (void) fprintf(stderr,
844 "usage: %s %s [-fca] <element> [<voltag> [<vsn>] ]\n",
845 __progname, cname);
846 return 1;
847}
848
849static int
879parse_element_type(cp)
880 char *cp;
850parse_element_type(char *cp)
881{
882 int i;
883
884 for (i = 0; elements[i].et_name != NULL; ++i)
885 if (strcmp(elements[i].et_name, cp) == 0)
886 return (elements[i].et_type);
887
888 errx(1, "invalid element type `%s'", cp);
889 /* NOTREACHED */
890}
891
892static const char *
851{
852 int i;
853
854 for (i = 0; elements[i].et_name != NULL; ++i)
855 if (strcmp(elements[i].et_name, cp) == 0)
856 return (elements[i].et_type);
857
858 errx(1, "invalid element type `%s'", cp);
859 /* NOTREACHED */
860}
861
862static const char *
893element_type_name(et)
894 int et;
863element_type_name(int et)
895{
896 int i;
897
898 for (i = 0; elements[i].et_name != NULL; i++)
899 if (elements[i].et_type == et)
900 return elements[i].et_name;
901
902 return "unknown";
903}
904
905static int
864{
865 int i;
866
867 for (i = 0; elements[i].et_name != NULL; i++)
868 if (elements[i].et_type == et)
869 return elements[i].et_name;
870
871 return "unknown";
872}
873
874static int
906parse_element_unit(cp)
907 char *cp;
875parse_element_unit(char *cp)
908{
909 int i;
910 char *p;
911
912 i = (int)strtol(cp, &p, 10);
913 if ((i < 0) || (*p != '\0'))
914 errx(1, "invalid unit number `%s'", cp);
915
916 return (i);
917}
918
919static int
876{
877 int i;
878 char *p;
879
880 i = (int)strtol(cp, &p, 10);
881 if ((i < 0) || (*p != '\0'))
882 errx(1, "invalid unit number `%s'", cp);
883
884 return (i);
885}
886
887static int
920parse_special(cp)
921 char *cp;
888parse_special(char *cp)
922{
923 int val;
924
925 val = is_special(cp);
926 if (val)
927 return (val);
928
929 errx(1, "invalid modifier `%s'", cp);
930 /* NOTREACHED */
931}
932
933static int
889{
890 int val;
891
892 val = is_special(cp);
893 if (val)
894 return (val);
895
896 errx(1, "invalid modifier `%s'", cp);
897 /* NOTREACHED */
898}
899
900static int
934is_special(cp)
935 char *cp;
901is_special(char *cp)
936{
937 int i;
938
939 for (i = 0; specials[i].sw_name != NULL; ++i)
940 if (strcmp(specials[i].sw_name, cp) == 0)
941 return (specials[i].sw_value);
942
943 return (0);
944}
945
946static const char *
902{
903 int i;
904
905 for (i = 0; specials[i].sw_name != NULL; ++i)
906 if (strcmp(specials[i].sw_name, cp) == 0)
907 return (specials[i].sw_value);
908
909 return (0);
910}
911
912static const char *
947bits_to_string(v, cp)
948 ces_status_flags v;
949 const char *cp;
913bits_to_string(ces_status_flags v, const char *cp)
950{
951 const char *np;
952 char f, sep, *bp;
953 static char buf[128];
954
955 bp = buf;
956 (void) memset(buf, 0, sizeof(buf));
957

--- 14 unchanged lines hidden (view full) ---

972}
973/*
974 * do_return()
975 *
976 * Given an element reference, ask the changer/picker to move that
977 * element back to its source slot.
978 */
979static int
914{
915 const char *np;
916 char f, sep, *bp;
917 static char buf[128];
918
919 bp = buf;
920 (void) memset(buf, 0, sizeof(buf));
921

--- 14 unchanged lines hidden (view full) ---

936}
937/*
938 * do_return()
939 *
940 * Given an element reference, ask the changer/picker to move that
941 * element back to its source slot.
942 */
943static int
980do_return(cname, argc, argv)
981 const char *cname;
982 int argc;
983 char **argv;
944do_return(const char *cname, int argc, char **argv)
984{
985 struct changer_element_status *ces;
986 struct changer_move cmd;
987 u_int16_t type, element;
988
989 ++argv; --argc;
990
991 if (argc < 2) {

--- 46 unchanged lines hidden (view full) ---

1038/*
1039 * get_element_status()
1040 *
1041 * return a *cesr for the specified changer element. This
1042 * routing will malloc()/calloc() the memory. The caller
1043 * should free() it when done.
1044 */
1045static struct changer_element_status *
945{
946 struct changer_element_status *ces;
947 struct changer_move cmd;
948 u_int16_t type, element;
949
950 ++argv; --argc;
951
952 if (argc < 2) {

--- 46 unchanged lines hidden (view full) ---

999/*
1000 * get_element_status()
1001 *
1002 * return a *cesr for the specified changer element. This
1003 * routing will malloc()/calloc() the memory. The caller
1004 * should free() it when done.
1005 */
1006static struct changer_element_status *
1046get_element_status(type, element)
1047 unsigned int type;
1048 unsigned int element;
1007get_element_status(unsigned int type, unsigned int element)
1049{
1050 struct changer_element_status_request cesr;
1051 struct changer_element_status *ces;
1052
1053 ces = (struct changer_element_status *)
1054 calloc((size_t)1, sizeof(struct changer_element_status));
1055
1056 if (NULL == ces)

--- 20 unchanged lines hidden (view full) ---

1077/*
1078 * find_element()
1079 *
1080 * Given a <voltag> find the chager element and unit, or exit
1081 * with an error if it isn't found. We grab the changer status
1082 * and iterate until we find a match, or crap out.
1083 */
1084static void
1008{
1009 struct changer_element_status_request cesr;
1010 struct changer_element_status *ces;
1011
1012 ces = (struct changer_element_status *)
1013 calloc((size_t)1, sizeof(struct changer_element_status));
1014
1015 if (NULL == ces)

--- 20 unchanged lines hidden (view full) ---

1036/*
1037 * find_element()
1038 *
1039 * Given a <voltag> find the chager element and unit, or exit
1040 * with an error if it isn't found. We grab the changer status
1041 * and iterate until we find a match, or crap out.
1042 */
1043static void
1085find_element(voltag, et, eu)
1086 char *voltag;
1087 u_int16_t *et;
1088 u_int16_t *eu;
1044find_element(char *voltag, u_int16_t *et, u_int16_t *eu)
1089{
1090 struct changer_params cp;
1091 struct changer_element_status_request cesr;
1092 struct changer_element_status *ch_ces, *ces;
1093 int found = 0;
1094 size_t elem, total_elem;
1095
1096 /*

--- 103 unchanged lines hidden (view full) ---

1200 errx(1, "%s: unable to locate voltag: %s", changer_name,
1201 voltag);
1202 }
1203 free(ch_ces);
1204 return;
1205}
1206
1207static void
1045{
1046 struct changer_params cp;
1047 struct changer_element_status_request cesr;
1048 struct changer_element_status *ch_ces, *ces;
1049 int found = 0;
1050 size_t elem, total_elem;
1051
1052 /*

--- 103 unchanged lines hidden (view full) ---

1156 errx(1, "%s: unable to locate voltag: %s", changer_name,
1157 voltag);
1158 }
1159 free(ch_ces);
1160 return;
1161}
1162
1163static void
1208cleanup()
1164cleanup(void)
1209{
1210 /* Simple enough... */
1211 (void)close(changer_fd);
1212}
1213
1214static void
1165{
1166 /* Simple enough... */
1167 (void)close(changer_fd);
1168}
1169
1170static void
1215usage()
1171usage(void)
1216{
1172{
1217 (void) fprintf(stderr, "usage: %s [-f changer] command [-<flags>] "
1173 (void)fprintf(stderr, "usage: %s [-f changer] command [-] "
1218 "arg1 arg2 [arg3 [...]]\n", __progname);
1219 exit(1);
1220}
1174 "arg1 arg2 [arg3 [...]]\n", __progname);
1175 exit(1);
1176}