LINUX.ORG.RU

Определение серийного номера HDD


0

0

Всем привет! Подскажите, как в Linux выдернуть серийный номер жесткого диска IDE/SCSI посредством С, не прибегая к написанию своего драйвера IDE/SCSI при этом. Также было бы интересно узнать, как выдернуть МАС-адрес сетевых карт. Заранее спасибо.


Вместо предисловия.
Какой драйвер? О чем ты бредишь пьяное полено? (это из Буратино)

Ну я не понимаю таких мужиков. Вот ты знаешь хоть одну программу, которая это умеет делать? Так вперед смотреть исходники.

Диск: GNU Parted, Linux Kernel
Сетевая карта: Linux Kernel

Banshee
()

См. в /proc/ide/hdX/identify

Для SCSI аналогично.

Antichrist
()

А вдруг мужик хочет платформо-независимый код?

Banshee
()

О! Banshee! молодец, догадался! Остальным: спасибо за ответы, но если ковырять сорс ядра - то я не готов. Все, что мне надо, это как _без_ написания своего драйвера данного девайса выдернуть данную инфу запросами к ядру на С (если, конечно, это возможно). Есть ли стандартные вызовы ядра, дающие эту инфу? Я вот более склоняюсь к расковыриванию ifconfig'а на предмет МАС, а по-поводу серийности дисков... ? И еще, у Сантехники (рабочие станции SUN) есть понятие "серийный номер машины". Можно ли его из приложения (вызовами ядра) вытащить?

Druker
() автор топика

Ну можно посмотреть еще, не провайдит ли драйвер ide каких лимбо системных вызовов

Banshee
()
Ответ на: комментарий от Druker

Дык всё, что тебе надо, в /proc есть. Это только под Linux работать будет, но иного выхода у тебя всё равно нет, если не хочешь в ядра лезть.

Antichrist
()

Ты можешь посмотреть ide-proc.c в linux/drives/

А можешь еще посмотреть исходники hdparm-а

Banshee
()

Всем спасибо!

Druker
() автор топика

На самом деле все просто:

#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/major.h>
#include <linux/hdreg.h>

static struct hd_driveid id;

void exit_error(int err, char *msg)
{
	fprintf(stderr, "%s\n", msg);
	exit(1);
}

void check_drive_type(char *device)
{
	struct stat stat_buf;

	if(stat(device, &stat_buf))
		exit_error(errno, "stat of device failed.");

#ifdef SCSI_DISK0_MAJOR
	if((major(stat_buf.st_rdev) == SCSI_DISK0_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK1_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK2_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK3_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK4_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK5_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK6_MAJOR) 
	|| (major(stat_buf.st_rdev) == SCSI_DISK7_MAJOR) 
#else
	if((major(stat_buf.st_rdev) == SCSI_DISK_MAJOR) 
#endif
#ifdef MD_MAJOR
	|| (major(stat_buf.st_rdev) == MD_MAJOR)
#endif
	) 
		exit_error(1, "SCSI disk is not supported.");
	else
#ifdef XT_DISK_MAJOR
	if(major(stat_buf.st_rdev) == XT_DISK_MAJOR)
		exit_error(1, "XT disk is not supported.");
	else
#endif
		if(major(stat_buf.st_rdev) != IDE0_MAJOR
		&& major(stat_buf.st_rdev) != IDE1_MAJOR
#ifdef IDE2_MAJOR
		&& major(stat_buf.st_rdev) != IDE2_MAJOR
#endif
#ifdef IDE3_MAJOR
		&& major(stat_buf.st_rdev) != IDE3_MAJOR
#endif
#ifdef IDE4_MAJOR
		&& major(stat_buf.st_rdev) != IDE4_MAJOR
#endif
#ifdef IDE5_MAJOR
		&& major(stat_buf.st_rdev) != IDE5_MAJOR
#endif
	)
		exit_error(1, "This disk is not supported.");
}

/* первый аргумент - файл устройства диска (напр. /dev/hda) */
int main(int argc, char *argv[])
{
	int fd;

	check_drive_type(argv[1]);

	if((fd = open(argv[1], O_RDONLY)) < 0)
		exit_error(errno, "Unable to open device.");

	if(!ioctl(fd, HDIO_GET_IDENTITY, &id))
		printf("Model = %s, Revision = %s, Serial Number = %s\n", id.model, id.fw_rev, id.serial_no);
	else if(errno == -ENOMSG)
		fprintf(stderr, "No identification info available.\n");
	else
		fprintf(stderr, "HDIO_GET_IDENTITY failed.\n");

	return 0;
}

Druker
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.