LINUX.ORG.RU

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


0

0

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


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

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

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

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

Banshee ()

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

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

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

Antichrist ()

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

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

Banshee ()

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

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

Druker ()

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

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

Banshee ()
Ответ на: Re: Определение серийного номера HDD от Druker

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

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

Antichrist ()

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

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

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

Banshee ()

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

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

Druker ()

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

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

#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 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.