[ salec @ 02.07.2004. 14:38 ] @
Posto se u pozivima read, write i llseek ne pojavljuje inode, kako onda da navatam minor broj tog device-a?
[ caboom @ 02.07.2004. 20:56 ] @
koristi stat da dobijes inode fajla (man 2 stat), mada ti u sustini i ne treba inode - mos' da koristis 'vako nesto:

Code:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/kdev_t.h>

int main()
{
  dev_t device;
  struct stat f_stat;
                
  if (stat ("/dev/hda", &f_stat) == -1)
  {
    fprintf(stderr, "baah!\n");
    exit (-1);
  }
    
  device = f_stat.st_rdev;
  printf ("major %u, minor %u\n", major(device), minor(device));
                
  return 0;
}


takodje bi major, minor number dobio i sa npr:

Code:

[email protected]: ~ % ls -l /dev/hda 
brw-rw----  1 root disk 3, 0 Feb 23 22:02 /dev/hda
[email protected]: ~ % ls -l /dev/hdd         
brw-rw----  1 root disk 22, 64 Feb 23 22:02 /dev/hdd
[email protected]: ~ % cat /proc/devices 
Character devices:
  1 mem
    4 /dev/vc/0
    4 tty
    4 ttyS
    5 /dev/tty
    5 /dev/console
    5 /dev/ptmx
    7 vcs
    10 misc
    13 input
    14 sound
    21 sg
    36 netlink
    81 video4linux
    89 i2c
    108 ppp
    116 alsa
    128 ptm
    136 pts
    180 usb
    202 cpu/msr
    203 cpu/cpuid
    226 drm

Block devices:
    2 fd
    3 ide0
    7 loop
    9 md
    11 sr
    22 ide1
    43 nbd
    253 device-mapper
    254 mdp


u /proc/devices-u doduse stoje samo major number-i.
[ salec @ 05.07.2004. 10:56 ] @
Izvini, sad vidim da nisam napisao da se u pitanju radi o kernel modulu (drajveru) koji treba da funkcionise razlicito za razlicite minor brojeve.

Znaci, neko je otvorio device fajl za moj uredjaj i sad, za neki minor broj hocu da read i write rade na jedan nacin, a na razlicit za neki drugi minor broj. A vidim da read i write nemaju kao ulazni parametar pointer na inode nego samo pointer na file, gde nema na prvi pogled nicega sto bi posluzilo za pronalazenje inode-a, pa me je zanimalo kako to da izvedem.

U medjuvremenu sam u Rubinijevoj knjizi pronasao da se to radi prilikom open-a, da tada upisem u file strukturu doticnog fajla pointer na odgovarajucu fops strukturu koju sam spremio za taj slucaj... a ja sam zamisljao da mi u okviru svake funkcije treba switch (minor).. case (sto je moguce kod ioctl, koji se poziva sa jednim od parametara - pointerom na inode, ali ne i kod read i write koji to nemaju), pa sam zato pitao... mislim, ove file operations kanda da nisu sve od iste fele...
[ caboom @ 11.07.2004. 10:31 ] @
pa pazi, na kraju se sve zavrsava time da moraju da se postuju POSIX standardi u neku ruku, ali ako ti treba drugaciji nivo apstrakcije nad open/read/write-om uvek mozes da napises svoj api i dodas svoje ekvivalente syscall-ova u kernelu. jeste okolo-izokola, ali time se oslobadjas tereta koji nose standardi i sa druge strane takodje smanjujes portabilnost onoga sto si napisao.