1. 네트워크 디바이스 예제 코드
#include <stdio.h>
#include <libudev.h>
#define SYSPATH "/sys/class/net"
#define VIRTUALPATH "/sys/devices/virtual/net"
int main(int argc, char *argv[])
{
struct udev *udev;
struct udev_device *dev, *dev_parent;
char device[128];
/* verify that we have an argument, like eth0, otherwise fail */
if (!argv[1]) {
fprintf(stderr, "Missing network interface name.\nexample: %s eth0\n", argv[0]);
return 1;
}
/* build device path out of SYSPATH macro and argv[1] */
printf("%s/%s", SYSPATH\n, argv[1]);
snprintf(device, sizeof(device), "%s/%s", SYSPATH, argv[1]);
/* create udev object */
udev = udev_new();
if (!udev) {
fprintf(stderr, "Cannot create udev context.\n");
return 1;
}
/* get device based on path */
dev = udev_device_new_from_syspath(udev, device);
if (!dev) {
fprintf(stderr, "Failed to get device.\n");
return 1;
}
printf("I: DEVNAME=%s\n", udev_device_get_sysname(dev));
printf("I: DEVPATH=%s\n", udev_device_get_devpath(dev));
printf("I: MACADDR=%s\n", udev_device_get_sysattr_value(dev, "address"));
dev_parent = udev_device_get_parent(dev);
if (dev_parent)
printf("I: DRIVER=%s\n", udev_device_get_driver(dev_parent));
/* free dev */
udev_device_unref(dev);
/* free udev */
udev_unref(udev);
return 0;
}
23번째 줄 udev_new()
Prototype | struct udev * udev_new(void) |
Retrunt 값 | 성공시 udev 구조체 객체의 동적 메모리 주소, 실패시 NULL . |
입력 파라미터 값 | 없음. |
설명 | 함수 내부에서 calloc()함수를 이용하여 udev 구조체를 메모리 동적 할당을 받음. 프로그램이 종료하기 전에 udev_unref() 함수를 이용하여 free해야 함. |
30번째 줄 udev_device_new_from_syspath()
Prototype | struct udev_device * udev_device_new_from_syspath(struct udev *udev, const char *syspath,) |
Retrunt 값 | 성공시 udev_device 구조체 객체의 동적 메모리 주소, 실패시 NULL . |
입력 파라미터 값 | struct udev 구조체 주소, 정보를 얻기 원하는 네트워크 노드 경로. |
설명 | 함수 내부에서 calloc()함수를 이용하여 udev_device 구조체를 메모리 동적 할당을 받음. 프로그램이 종료하기 전에 udev_device_unref() 함수를 이용하여 free해야 함. |
36번째 줄 udev_device_get_sysname()
rototype | const char* udev_device_get_sysname(struct udev_device *udev_device) |
Retrunt 값 | device의 sysname(device name). |
입력 파라미터 값 | struct udev_device 구조체 주소. |
설명 | udev_device_new_from_syspath()함수의 입력 파라미터로(*syspath) 입력된 노드의 sysname. |
37번째 줄 udev_device_get_devpath
rototype | const char* udev_device_get_devpath(struct udev_device *udev_device) |
Retrunt 값 | udev device의 devpath. |
입력 파라미터 값 | struct udev_device 구조체 주소. |
설명 | udev 디바이스의 커널 devpath 값을 검색하여 리턴합니다. 경로는 /sys mount 지점을 포함하지 않으며 '/'f로 시작합니다. |
38번째 줄 udev_device_get_sysattr_value
rototype | const char* udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr) |
Retrunt 값 | 시스템 속성(sysattr) 파일의 내용, 속성 값이 없는 경우 NULL 반환. |
입력 파라미터 값 | struct udev_device 구조체 주소, 얻기 원하는 attribute name. |
설명 | 입력 받은 attribute(속성) name을 이용하여 device의 속성 값을 리턴. udevadm info -a /sys/class/devpath 를 이용하면 device의 속성 값을 볼 수 있음. |
40번째 줄 udev_device_get_parent
rototype | struct udev_device* udev_device_get_parent(struct udev_device *udev_device) |
Retrunt 값 | 현재 장치의 parent device의 udev device 구조체 주소, 만약 parent device가 없다면 NULL 반환. |
입력 파라미터 값 | struct udev_device 구조체 주소. |
설명 | 입력파라미터 udev_device의 상위 장치를 찾고 sys 장치 및 udev 데이터베이스 항목에서 정보를 입력. 리턴 된 udev_device는 하위 장치가 정리 될 때 같이 정리됨. |
42번째 줄 udev_device_get_driver
rototype | struct udev_device* udev_device_get_driver(struct udev_device *udev_device) |
Retrunt 값 | 드라이버의 이름, 드라이버가 없을 경우 NULL 반환. |
입력 파라미터 값 | struct udev_device 구조체 주소. |
설명 | 커널 드라이버의 이름을 얻는다. |
45번째 줄 udev_device_unref
rototype | void udev_device_unref(struct udev_device *udev_device) |
Retrunt 값 | 없음. |
입력 파라미터 값 | struct udev_device 구조체 주소. |
설명 | 동적 할당 받은 udev_device의 free(동적 할당 해제). |
48번째 줄 udev_unref
rototype | void udev_unref(struct udev *udev) |
Retrunt 값 | 없음. |
입력 파라미터 값 | struct udev 구조체 주소. |
설명 | 동적 할당 받은 udev의 free(동적 할당 해제). |
주의사항
fatal error: libudev.h: No such file or directory 에러 발생시 아래 명령어 실행
sudo apt-get install libudev-dev
2. MakeFile
CC = gcc
CFLAGS = -g -Wall
udev_examples:
$(CC) $(CFLAGS) -o udev_example udev_example.c -ludev
default: udev_examples
all: default
clean:
rm -f udev_example
위에 libudev-dev 라이브러리를 설치하였듯이 udev_exmaple.c를 컴파일 하기 위해서는 udev 라이브러리가 필요하다.
그래서 makefile에 있듯이 -ludev를 적어줌으로써 사용하는 라이브러리를 gcc에게 알려줘야지만 에러가 나지 않고 컴파일이 가능하다.
3. 실행 결과
$ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::b0e5:17c6:7dea:4236 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:2f:4b:5d txqueuelen 1000 (Ethernet)
RX packets 205 bytes 244632 (244.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 147 bytes 14597 (14.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 146 bytes 11956 (11.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 146 bytes 11956 (11.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$./udev_example enp0s3
/sys/class/net/enp0s3
I: DEVNAME=enp0s3
I: DEVPATH=/devices/pci0000:00/0000:00:03.0/net/enp0s3
I: MACADDR=08:00:27:2f:4b:5d
I: DRIVER=e1000
udev_example의 입력 파라미터로 ifconfig로 출력된 enp0s3 값을 입력해 준다.
댓글