X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=setpci.c;h=acf768971702edcaff5d9e14c28eb18268f6669d;hb=77120d53649678ea1cb72591f522d63c27b6a261;hp=50d2a898c7bb81db3c641108134adbd931f2fe16;hpb=df59fab40a649ed00cd04047523b1da986c3042c;p=pciutils.git diff --git a/setpci.c b/setpci.c index 50d2a89..acf7689 100644 --- a/setpci.c +++ b/setpci.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #define PCIUTILS_SETPCI @@ -60,7 +59,7 @@ select_devices(struct pci_filter *filt) return b; } -static void +static void PCI_PRINTF(1,2) trace(const char *fmt, ...) { va_list args; @@ -323,17 +322,9 @@ dump_registers(void) } } -static void NONRET PCI_PRINTF(1,2) -usage(char *msg, ...) +static void NONRET +usage(void) { - va_list args; - va_start(args, msg); - if (msg) - { - fprintf(stderr, "setpci: "); - vfprintf(stderr, msg, args); - fprintf(stderr, "\n\n"); - } fprintf(stderr, "Usage: setpci [] (+ [=]*)*\n" "\n" @@ -357,24 +348,40 @@ GENERIC_HELP ":\t[,...]\n" ":\t\n" "\t\t:\n"); + exit(0); +} + +static void NONRET PCI_PRINTF(1,2) +parse_err(const char *msg, ...) +{ + va_list args; + va_start(args, msg); + fprintf(stderr, "setpci: "); + vfprintf(stderr, msg, args); + fprintf(stderr, ".\nTry `setpci --help' for more information.\n"); exit(1); } static int parse_options(int argc, char **argv) { - char *opts = GENERIC_OPTIONS; + const char opts[] = GENERIC_OPTIONS; int i=1; - if (argc == 2 && !strcmp(argv[1], "--version")) - { - puts("setpci version " PCIUTILS_VERSION); - exit(0); - } - if (argc == 2 && !strcmp(argv[1], "--dumpregs")) + if (argc == 2) { - dump_registers(); - exit(0); + if (!strcmp(argv[1], "--help")) + usage(); + if (!strcmp(argv[1], "--version")) + { + puts("setpci version " PCIUTILS_VERSION); + exit(0); + } + if (!strcmp(argv[1], "--dumpregs")) + { + dump_registers(); + exit(0); + } } while (i < argc && argv[i][0] == '-') @@ -411,18 +418,18 @@ parse_options(int argc, char **argv) else if (i < argc) arg = argv[i++]; else - usage(NULL); + parse_err("Option -%c requires an argument", *e); c = ""; } else arg = NULL; if (!parse_generic_option(*e, pacc, arg)) - usage(NULL); + parse_err("Unable to parse option -%c", *e); } else { if (c != d) - usage(NULL); + parse_err("Invalid or misplaced option -%c", *c); return i-1; } } @@ -437,25 +444,25 @@ static int parse_filter(int argc, char **argv, int i, struct pci_filter *filter) char *d; if (!c[1] || !strchr("sd", c[1])) - usage(NULL); + parse_err("Invalid option -%c", c[1]); if (c[2]) d = (c[2] == '=') ? c+3 : c+2; else if (i < argc) d = argv[i++]; else - usage(NULL); + parse_err("Option -%c requires an argument", c[1]); switch (c[1]) { case 's': if (d = pci_filter_parse_slot(filter, d)) - die("-s: %s", d); + parse_err("Unable to parse filter -s %s", d); break; case 'd': if (d = pci_filter_parse_id(filter, d)) - die("-d: %s", d); + parse_err("Unable to parse filter -d %s", d); break; default: - usage(NULL); + parse_err("Unknown filter option -%c", c[1]); } return i; @@ -474,11 +481,12 @@ static const struct reg_name *parse_reg_name(char *name) static int parse_x32(char *c, char **stopp, unsigned int *resp) { char *stop; + unsigned long int l; if (!*c) return -1; errno = 0; - unsigned long int l = strtoul(c, &stop, 16); + l = strtoul(c, &stop, 16); if (errno) return -1; if ((l & ~0U) != l) @@ -491,7 +499,11 @@ static int parse_x32(char *c, char **stopp, unsigned int *resp) return 0; } else - return 1; + { + if (stopp) + *stopp = NULL; + return 1; + } } static void parse_register(struct op *op, char *base) @@ -539,7 +551,7 @@ static void parse_register(struct op *op, char *base) return; } } - usage("Unknown register \"%s\"", base); + parse_err("Unknown register \"%s\"", base); } static void parse_op(char *c, struct pci_dev **selected_devices) @@ -563,7 +575,7 @@ static void parse_op(char *c, struct pci_dev **selected_devices) if (value) { if (!*value) - usage("Missing value"); + parse_err("Missing value"); n++; for (e=value; *e; e++) if (*e == ',') @@ -579,7 +591,7 @@ static void parse_op(char *c, struct pci_dev **selected_devices) if (width) { if (width[1]) - usage("Invalid width \"%s\"", width); + parse_err("Invalid width \"%s\"", width); switch (*width & 0xdf) { case 'B': @@ -589,7 +601,7 @@ static void parse_op(char *c, struct pci_dev **selected_devices) case 'L': op->width = 4; break; default: - usage("Invalid width \"%c\"", *width); + parse_err("Invalid width \"%c\"", *width); } } else @@ -598,22 +610,22 @@ static void parse_op(char *c, struct pci_dev **selected_devices) /* Find the register */ parse_register(op, base); if (!op->width) - usage("Missing width"); + parse_err("Missing width"); /* Add offset */ if (offset) { unsigned int off; if (parse_x32(offset, NULL, &off) <= 0 || off >= 0x1000) - die("Invalid offset \"%s\"", offset); + parse_err("Invalid offset \"%s\"", offset); op->addr += off; } /* Check range */ if (op->addr >= 0x1000 || op->addr + op->width*(n ? n : 1) > 0x1000) - die("Register number out of range!"); + parse_err("Register number %02x out of range", op->addr); if (op->addr & (op->width - 1)) - die("Unaligned register address!"); + parse_err("Unaligned register address %02x", op->addr); /* Parse the values */ for (j=0; jwidth]; - if (ll > lim && ll < ~0UL - lim) - usage("Value \"%s\" is out of range", value); + if (ll > lim && ll < ~0U - lim) + parse_err("Value \"%s\" is out of range", value); op->values[j].value = ll; - if (*f == ':') + if (f && *f == ':') { if (parse_x32(f+1, NULL, &ll) <= 0) - usage("Invalid mask \"%s\"", f+1); - if (ll > lim && ll < ~0UL - lim) - usage("Mask \"%s\" is out of range", f+1); + parse_err("Invalid mask \"%s\"", f+1); + if (ll > lim && ll < ~0U - lim) + parse_err("Mask \"%s\" is out of range", f+1); op->values[j].mask = ll; op->values[j].value &= ll; } @@ -667,17 +679,17 @@ static void parse_ops(int argc, char **argv, int i) else { if (state == STATE_INIT) - usage(NULL); + parse_err("Filter specification expected"); if (state == STATE_GOT_FILTER) selected_devices = select_devices(&filter); if (!selected_devices[0] && !force) - fprintf(stderr, "setpci: Warning: No devices selected for `%s'.\n", c); + fprintf(stderr, "setpci: Warning: No devices selected for \"%s\".\n", c); parse_op(c, selected_devices); state = STATE_GOT_OP; } } if (state == STATE_INIT) - usage("No operation specified"); + parse_err("No operation specified"); } int