Call basename() and dirname() in the POSIXly correct way.

Pull copies of the input string, as these functions are allowed to
modify them. Free the copies after creating the new pathname string.
This commit is contained in:
Ed Schouten 2016-07-28 15:33:19 +00:00
parent 33f5799a81
commit 544e9b30a9

View File

@ -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>
@ -84,19 +85,30 @@ extern uint8_t _binary_ar5523_bin_end;
static int
getdevname(const char *devname, char *msgdev, char *datadev)
{
char *bn, *dn;
char *bn, *bnbuf, *dn, *dnbuf;
dn = dirname(devname);
if (dn == NULL)
dnbuf = strdup(devname);
if (dnbuf == NULL)
return (-1);
bn = basename(devname);
if (bn == NULL || strncmp(bn, "ugen", 4))
dn = dirname(dnbuf);
bnbuf = strdup(devname);
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);
}