diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-07-26 19:00:53 +0200 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-07-26 19:00:53 +0200 | 
| commit | d6ae1c3f777832f8e32702f81fe64e33a1396928 (patch) | |
| tree | 159a1e59f3929c9d795dbd1f3edd84d9dccba048 /common/oui.c | |
| parent | b8e5fea8d31fbcd3d1c044385f8217dbf39892bb (diff) | |
| parent | 3382af9114a9b2e657c7ddd0a5511edda6a37a90 (diff) | |
Import bluez-utils-3.36 revision history
Diffstat (limited to 'common/oui.c')
| -rw-r--r-- | common/oui.c | 109 | 
1 files changed, 109 insertions, 0 deletions
diff --git a/common/oui.c b/common/oui.c new file mode 100644 index 00000000..0915afdf --- /dev/null +++ b/common/oui.c @@ -0,0 +1,109 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/mman.h> + +#include "oui.h" + +/* http://standards.ieee.org/regauth/oui/oui.txt */ + +#define OUIFILE "/var/lib/misc/oui.txt" + +char *ouitocomp(const char *oui) +{ +	struct stat st; +	char *str, *map, *off, *end; +	int fd; + +	fd = open("oui.txt", O_RDONLY); +	if (fd < 0) { +		fd = open(OUIFILE, O_RDONLY); +		if (fd < 0) { +			fd = open("/usr/share/misc/oui.txt", O_RDONLY); +			if (fd < 0) +				return NULL; +		} +	} + +	if (fstat(fd, &st) < 0) { +		close(fd); +		return NULL; +	} + +	str = malloc(128); +	if (!str) { +		close(fd); +		return NULL; +	} + +	memset(str, 0, 128); + +	map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); +	if (!map || map == MAP_FAILED) { +		free(str); +		close(fd); +		return NULL; +	} + +	off = strstr(map, oui); +	if (off) { +		off += 18; +		end = strpbrk(off, "\r\n"); +		strncpy(str, off, end - off); +	} else { +		free(str); +		str = NULL; +	} + +	munmap(map, st.st_size); + +	close(fd); + +	return str; +} + +int oui2comp(const char *oui, char *comp, size_t size) +{ +	char *tmp; + +	tmp = ouitocomp(oui); +	if (!tmp) +		return -1; + +	snprintf(comp, size, "%s", tmp); + +	free(tmp); + +	return 0; +}  | 
