blob: f6fb23fefa834b13456bccebe8ca9416049e37c8 [file] [log] [blame]
/*
* misc.c - Miscellaneous helpers
* Copyright (C) 2011-2015 Jiri Pirko <jiri@resnulli.us>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _T_MISC_H_
#define _T_MISC_H_
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/socket.h>
#include <inttypes.h>
#include <sys/ioctl.h>
#include <linux/if.h>
static inline void *myzalloc(size_t size)
{
return calloc(1, size);
}
static inline size_t mystrlcpy(char *dst, const char *src, size_t size)
{
size_t ret = strlen(src);
if (size) {
size_t len = (ret >= size) ? size - 1 : ret;
memcpy(dst, src, len);
dst[len] = '\0';
}
return ret;
}
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
static inline void hwaddr_str(char *str, char *hwaddr, size_t len)
{
int i;
for (i = 0; i < len; i++) {
sprintf(str, "%02x:", (unsigned char) hwaddr[i]);
str += 3;
}
if (len)
str--;
*str = '\0';
}
static inline size_t hwaddr_str_len(size_t len)
{
return len * 3 + 1;
}
static inline char *a_hwaddr_str(char *hwaddr, size_t len)
{
char *str;
str = malloc(sizeof(char) * hwaddr_str_len(len));
if (!str)
return NULL;
hwaddr_str(str, hwaddr, len);
return str;
}
static inline int ifname2ifindex(uint32_t *p_ifindex, char *ifname)
{
int sock;
struct ifreq ifr;
int ret;
sock = socket(PF_PACKET, SOCK_DGRAM, 0);
if (sock == -1)
return -errno;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
ret = ioctl(sock, SIOCGIFINDEX, &ifr);
close(sock);
if (ret == -1) {
if (errno == ENODEV)
*p_ifindex = 0;
else
return -errno;
} else {
*p_ifindex = ifr.ifr_ifindex;
}
return 0;
}
#endif /* _T_MISC_H_ */