int loaddevconf(Dev *d, int n) { uchar *buf; int nr; int type; if(n >= nelem(d->usb->conf)){ werrstr("loaddevconf: bug: out of configurations in device"); fprint(2, "%s: %r\n", argv0); return -1; } buf = emallocz(Maxdevconf, 0); type = Rd2h|Rstd|Rdev; nr = usbcmd(d, type, Rgetdesc, Dconf<<8|n, 0, buf, Maxdevconf); if(nr < Dconflen){ free(buf); return -1; } if(d->usb->conf[n] == nil) d->usb->conf[n] = emallocz(sizeof(Conf), 1); nr = parseconf(d->usb, d->usb->conf[n], buf, nr); free(buf); return nr; }
int main(int argc, char **argv) { int opt, status, sock, count; char *conf_filename; ipv6das_cmd_t ipv6das_cmd = IPV6DAS_PRINTPOLICY; ip6_asp_t *policy_table; myname = *argv; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ #define TEXT_DOMAIN "SYS_TEST" #endif (void) textdomain(TEXT_DOMAIN); while ((opt = getopt(argc, argv, "df:")) != EOF) switch (opt) { case 'd': ipv6das_cmd = IPV6DAS_SETDEFAULT; break; case 'f': conf_filename = optarg; ipv6das_cmd = IPV6DAS_SETPOLICY; break; default: usage(); return (EXIT_FAILURE); } if (argc > optind) { /* shouldn't be any extra args */ usage(); return (EXIT_FAILURE); } /* Open a socket that we can use to send ioctls down to IP. */ if ((sock = socket(PF_INET6, SOCK_DGRAM, 0)) == -1) { perror("socket"); return (EXIT_FAILURE); } switch (ipv6das_cmd) { case IPV6DAS_SETPOLICY: if ((count = parseconf(conf_filename, &policy_table)) <= 0) return (EXIT_FAILURE); status = setpolicy(sock, policy_table, count); free(policy_table); break; case IPV6DAS_SETDEFAULT: status = setpolicy(sock, NULL, 0); break; case IPV6DAS_PRINTPOLICY: default: status = printpolicy(sock); break; } (void) close(sock); return (status); }