LINUX.ORG.RU

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


0

0

Запустил прогу под root: #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; }

в результате все время высвечивается exit_error(errno, "stat of device failed."); В чем дело не могу понять. Помогите пожалуста разобраться.

anonymous

Вот так работает (при наличии прав доступа к девайсу):

#include <stdlib.h>
#include <stdio.h>

char *hdd_serial_no(const char *dev, char *buf, int size)
  {
  FILE *fp;
  setenv("dev", dev, 1);
  fp = popen("if [ -x /usr/sbin/hdparm ];"
             "  then hdparm=/usr/sbin/hdparm;"
             "  else hdparm=/sbin/hdparm;"
             "fi;"
             "$hdparm -i $dev | grep SerialNo | cut -d = -f 4 | tr -d '\n'",
             "r");
  if (!fp)  return NULL;
  buf = fgets(buf, size, fp);
  fclose(fp);
  return buf;
  }

int main(int argc, char *argv[])
  {
  char buf[64], *sn;
  if (argc != 2)
    {
    fprintf(stderr, "Please call me as %s /dev/${hdd}\n", argv[0]);
    return 1;
    }
  sn = hdd_serial_no(argv[1], buf, sizeof(buf));
  if (!sn)  return 1;
  puts(sn);
  return 0;
  }

nobody ★★
()
Ответ на: комментарий от nobody

Есть идея написать прогу, которая собирает всю инфу о компе (типа Сандры, только полегче). Как насчёт ? Если такая уже есть - подскажите, я такой не нашёл :(

CKulT
()
Ответ на: комментарий от ugly-ugly-fucker

садишся за чей-то комп и начинаешь шарится по /proc, lspci, и т.д. А так запустил - и посмотрел сразу всё

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

> Есть идея написать прогу, которая собирает всю инфу о компе (типа Сандры, только полегче).

> Как насчёт ?

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

nobody ★★
()
Ответ на: комментарий от CKulT

> Не очень интересна, зато актуальна.

Ты ж вроде KDE юзаешь, а в нем есть что-то типа "центр информации". Разве это не оно?

> Предлагаю вообще, не только тебе ;)

Ок. Ты отвечал на мою мессагу, поэтому я решил, что предложение твое адресовано мне.

ЗЫ: завел бы ты отдельную тему, потому что здесь это обсуждение оффтопик.

nobody ★★
()
Ответ на: комментарий от nobody

Да не, kcontrol слишком бедненько ;) к тому же не у всех стоит КДЕ. Надо попробовать на шелле замутить что-нибудь. По теории есть lspci[-v[v]], df -h, hdparm и т.д. :)

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

шариться по чужим /proc итп. без приглашения -- дурной тон. плохо себе представляю кому такое может понадобиться, кроме м.б. скупщиков старого барахла; но у тех другие запросы -- надо и память протестировать например и харды, и на все это есть тулзы под дос которые грузят с флопа если сиди нет.

а показывать номер харда пользователю КДЕ -- зачем? тем более если уж комп чужой то эту программку еще ставить надо. тогда лучше и переносимее сделать скрипт. его опять-таки можно пускать если зашел на чужой комп через дыру в PHP :))) только зачем номер харда все одно понять не могу

ugly-ugly-fucker
()
Ответ на: комментарий от ugly-ugly-fucker

как будто на сериале харда свет клином сошёлся :)) Прихожу я на рабуоту к челу, допустим. Стоит линух. -Что за железо ? - Не знаю. И понеслась lspci, cat /proc/cpuinfo, /proc/mem ..., df -h и т.д. Занудно и д0лго :)

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