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} |