X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=setpci.c;h=97740e8c2168c0c3f534b57571a7501a8f15c49c;hb=4c2bdb019375b5b2167959a167710791225b6670;hp=a0daddb6f32792e31b4bcc37f16895698e4ad109;hpb=89caa7b8f22bbd2e4ce88bc02d9db7e562a0a3f3;p=pciutils.git diff --git a/setpci.c b/setpci.c index a0daddb..97740e8 100644 --- a/setpci.c +++ b/setpci.c @@ -60,7 +60,7 @@ select_devices(struct pci_filter *filt) return b; } -static void +static void PCI_PRINTF(1,2) trace(const char *fmt, ...) { va_list args; @@ -81,19 +81,19 @@ exec_op(struct op *op, struct pci_dev *dev) char slot[16]; sprintf(slot, "%04x:%02x:%02x.%x", dev->domain, dev->bus, dev->dev, dev->func); - trace("%s", slot); + trace("%s ", slot); if (op->cap_type) { struct pci_cap *cap; - trace(((op->cap_type == PCI_CAP_NORMAL) ? "(cap %02x)" : "(ecap %04x)"), op->cap_id); cap = pci_find_cap(dev, op->cap_id, op->cap_type); if (cap) addr = cap->addr; else die("%s: %s %04x not found", slot, ((op->cap_type == PCI_CAP_NORMAL) ? "Capability" : "Extended capability"), op->cap_id); + trace(((op->cap_type == PCI_CAP_NORMAL) ? "(cap %02x @%02x) " : "(ecap %04x @%03x) "), op->cap_id, addr); } addr += op->addr; - trace(":%02x", addr); + trace("@%02x", addr); /* We have already checked it when parsing, but addressing relative to capabilities can change the address. */ if (addr & (width-1)) @@ -323,17 +323,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 +349,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 +419,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 +445,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; @@ -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); + 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); + parse_err("Invalid mask \"%s\"", f+1); if (ll > lim && ll < ~0UL - lim) - usage("Mask \"%s\" is out of range", f+1); + 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