aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/uathload/uathload.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/uathload/uathload.c')
-rw-r--r--usr.sbin/uathload/uathload.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/usr.sbin/uathload/uathload.c b/usr.sbin/uathload/uathload.c
index 50e9eb64d757..8479f17c88e6 100644
--- a/usr.sbin/uathload/uathload.c
+++ b/usr.sbin/uathload/uathload.c
@@ -50,6 +50,7 @@
#include <libgen.h>
#include <paths.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
@@ -82,21 +83,32 @@ extern uint8_t _binary_ar5523_bin_start;
extern uint8_t _binary_ar5523_bin_end;
static int
-getdevname(const char *devname, char *msgdev, char *datadev)
+getdevname(const char *udevname, char *msgdev, char *datadev)
{
- char *bn, *dn;
+ char *bn, *bnbuf, *dn, *dnbuf;
- dn = dirname(devname);
- if (dn == NULL)
+ dnbuf = strdup(udevname);
+ if (dnbuf == NULL)
return (-1);
- bn = basename(devname);
- if (bn == NULL || strncmp(bn, "ugen", 4))
+ dn = dirname(dnbuf);
+ bnbuf = strdup(udevname);
+ if (bnbuf == NULL) {
+ free(dnbuf);
return (-1);
+ }
+ bn = basename(bnbuf);
+ if (strncmp(bn, "ugen", 4) != 0) {
+ free(dnbuf);
+ free(bnbuf);
+ return (-1);
+ }
bn += 4;
/* NB: pipes are hardcoded */
snprintf(msgdev, 256, "%s/usb/%s.1", dn, bn);
snprintf(datadev, 256, "%s/usb/%s.2", dn, bn);
+ free(dnbuf);
+ free(bnbuf);
return (0);
}
@@ -109,7 +121,7 @@ usage(void)
int
main(int argc, char *argv[])
{
- const char *fwname, *devname;
+ const char *fwname, *udevname;
char msgdev[256], datadev[256];
struct uath_fwmsg txmsg, rxmsg;
char *txdata;
@@ -118,11 +130,11 @@ main(int argc, char *argv[])
int bufsize = 512, verbose = 0;
ssize_t len;
- devname = NULL;
+ udevname = NULL;
while ((c = getopt(argc, argv, "d:v")) != -1) {
switch (c) {
case 'd':
- devname = optarg;
+ udevname = optarg;
break;
case 'v':
verbose = 1;
@@ -135,7 +147,7 @@ main(int argc, char *argv[])
argc -= optind;
argv += optind;
- if (devname == NULL)
+ if (udevname == NULL)
errx(-1, "No device name; use -d to specify the ugen device");
if (argc > 1)
usage();
@@ -154,7 +166,7 @@ main(int argc, char *argv[])
err(-1, "mmap(%s)", fwname);
len = sb.st_size;
/* XXX verify device is an AR5005 part */
- if (getdevname(devname, msgdev, datadev))
+ if (getdevname(udevname, msgdev, datadev))
err(-1, "getdevname error");
msg = open(msgdev, O_RDWR, 0);
@@ -174,7 +186,7 @@ main(int argc, char *argv[])
err(-1, "%s: USB_SET_TX_TIMEOUT(%u)", datadev,
UATH_DATA_TIMEOUT);
- VERBOSE("Load firmware %s to %s\n", fwname, devname);
+ VERBOSE("Load firmware %s to %s\n", fwname, udevname);
bzero(&txmsg, sizeof (struct uath_fwmsg));
txmsg.flags = htobe32(UATH_WRITE_BLOCK);