Toon posts:

[C/Linux] major/minor node openen in plaats van device

Pagina: 1
Acties:

Verwijderd

Topicstarter
Met open (2) kan ik een device file openen. Ik wil nu een character device openen zonder dat ik hierbij een device file hoef te zoeken. Als voorbeeld neem ik /dev/dsp:

code:
1
2
$ ls -la /dev/dsp
crw-------    1 rbultje  root      14,   3 Jan 30  2003 /dev/dsp


Character device, major=14, minor=3. Nu wil ik dus een applicatie maken die deze character device met major=14 en minor=3 opent zonder dat hij weet dat /dev/dsp hierbij hoort. Bijvoorbeeld iets als dit:

C:
1
2
3
4
5
6
7
8
int major = 14, minor = 3, fd;
char *tempdev = "/tmp/.temp.XXXXXX", command[256];
tempdev = mktemp (tempdev);
snprintf (command, sizeof (command), "mknod %s c %d %d",
          tempdev, major, minor);
system (command);
fd = open (tempdev, O_RDONLY);
[etc.]


Zo kan ik dus die device openen zonder dat ik de locatie van de device file hoef te weten. :). Echter, dit is uberlelijk en er zit een race condition in (zie man 2 mktemp). Ik zou liever dat hele device file system passeren en direct de node met major=14 en minor=3 openen. Weet iemand een manier om dat te doen? :?.

edit:
.oisyn, je hebt gelijk, heb ik meteen ff aangepast. :Y).

[ Voor 5% gewijzigd door Verwijderd op 10-10-2003 13:49 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-08 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sorry, geen inhoudelijke reactie mbt je probleem, maar:
C++:
1
char *tempdev = strdup ("/tmp/.temp.XXXXXX")

Waarom geen:
C++:
1
char tempdev[] = "/temp/.temp.XXXXXX"


Scheelt je weer een geheugenallocatie en een free (en een potentiele memoryleak) :)

[ Voor 7% gewijzigd door .oisyn op 10-10-2003 13:18 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
/me * Toch nog maar een keer proberen... Please? :).

Verwijderd

Ik denk niet dat het zonder files kan.. misschien kan je gewoon /dev scannen en dan iets van

C:
1
2
3
4
5
6
7
8
9
struct stat st;
...
while(...) {
  stat(filename, &st);
  if(MINOR(st.st_rdev) == minor && MAJOR(st.st_rdev) == major) {
  ...
  }
  ...
}


Misschien niet wat je wilt, maar iets beters zou ik ook niet direct weten..

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Verwijderd schreef op 13 October 2003 @ 12:12:
Ik denk niet dat het zonder files kan.. misschien kan je gewoon /dev scannen
Maar dan kun je 'm helemaal niet openen als je er geen device node van hebt staan in /dev.

Ik weet ook niets beters, trouwens...

Verwijderd

Dat is waar.. Overigens kan je wel veilige temp files maken volgens http://www.dwheeler.com/s...race.html#TEMPORARY-FILES
The GNOME programming guidelines recommend the following C code when creating filesystem objects in shared (temporary) directories to securely open temporary files [Quintero 2000]:

char *filename;
int fd;

do {
filename = tempnam (NULL, "foo");
fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600);
free (filename);
} while (fd == -1);

Note that, although the insecure function tempnam(3) is being used, it is wrapped inside a loop using O_CREAT and O_EXCL to counteract its security weaknesses, so this use is okay. Note that you need to free() the filename. You should close() and unlink() the file after you are done. If you want to use the Standard C I/O library, you can use fdopen() with mode "w+b" to transform the file descriptor into a FILE *.
Overigens kan je mknod(2) gebruiken.. dan vermijdt je tenminste weer een system().

Verwijderd

Verwijderd schreef op 13 October 2003 @ 12:43:
Overigens kan je mknod(2) gebruiken.. dan vermijdt je tenminste weer een system().
Ehm, daar zou je wel weer eens een race mee kunnen introduceren..

Verwijderd

Topicstarter
Verwijderd schreef op 13 October 2003 @ 12:43:
Overigens kan je mknod(2) gebruiken.. dan vermijdt je tenminste weer een system().
Mjah, mknod(2) of system("mknod [..]") heeft als nadeel dat alleen een syadmin dat mag doen. en mijn applicatie moet kunnen runnen als elke user die rechten tot die node heeft (zijn rechten eigenlijk node-based of device-based?). Het afscannen van /dev klinkt nog wel als een acceptabel iets, het hoeft toch alleen maar als de applicatie opstart (misschien zelfs alleen de eerste keer). En desnoods maak ik een splash screen. ;).

  • igmar
  • Registratie: April 2000
  • Laatst online: 29-06 18:56

igmar

ISO20022

Verwijderd schreef op 10 oktober 2003 @ 10:57:
Met open (2) kan ik een device file openen. Ik wil nu een character device openen zonder dat ik hierbij een device file hoef te zoeken. Als voorbeeld neem ik /dev/dsp:

code:
1
2
$ ls -la /dev/dsp
crw-------    1 rbultje  root      14,   3 Jan 30  2003 /dev/dsp


Character device, major=14, minor=3. Nu wil ik dus een applicatie maken die deze character device met major=14 en minor=3 opent zonder dat hij weet dat /dev/dsp hierbij hoort. Bijvoorbeeld iets als dit:
<snip>
Niet mogelijk. Op die manier zou je als gebruiker alle bestandspermissies op devices kunnen omzeilen, en da's niet fijn.
Devices openen gaat altijd via een device file, nooit op basis van een major / minor nummer. De kernel is degene die major,minor omzet in access naar get correcte device.

Je kan 2 dingen doen :

1) De /dev directory scannen
2) Zelf met mknod() een device file aanmaken. Nadeel : Je hebt root access nodig

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Als het systeem devfs gebruikt (checken op het bestaan van /dev/.devfsd), dan hoef je alleen een lookup te doen op de file, als het goed is wordt dan (wanneer nodig) de module geladen. Dat scheelt je heel /dev afzoeken.

"He took a duck in the face at two hundred and fifty knots."


  • igmar
  • Registratie: April 2000
  • Laatst online: 29-06 18:56

igmar

ISO20022

_Squatt_ schreef op 13 October 2003 @ 18:06:
Als het systeem devfs gebruikt (checken op het bestaan van /dev/.devfsd), dan hoef je alleen een lookup te doen op de file, als het goed is wordt dan (wanneer nodig) de module geladen. Dat scheelt je heel /dev afzoeken.
Als ja.. Da's op veel systemen niet het geval, en op iets anders als Linux is het zeker niet aanwezig.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
igmar schreef op 14 October 2003 @ 09:17:
Als ja.. Da's op veel systemen niet het geval, en op iets anders als Linux is het zeker niet aanwezig.
Het ging de topic starter ook om Linux, dus dat is niet fout. Overigens heeft FreeBSD sinds versie 5 ook een device filesystem (devfs) maar in of dat hetzelfde is als de Linux-variant zou ik niet weten.
Pagina: 1