Permission Problem im selbererstellten C Programm

[tE]bachi

BSD Freak
Salü Zusammen

Habe nur ein kleines Problem...

Habe ein kleines C Progamm entwickelt (siehe Beilage). Ist schön und gut, da es eigentlich funktioniert. Einfach wenns Permission Probleme macht, ist der Path irgendwie falsch... habe das ganze mal mit dem Debugger getestet, aber habe den Fehler nicht gefunden...

Code:
datacount [-r | -l] [-h] [-d <dir>]
    -d      directory to count
    -r      recursive without symbolic link following
    -l      recursive with symbolic link following
    -h      help

greets

[tE]bachi
 

Anhänge

  • datacount.tar.gz
    1,8 KB · Aufrufe: 659
Hmmm... also wenn man als NICHT-Root einloggt und datacount ausführt:
Code:
[bachi@lan ~/src/datacount]$ ./datacount -d /
Regular File(s):     6
Directory(s):        17
Symbolic Link(s):    3
Character Device(s): 0
Block Device(s):     0
FIFO File(s):        0
Socket File(s):      0
Unknow File(s):      0
All Data:            26
Error(s):            0
ists ganz normal... aber wenn ich das rekursiv will, also in directorys, die ich keine berechtigung habe, ansehen will, kommt das...
Code:
[bachi@lan ~/src/datacount]$ ./datacount -d / -r
/tmp/migrate - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/tmp - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
/ - 13
Regular File(s):     33
Directory(s):        11
Symbolic Link(s):    13
Character Device(s): 1191
Block Device(s):     0
FIFO File(s):        0
Socket File(s):      8
Unknow File(s):      0
All Data:            1256
Error(s):            72

Hat jemand schon etwas herausgefunden?

greets

[tE]bachi
 
Wo ist das Problem? Du bekommst für jedes directory/file, das Du nicht 'stat'en darfst, die errno=13 (Permission denied). Was erwartest Du denn anderes?
 
geht eben nicht... zählt jedes File oder Directory durch... nur wenn ein Permission Problem auftritt -> Das Directory und alle nachfolgenden -> Error...

Code:
[bachi@lan ~/src/datacount]$ ls -la /usr
total 192
drwxr-xr-x  40 root     sys         1024 Oct  9 09:20 .
dr-xr-xr-x  76 root     root        2048 Oct  9 09:20 ..
drwx------  19 root     root         512 Oct  9 09:20 .hidden
drwxr-xr-x   2 root     bin         1024 Mar 19  2002 [...]
lrwxrwxrwx   1 root     root           5 Mar 19  2002 [...] -> ./bin
drwxr-xr-x   2 root     root         512 Jun 25  2002 [...]
lrwxrwxrwx   1 root     root           9 Mar 19  2002 X -> ./openwin
lrwxrwxrwx   1 root     root          10 Mar 19  2002 [...] -> [...]
drwxr-xr-x   9 root     bin          512 Mar 19  2002 [...]
drwx------   8 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x   4 root     bin        10752 Oct  9 09:20 bin
drwxr-xr-x   4 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x  14 root     bin          512 Jan 16  2003 [...]
lrwxrwxrwx   1 root     root          16 Mar 19  2002 dict -> ./share/lib/dict
drwxr-xr-x  10 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x   2 root     bin          512 Jan 16  2003 games
drwxr-xr-x  23 root     bin         4096 Jan 16  2003 include
drwxr-xr-x   7 root     bin          512 Jan 16  2003 [...]
lrwxrwxrwx   1 root     other          9 Mar 19  2002 [...] -> ./[...]
drwxr-xr-x   6 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x   7 root     bin          512 Jan 16  2003 [...]
drwxr-xr-x   9 root     sys          512 Mar 19  2002 kernel
drwxr-xr-x   2 root     bin          512 Jan 16  2003 kvm
drwxr-xr-x  62 root     bin        13824 Oct  9 09:20 lib
drwxr-xr-x  14 root     other        512 Dec 11  2002 local
drwx------   2 root     root        8192 Mar 19  2002 lost+found
lrwxrwxrwx   1 root     root          11 Jan 16  2003 mail -> ../var/mail
lrwxrwxrwx   1 root     root          11 Mar 19  2002 man -> ./share/man
lrwxrwxrwx   1 root     other         23 Jan 16  2003 [...] -> [...]
drwxr-xr-x   4 root     sys          512 Jan 16  2003 net
lrwxrwxrwx   1 root     root          11 Jan 16  2003 news -> ../var/news
drwxr-xr-x   5 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x   2 root     bin          512 Jan 16  2003 [...]
dr-xr-xr-x   8 root     backup       512 Mar 21  2003 [...]
dr-xr-xr-x   5 root     backup       512 Mar 18  2003 [...]
drwxr-xr-x   8 root     bin          512 Mar 19  2002 openwin
drwxr-xr-x   5 root     bin          512 Mar 19  2002 perl5
drwxr-xr-x  25 root     sys         1536 Jan 16  2003 [...]
lrwxrwxrwx   1 root     root          15 Jan 16  2003 preserve -> ../var/preserve
drwxr-xr-x   3 root     bin          512 Mar 19  2002 proc
lrwxrwxrwx   1 root     root          15 Jan 16  2003 pub -> ./share/lib/pub
drwxr-xr-x   9 root     bin          512 Jan 16  2003 [...]
drwxrwxrwx   6 root     bin         6656 Oct  9 09:20 sbin
drwxr-xr-x   6 root     sys          512 Jan 16  2003 share
drwxr-xr-x   6 root     bin          512 Mar 19  2002 [...]
drwxr-x---   8 root     other        512 Jan  8  2003 [...]
lrwxrwxrwx   1 root     root          12 Jan 16  2003 spool -> ../var/spool
lrwxrwxrwx   1 root     root          11 Jan 16  2003 src -> ./share/src
lrwxrwxrwx   1 root     root          10 Jan 16  2003 tmp -> ../var/tmp
drwxr-xr-x   4 root     bin         2048 Jan 16  2003 [...]
drwxr-xr-x   4 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x   4 root     bin         1024 Mar 19  2002 [...]
drwxr-xr-x   7 root     bin          512 Mar 19  2002 [...]
drwxr-xr-x   5 root     bin          512 Jan 16  2003 [...]
aber nach dem zweiten Directory (/usr/lost+found) und nachfolgenden Directories mach es ein Error pro File oder Directory...
Code:
Regular File(s):     0
Directory(s):        1
Symbolic Link(s):    0
Character Device(s): 0
Block Device(s):     0
FIFO File(s):        0
Socket File(s):      0
Unknow File(s):      0
All Data:            1
Error(s):            52

