본문 바로가기
Linux/Udev

udev C 코드 프로그램 [네트워크 디바이스 확인]

by khd0801 2022. 3. 2.
반응형

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 값을 입력해 준다.

반응형

댓글