greets

[tE]bachi
 
OK, jetzt verstehe ich es. Du gehst in deinem Code davon aus, das readdir reentrant ist. Ist es aber nicht. Stell Deinen Code mal so aus, dass Du readdir_r benutzt, dann solle es funktionieren (oder mache die Rekursion ausserhalb der readdir Schleife).
 
hmmm... als ist das ganze problem in einer funktion. wiso muss den readdir ausserhalb "aufbewahrt" werden?
habe 'dir' und 'data' nicht static gemacht... und bei permission problemen kommen die 'countData' funktion nur bis zu opendir, und kommt nicht zu readdir durch...
 
Zuletzt bearbeitet:
Habe eine kleine Frage... was ist "reentrant"? Auf dict.leo.org sagt es mir in Deutsch "ablaufinvariant", was ich aber auch nicht verstehe...
 
Der Punkt ist der, das readdir() seinen eigenen Zustand hat. Es ist dafür designed, so aufgerufen zu werden:
Code:
dir1 = opendir()
readdir(dir1)
readdir(dir1)...

dir2 = opendir()
readdir(dir2)
readdir(dir2)

Was Du machst, ist:
Code:
dir1 = opendir()
readdir(dir1)

// durch die Rekursion:
dir2 = opendir()
readdir(dir2)
readdir(dir2)

// und raus aus der Rekursion:
readdir(dir1)...
Der Punkt dabei ist, das das readdir(dir2) dir den Zustand kaputt gemacht hat, und das readdir(dir1) deshalb in die Hose geht...

Die gleichen Problem treten auf, wenn verschiedene Threads innerhalb eines multithreaded Programms readdir() benutzen wollen. Und *deshalb* gibt es die readdir_r() Funktion, der Du einen Speicherplatz zum ablegen ihres Zustandes mitgeben musst. Und den kannst Du dann lokal pro Rekursionsebene auf dem Stack o.ä. allozieren...
 
Original geschrieben von current
Der Punkt dabei ist, das das readdir(dir2) dir den Zustand kaputt gemacht hat, und das readdir(dir1) deshalb in die Hose geht...
also, wenn ich z.B. nur auf mein Home Directory "zähle", natürlich auch rekursiv, macht er alles richtig... habs nachgezählt. nur wenn ich z.B. permission errors habe, schmiert er ab...
Original geschrieben von current
Und *deshalb* gibt es die readdir_r() Funktion, der Du einen Speicherplatz zum ablegen ihres Zustandes mitgeben musst.
hab mal readdir_r() benutzt... habe zwar das programm fertiggestellt (siehe anhang), aber wie funktioniert readdir_r() überhaupt...
und bei sunos 5.8 habe ich nur 2 Parameter, nicht wie bei der POSIX funktion.

greets

[tE]bachi
 

Anhänge

  • datacount.tar.gz
    2 KB · Aufrufe: 576
Zurück
Oben