Fritz!Box 7170: andere Werte bei stat und fstat st_mode S_IFDIR, S_IFREG

netsub

Neuer User
Mitglied seit
30 Mrz 2008
Beiträge
30
Punkte für Reaktionen
0
Punkte
0
?!?!, stat und fstat liefern andere Werte in st_mode als in "sys/stat.h" definiert (siehe unten).


stat.h:
Code:
#ifndef _EGG_STAT_H
#define _EGG_STAT_H

#ifndef S_ISDIR
#  ifndef S_IFMT
#    define S_IFMT   0170000 /* Bitmask for the file type bitfields */
#  endif
#  ifndef S_IFDIR
#    define S_IFDIR  0040000 /* Directory                           */
#  endif
#  define S_ISDIR(m) (((m)&(S_IFMT)) == (S_IFDIR))
#endif
#ifndef S_IFREG
#  define S_IFREG    0100000 /* Regular file                        */
#endif
#ifndef S_IFLNK
#  define S_IFLNK    0120000 /* Symbolic link                       */
#endif

#endif /* _EGG_STAT_H */


liefert auf Fritz!Box 7170 original Firmware aber:
st_mode ist 0000001 bei einem regular file
st_mode ist 0000002 bei einem directory

was ist da los?

(aufgefallen nach dem Kompilieren und Ausführen von eggdrop)
 
Zuletzt bearbeitet:
Und wie genau hast Du das festgestellt? Hast Du strace auf das Programm ausgeführt?

Wenn stat nicht richtig funktionieren würde, würden auch viele Programme auf der Box nicht richtig funktionieren.
 
ich habe mir den wert ausgeben lassen. (eggdrop)
ich kann heute abend gerne mal den kompilierten eggdrop posten,
der diese ausgabe macht.
 
So, habe mir in der eggdrop main mal folgenden code zum test von stat eingebaut:

Code:
int main(int argc, char **argv)
{
  int i;
  struct stat ss;

  *argv++;
  i = stat(*argv, &ss);
  printf("stat(%s) return=%x stat.st_mode=%x\n", *argv, i, ss.st_mode);

  exit(0);

  // ..
  // ..
}

habs noch inn attach gepackt, damit andere es selbst testen können.
am Besten auch jemand mit gemoddeter firmware und jemand mit original firmware!


dann getestet:

Code:
# teststat /var/tmp
stat(/var/tmp) return=0 stat.st_mode=3

# teststat /var/tmp/passwd
stat(/var/tmp/passwd) return=0 stat.st_mode=1

# teststat /var/ext
stat(/var/ext) return=0 stat.st_mode=e

# teststat /bin
stat(/bin) return=0 stat.st_mode=1

# teststat /var/ext/bin
stat(/var/ext/bin) return=0 stat.st_mode=2

#

/var/ext ist ein symlink auf einen externen usbstick (fat32)
Code:
# ls -la /var/ext
lrwxrwxrwx    1 root     root           26 Jun 27 22:00 /var/ext -> /var/media/ftp/LGXTICK-01
#


warum gibt stat so komische Werte aus ?!!!??
sogar für Verzeichnisse unterschiedliche Werte!


attachment: Anhang anzeigen teststat.zip

post back!
 
Wie bereits geschrieben, funktioniert stat durchaus. Das Problem ist eher deine Build-Umgebung.

Hast Du den Eindruck, Dein Test-Programm wäre auf einer original Firmware ausführbar? Und wenn nicht, welche Änderungen sind dann notwendig?
 
Build-Umgebung: freetz-1.0.1 (StinkyLinux VM Image)
Firmware: Fritz!Box 7170 original


Nachtrag:
Code:
# teststat /non-existant-file
stat(/non-existant-file) return=ffffffff stat.st_mode=0
#

stat auf ein nicht existentes file gibt wie es richtig ist -1 zurück.
(st_mode ist bei return=-1 nicht zu berücksichtigen, da das struct in diesem Fall nicht befüllt wird)


post back!
 
Bei mir ist Dein Testprogramm überhaupt nicht ausführbar. Daher die Frage, was denn an Voraussetzungen für dieses Programm notwendig ist.

Wie Du richtig geschrieben hast, bringt der Aufruf von stat auf eine nicht existierende Datei für dieses Problem gar nichts.

Hast Du mal strace auf das Programm laufen lassen?
Hast Du mal den Code aus dem obigen Beitrag als eigenständiges Programm erstellt und nicht als Bestandteil von eggdrop?
 
Bei mir ist Dein Testprogramm überhaupt nicht ausführbar.
Mit dieser nicht-fehlerbeschreibung kann man nicht viel anfangen. (NHF)
Fehlerbeschreibung?

Aber, trotzdem ist mir durch Ihre Nachfrage eingefallen, dass eggdrop ja libtcl braucht:

Code:
# teststat /non-existant-file
teststat: can't load library 'libtcl8.5.so'
#

deswegen hier die lib: Anhang anzeigen libtcl8.5.zip

welche Voraussetzungen sonst erforderlich sind weiss ich nicht. Wenn mir jemand spezifischere Eingrenzungen als "Voraussetzungen" nennen kann, probiere ich die info zu finden.



Hast Du mal strace auf das Programm laufen lassen?

Nein, aber:
Code:
# strace teststat /non-existant-file
-sh: strace: not found
#
für was wird die strace info benötigt ?



Hast Du mal den Code aus dem obigen Beitrag als eigenständiges Programm erstellt und nicht als Bestandteil von eggdrop?

Nein, leider kann ich das nicht, da ich null plan von dieser ganzen linux kompilierungs-******* habe, ich hasse es, ich bin froh dass wenigstens fertige packages sich einigermaßen kompilieren lassen. (NHF)



Weitere Infos:
Code:
# busybox
BusyBox v1.8.2 (2009-04-22 13:54:57 CEST) multi-call binary
#
# cat /proc/version
Linux version 2.6.13.1-ohio (2895) (gcc-Version 3.4.6) #1 Wed Jan 27 13:20:43 CET 2010
#
# uname -a
Linux fritz.fonwlan.box 2.6.13.1-ohio #1 Wed Jan 27 13:20:43 CET 2010 mips unknown
#
und wie schon gesagt:
- Build-Umgebung: freetz-1.0.1 (StinkyLinux VM Image)
- Firmware: Fritz!Box 7170 original



Danke das sich einer der Ahnung hat mit dem Thread befasst!,
post back!
 
Zuletzt bearbeitet:
Genau, libtcl fehlt, es war anscheinend auch die einzige fehlende Library. Es ändert aber nichts daran, dass das Programm so nicht funktioniert.
für was wird die strace info benötigt ?
Es gibt in Freetz ein Paket strace. Mit strace kann man sehen, welche Systemaufrufe ein Programm durchführt. Mit hoher Wahrscheinlichkeit würdest Du damit sehen, dass stat die richtigen Werte zurück gibt.
Nein, leider kann ich das nicht, da ich null plan von dieser ganzen linux kompilierungs-******* habe
Code:
toolchain/target/bin/mipsel-linux-gcc -o teststat teststat.c
Wenn ich damit ein Testprogramm erstelle, gibt es die richtigen Werte aus.
Ich empfehle, die Ausgabeformate von printf noch etwas zu ändern, dann ist das Ergebnis lesbarer. Das ändert aber nichts am prinzipiellen Problem.
Code:
  printf("stat(%s) return=%d stat.st_mode=%o\n", *argv, i, ss.st_mode);

ich bin froh dass wenigstens fertige packages sich einigermaßen kompilieren lassen.
Soweit ich weiß, ist eggdrop kein Paket aus Freetz, und das Programm ist definitiv falsch erstellt, von daher lässt sich das Programm zwar kompilieren, funktioniert aber nicht richtig.

Das Problem ist, dass Dein teststat Programm den Link-Zähler der Datei ausgibt, zumindest bei mir. Das ist auch der Grund, warum auch bei Verzeichnissen verschiedene Werte herauskommen. Bei Dateien ist der Link-Zähler typischerweise 1. Das einzige, was mich wundert ist, dass Du bei /bin den Wert 1 hast und nicht 2.
 
Hallo Herr Friedl, vielen Dank für den kompetenten Input!

Es ändert aber nichts daran, dass das Programm so nicht funktioniert.
"so nicht", wie meinen Sie das ? wie nicht ?

also dann checke ich gleich mal die direkte Kompilierung nach deiner vorgeschlagenen Aufrufszeile, und poste dann wieder.
strace probiere ich dann auch gleich mal aus.

Wie sind Sie darauf gekommen dass der "Link-Zähler" ausgegeben wird statt dem mode ?
Im struct ist es ja st_mode; ist möglicherweise das struct falsch definiert, so dass st_mode auf das Linkcount Feld zugreift
statt auf den mode! ?
 
Zuletzt bearbeitet:
strace:
Code:
# strace teststat /var/ext
execve("/var/ext/bin/teststat", ["teststat", "/var/ext"], [/* 180 vars */]) = 0
svr4_syscall()                          = -1 ERRNO_4090 (Unknown error 4090)
stat("/etc/ld-uClibc.so.cache", 0x7fd04880) = -1 ENOENT (No such file or directory)
open("/lib/libtcl8.5.so", O_RDONLY)     = -1 ENOENT (No such file or directory)
open("/var/ext/lib/libtcl8.5.so", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=1270707, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\200\367\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 1146880, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aabe000
old_mmap(0x2aabe000, 1038316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2aabe000
old_mmap(0x2abcb000, 40708, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xfd000) = 0x2abcb000
old_mmap(0x2abd5000, 3056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2abd5000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libm.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=114004, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0@\22\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 176128, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2abd6000
old_mmap(0x2abd6000, 105588, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2abd6000
old_mmap(0x2ac00000, 500, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1a000) = 0x2ac00000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libpthread.so.0", O_RDONLY)  = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=96836, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0 4\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 151552, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac01000
old_mmap(0x2ac01000, 53416, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ac01000
old_mmap(0x2ac1e000, 22440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x2ac1e000
old_mmap(0x2ac24000, 6816, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac24000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libdl.so.0", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=9436, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0000\10\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 77824, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac26000
old_mmap(0x2ac26000, 6432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ac26000
old_mmap(0x2ac37000, 4272, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x2ac37000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libnsl.so.0", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=4896, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\220\3\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 73728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac39000
old_mmap(0x2ac39000, 964, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ac39000
old_mmap(0x2ac4a000, 28, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x1000) = 0x2ac4a000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libssl.so.0.9.8", O_RDONLY)  = 3
fstat(3, {st_mode=S_IFREG|0555, st_size=202136, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\320j\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 253952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac4b000
old_mmap(0x2ac4b000, 179844, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ac4b000
old_mmap(0x2ac86000, 10416, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x2b000) = 0x2ac86000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libcrypto.so.0.9.8", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0555, st_size=1027728, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\0^\2\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 1003520, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac89000
old_mmap(0x2ac89000, 866092, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ac89000
old_mmap(0x2ad6d000, 59564, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xd4000) = 0x2ad6d000
old_mmap(0x2ad7c000, 6528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ad7c000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0555, st_size=214462, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\300\26\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 122880, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ad7e000
old_mmap(0x2ad7e000, 55156, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ad7e000
old_mmap(0x2ad9b000, 3284, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x2ad9b000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaae000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0`\221\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 671744, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ad9c000
old_mmap(0x2ad9c000, 571940, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ad9c000
old_mmap(0x2ae37000, 7596, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x8b000) = 0x2ae37000
old_mmap(0x2ae39000, 24784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ae39000
close(3)                                = 0
munmap(0x2aaae000, 4096)                = 0
open("/lib/libdl.so.0", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=9436, ...}) = 0
close(3)                                = 0
open("/lib/libpthread.so.0", O_RDONLY)  = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=96836, ...}) = 0
close(3)                                = 0
open("/lib/libm.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=114004, ...}) = 0
close(3)                                = 0
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0555, st_size=214462, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libcrypto.so.0.9.8", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0555, st_size=1027728, ...}) = 0
close(3)                                = 0
open("/lib/libdl.so.0", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=9436, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libdl.so.0", O_RDONLY)       = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=9436, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0777, st_size=615072, ...}) = 0
close(3)                                = 0
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0777, st_size=22628, ...}) = 0
mprotect(0x2ac1e000, 4096, PROT_READ)   = 0
mprotect(0x2ac37000, 4096, PROT_READ)   = 0
mprotect(0x2ae37000, 4096, PROT_READ)   = 0
mprotect(0x2aabc000, 4096, PROT_READ)   = 0
ioctl(0, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
getpid()                                = 2062
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=717352936}) = 0
setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=717352936}) = 0
rt_sigaction(SIGRT_0, {SIG_DFL}, NULL, 16) = 0
rt_sigaction(SIGRT_1, {SIG_DFL}, NULL, 16) = 0
rt_sigaction(SIGRT_2, {SIG_DFL}, NULL, 16) = 0
rt_sigprocmask(SIG_BLOCK, [RT_0], NULL, 16) = 0
rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 16) = 0
brk(0)                                  = 0x484000
brk(0x485000)                           = 0x485000
stat("/var/ext", {st_mode=S_IFDIR|0777, st_size=16384, ...}) = 0
write(1, "stat(/var/ext) return=0 stat.st_"..., 39stat(/var/ext) return=0 stat.st_mode=e
) = 39
exit(0)                                 = ?
#

stat("/var/ext", {st_mode=S_IFDIR|0777, st_size=16384, ...}) = 0
es scheint also wie Sie gesagt haben, intern funktioniert stat richtig,
alles andere wäre auch sehr ungewöhnlich.


UPDATE:
Habe einen Verdacht was es sein könnte,
Auszug der struct stat Definition in bits/stat.h:
Code:
/* Structure describing file characteristics.  */
struct stat
  {
        __dev_t st_dev;
    long int st_pad1[3];
#ifndef __USE_FILE_OFFSET64
    __ino_t st_ino;             /* File serial number.          */
#else
    __ino64_t st_ino;           /* File serial number.          */
#endif
    __mode_t st_mode;           /* File mode.  */
    __nlink_t st_nlink;         /* Link count.  */
    __uid_t st_uid;             /* User ID of the file's owner. */
    __gid_t st_gid;             /* Group ID of the file's group.*/
    __dev_t st_rdev;    /* Device number, if device.  */
#ifndef __USE_FILE_OFFSET64
    long int st_pad2[2];
    __off_t st_size;            /* Size of file, in bytes.  */
    /* SVR4 added this extra long to allow for expansion of off_t.  */
    long int st_pad3;
#else
    long int st_pad2[3];
    __off64_t st_size;          /* Size of file, in bytes.  */
#endif
    /*
     * Actually this should be timestruc_t st_atime, st_mtime and
     * st_ctime but we don't have it under Linux.
     */
    __time_t st_atime;          /* Time of last access.  */
    long int __reserved0;
    __time_t st_mtime;          /* Time of last modification.  */
    long int __reserved1;
    __time_t st_ctime;          /* Time of last status change.  */
    long int __reserved2;
    __blksize_t st_blksize;     /* Optimal block size for I/O.  */
#ifndef __USE_FILE_OFFSET64
    __blkcnt_t st_blocks;       /* Number of 512-byte blocks allocated.  */
#else
    long int st_pad4;
    __blkcnt64_t st_blocks;     /* Number of 512-byte blocks allocated.  */
#endif
    long int st_pad5[14];
  };
#

Angenommen das directive __USE_FILE_OFFSET64 wäre definiert,
dann würde st_ino (File serial number) 64bit statt 32bit sein,
demnach ist der befüllte struct Inhalt verschoben zu den Member-Definitionen,
in st_mode wäre dann eine 32bit Hälfte von st_ino (da 64bit).

Das müsste es sein! was meinen Sie, Herr Friedl?

Die Frage daran ist aber, warum ist __USE_FILE_OFFSET64 definiert ? Kann mir da jemand mögliche Ursachen nennen!
ich habe mal den kompletten Ordner von eggdrop durchsucht (nicht nur sources, komplettes Ober-Verzeichnis mit auch configure und make file), kein Treffer auf USE_FILE_OFFSET !

Wo oder Wie könnte dieses Directive gesetzt werden ?!?!?

post back!
 
Zuletzt bearbeitet:
habe nun einzeln das teststat kompiliert,
immer noch das gleiche fehlverhalten :(

und an __USE_FILE_OFFSET64 scheint es ebenfalls nicht zu liegen:
habe gleich noch einen kleinen test wegen dem __USE_FILE_OFFSET64
eingebaut:

CODE:
Code:
# cat /var/ext/bin/teststat.c

#undef __USE_FILE_OFFSET64
#include <sys/stat.h>

/* Structure describing file characteristics.  */
struct mystat32
  {
        __dev_t st_dev;
    long int st_pad1[3];

    __ino_t st_ino;             /* File serial number.          */

    __mode_t st_mode;           /* File mode.  */
    __nlink_t st_nlink;         /* Link count.  */
    __uid_t st_uid;             /* User ID of the file's owner. */
    __gid_t st_gid;             /* Group ID of the file's group.*/
    __dev_t st_rdev;    /* Device number, if device.  */

    long int st_pad2[2];
    __off_t st_size;            /* Size of file, in bytes.  */
    /* SVR4 added this extra long to allow for expansion of off_t.  */
    long int st_pad3;

    /*
     * Actually this should be timestruc_t st_atime, st_mtime and
     * st_ctime but we don't have it under Linux.
     */
    __time_t st_atime;          /* Time of last access.  */
    long int __reserved0;
    __time_t st_mtime;          /* Time of last modification.  */
    long int __reserved1;
    __time_t st_ctime;          /* Time of last status change.  */
    long int __reserved2;
    __blksize_t st_blksize;     /* Optimal block size for I/O.  */

    __blkcnt_t st_blocks;       /* Number of 512-byte blocks allocated.  */

    long int st_pad5[14];
  };


#define __USE_FILE_OFFSET64 1

/* Structure describing file characteristics.  */
struct mystat64
  {
        __dev_t st_dev;
    long int st_pad1[3];
#ifndef __USE_FILE_OFFSET64
    __ino_t st_ino;             /* File serial number.          */
#else
    __ino64_t st_ino;           /* File serial number.          */
#endif
    __mode_t st_mode;           /* File mode.  */
    __nlink_t st_nlink;         /* Link count.  */
    __uid_t st_uid;             /* User ID of the file's owner. */
    __gid_t st_gid;             /* Group ID of the file's group.*/
    __dev_t st_rdev;    /* Device number, if device.  */
#ifndef __USE_FILE_OFFSET64
    long int st_pad2[2];
    __off_t st_size;            /* Size of file, in bytes.  */
    /* SVR4 added this extra long to allow for expansion of off_t.  */
    long int st_pad3;
#else
    long int st_pad2[3];
    __off64_t st_size;          /* Size of file, in bytes.  */
#endif
    /*
     * Actually this should be timestruc_t st_atime, st_mtime and
     * st_ctime but we don't have it under Linux.
     */
    __time_t st_atime;          /* Time of last access.  */
    long int __reserved0;
    __time_t st_mtime;          /* Time of last modification.  */
    long int __reserved1;
    __time_t st_ctime;          /* Time of last status change.  */
    long int __reserved2;
    __blksize_t st_blksize;     /* Optimal block size for I/O.  */
#ifndef __USE_FILE_OFFSET64
    __blkcnt_t st_blocks;       /* Number of 512-byte blocks allocated.  */
#else
    long int st_pad4;
    __blkcnt64_t st_blocks;     /* Number of 512-byte blocks allocated.  */
#endif
    long int st_pad5[14];
  };



int main(int argc, char **argv)
{
  int i;
  struct stat ss;
  struct mystat32 ss32;
  struct mystat64 ss64;

  *argv++;
  i = stat(*argv, &ss);

  printf("sizeof(ss32)=%o\n", sizeof(ss32));
  printf("sizeof(ss64)=%o\n", sizeof(ss64));
  printf("sizeof(ss)=%o\n", sizeof(ss));
  printf("stat(%s) return=%x stat.st_mode=%o\n\n", *argv, i, ss.st_mode);

  exit(0);
}
#


OUTPUT:
Code:
# tstat /var/tmp/passwd
sizeof(ss32)=230
sizeof(ss64)=260
sizeof(ss)=230
stat(/var/tmp/passwd) return=0 stat.st_mode=1

#


ich checks gar nicht mehr ?!?!? !! :(

attachment: Anhang anzeigen teststat.zip


post back!
 
Zuletzt bearbeitet:
Mit "so nicht" meine ich, dass das Programm, so wie es erstellt wurde, nicht funktioniert, was auch immer der Grund dafür sein mag. Der Zugriff auf die stat Struktur funktioniert nicht richtig, und Du hättest nicht soweit herum experimentiert, wenn es nicht auch ein Problem mit dem Programm selbst gegeben hätte.

Auf den Link-Zähler komme ich zum einen deswegen, weil er in der Struktur direkt dahinter ist. Auf die Idee, das nachfolgende Feld anzuschauen bin ich gekommen, weil ich mir das Programm angeschaut habe. Vereinfacht sieht es so aus:

teststat:
Code:
  addiu   a1,sp,24
  #Aufruf von stat
  lw      a3,48(sp)

Mein Programm:
Code:
  addiu   a1,sp,24
  #Aufruf von stat
  lw      a3,44(sp)

Mein Programm greift auf den Offset 20 zu (44=24+20). Dein Programm greift auf Offset 24 zu (48=24+24), also das darauf folgende Feld.
Diese Vermutung wird durch die ausgegebenen Werte bestätigt, es ist der Link-Zähler, bis auf das Beispiel mit /bin und der 1.

Das Programm und der Kernel verwenden also ein unterschiedliches Layout der Struktur.

Zu den direkten Ursachen gibt es zwei Möglichkeiten:
Wie Du richtig geschrieben hast, wird die Definition der Struktur stat von __USE_FILE_OFFSET64 beeinflusst. Ob dieser Wert definiert ist, kannst Du leicht im Programm feststellen.
Eine andere Möglichkeit ist, dass "stat" in der Datei sys/stat.h unter bestimmten Bedingungen als "stat64" definiert wird, insbesondere wenn __USE_FILE_OFFSET64 definiert ist und __REDIRECT_NTH nicht). Auch das lässt sich leicht im Programm überprüfen.

Für stat64 wäre der Offset 24 korrekt. Wie man am strace sehen kann, wird aber stat aufgerufen und nicht stat64. Es wird also eine Funktion für das 32-Bit Layout aufgerufen, aber ein 64-Bit Layout erwartet. Normalerweise sollte das nicht passieren. Vielleicht tut eggdrop da etwas, was die für besonders schlau halten.

Das Symbol __USE_FILE_OFFSET64 sollte nicht von einem Anwendungsprogramm definiert werden, diese Symbol (und andere) werden in Abhängigkeit von anderen Symbolen, die vom Programm kommen, in der Datei features.h definiert. Dort wird __USE_FILE_OFFSET64 definiert, wenn _FILE_OFFSET_BITS=64 definiert ist.

Wenn ich mein Programm mit _FILE_OFFSET_BITS=64 erstelle, sieht es so aus:
Code:
  addiu   a1,sp,24
  #Aufruf von stat64
  lw      a3,48(sp)
Dann wird der Offset 24 (48=24+24) verwendet, aber es wird stat64 aufgerufen, und stat64 liefert st_mode an dieser Stelle, so das das Programm damit auch funktioniert.

Wie schon oben geschrieben, ist es einfach, ein kleiner Programm direkt zu übersetzen:

Datei teststat.c
Code:
#include <stdio.h>
#include <sys/stat.h>
#include <stddef.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  int i;
  struct stat ss;

  *argv++;
  i = stat(*argv, &ss);
  printf("stat(%s) return=%d stat.st_mode=%o @%d\n", *argv, i, ss.st_mode, offsetof (struct stat, st_mode));

  exit(0);
}
Übersetzen:
Code:
toolchain/target/bin/mipsel-linux-gcc -o teststat32 teststat.c
toolchain/target/bin/mipsel-linux-gcc -o teststat64 teststat.c -D_FILE_OFFSET_BITS=64

Mit offsetof wird direkt der Offset des Feldes angezeigt. Bei mir sieht das dann so aus:
Code:
# strace -estat,stat64 ./teststat32 /bin
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=21532, ...}) = 0
stat("/bin", {st_mode=S_IFDIR|0755, st_size=1141, ...}) = 0
stat(/bin) return=0 stat.st_mode=40755 @20
# strace -estat,stat64 ./teststat64 /bin
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=21532, ...}) = 0
stat64("/bin", {st_mode=S_IFDIR|0755, st_size=1141, ...}) = 0
stat(/bin) return=0 stat.st_mode=40755 @24
Die Option -e schränkt die Ausgabe von strace auf die Aufrufe ein, die uns hier interessieren, der erste Aufruf von stat ist hier auch nicht von Bedeutung.

Man sieht, dass beim Aufruf von stat am Offset 20 der richtige Wert kommt, und beim Aufruf von stat64 am Offset 24.

Wenn dieses einfache Beispiel bei Dir nicht richtig funktioniert, gibt es ein Problem mit der Build-Umgebung. Wenn es funktioniert, liegt das Problem am eggdrop.

PS:
Zu "#undef __USE_FILE_OFFSET64", das bringt an der Stelle nichts, weil es erst später definiert wird.
 
Zuletzt bearbeitet:
okay danke, habe Ihren Code kompiliert mit:
Code:
toolchain/target/bin/mipsel-linux-gcc -o teststatnew teststatnew.c

ausgeführt:
Code:
# strace -estat,stat64 teststatnew /var/ext/bin
stat("/etc/ld-uClibc.so.cache", 0x7f88d870) = -1 ENOENT (No such file or directory)
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0777, st_size=22628, ...}) = 0
stat("/var/ext/bin", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat(/var/ext/bin) return=0 stat.st_mode=2 @24
#

Bam! offset 24 :(

Also ist das struct falsch durch manche defines. Es wird nämlich das stat32 struct verwendet, siehe von früherem post:
# tstat /var/tmp/passwd
sizeof(ss32)=230
sizeof(ss64)=260
sizeof(ss)=230
stat(/var/tmp/passwd) return=0 stat.st_mode=1

#


welches Define ist das Problem!???
und wieso ist das in der Build-Umgebung "freetz-1.0.1 (StinkyLinux VM Image)" so !!?

post back! DANKE!
 
Zuletzt bearbeitet:
Dann liegt es wohl am Build-System. Seltsam, das damit dann überhaupt andere Programme funktionieren.

Was passiert, wenn -D_FILE_OFFSET_BITS=64 verwendet wird?

Andererseits ist Freetz-1.0.1 schon etwas älter. Es fragt sich daher, ob es sinnvoller ist, diesem Problem auf den Grund zu gehen oder ein aktuelles Freetz zu probieren.
 
langsam dreh ich durch ! :( :(


hab jetzt gemacht im header sys/stat.h:

Code:
#undef __USE_FILE_OFFSET64

/* Structure describing file characteristics.  */
struct stat


und dann:

Code:
toolchain/target/bin/mipsel-linux-gcc -o teststat64 teststat.c -D_FILE_OFFSET_BITS=32



dann ausgeführt:

Code:
# strace -estat,stat64 teststatnew /var/ext/bin
stat("/etc/ld-uClibc.so.cache", 0x7fd10870) = -1 ENOENT (No such file or directory)
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0777, st_size=22628, ...}) = 0
stat("/var/ext/bin", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat(/var/ext/bin) return=0 stat.st_mode=2 @24
#

immernoch offset 24 !! :(
 
Code:
# cat /var/ext/bin/teststatnew.c
#include <stdio.h>
#include <sys/stat.h>
#include <stddef.h>
#include <stdlib.h>

/* Structure describing file characteristics.  */
struct mystat32
  {
        __dev_t st_dev;
    long int st_pad1[3];

    __ino_t st_ino;             /* File serial number.          */

    __mode_t st_mode;           /* File mode.  */
    __nlink_t st_nlink;         /* Link count.  */
    __uid_t st_uid;             /* User ID of the file's owner. */
    __gid_t st_gid;             /* Group ID of the file's group.*/
    __dev_t st_rdev;    /* Device number, if device.  */

    long int st_pad2[2];
    __off_t st_size;            /* Size of file, in bytes.  */
    /* SVR4 added this extra long to allow for expansion of off_t.  */
    long int st_pad3;

    /*
     * Actually this should be timestruc_t st_atime, st_mtime and
     * st_ctime but we don't have it under Linux.
     */
    __time_t st_atime;          /* Time of last access.  */
    long int __reserved0;
    __time_t st_mtime;          /* Time of last modification.  */
    long int __reserved1;
    __time_t st_ctime;          /* Time of last status change.  */
    long int __reserved2;
    __blksize_t st_blksize;     /* Optimal block size for I/O.  */

    __blkcnt_t st_blocks;       /* Number of 512-byte blocks allocated.  */

    long int st_pad5[14];
  };


int main(int argc, char **argv)
{
  int i;
  struct mystat32 ss;

  *argv++;
  i = stat(*argv, &ss);
  printf("stat(%s) return=%d stat.st_mode=%o @dev=%d  @pad=%d  @ino=%d  @mode=%d \n", *argv, i, ss.st_mode, offsetof (struct mystat32, st_dev), offsetof (struct mystat32, st_pad1), offsetof (struct mystat32, st_ino), offsetof (struct mystat32, st_mode));

  exit(0);
}
#

Code:
# strace -estat,stat64 teststatnew /var/ext/bin
stat("/etc/ld-uClibc.so.cache", 0x7f81d870) = -1 ENOENT (No such file or directory)
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0777, st_size=22628, ...}) = 0
stat("/var/ext/bin", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat(/var/ext/bin) return=0 stat.st_mode=2 @dev=0  @pad=8  @ino=20  @mode=24
#

und wieder offset 24 !!! :( :(

dev ist 8 byte, müsste wahrscheinlich wohl 4byte sein,
denn pad ist korrekt mit 3*4byte, und ino ist auch korrekt mit 4byte.

__dev_t oder pad muss falsch sein !!! ?!?!?

__dev_t ist __u_quad_t (also 64bit), dann müsste wohl pad falsch sein:
habe mal gegoogelt und gesehen das es sys/stat.h gibt die andere größen bei pad haben!


Können Sie mir Ihren include ordner als archiv anhängen oder am besten sagen, von wo ich aktuelle includes für freetz oder uclibc beziehen kann, danke!
 
Zuletzt bearbeitet:
Irgendwelche undefs in Standard Header-Files zu setzen ist keine gute Idee.

Es sieht tatsächlich so aus, als wäre sizeof(__dev_t) gleich 8. Allerdings ist das anscheinend normal. Die Werte für 32-Bit sehen bei mir so aus:
Code:
stat(/bin) return=0 stat.st_mode=40755 @dev=0  @pad=8  @ino=16  @mode=20

Aus welchem bits/stat.h hast Du Deine Werte?

Bei mir sieht es so aus:
toolchain/build/mipsel_gcc-4.5.3_uClibc-0.9.29/mipsel-linux-uclibc/mipsel-linux-uclibc/include/bits/stat.h
Code:
...
     39 #if _MIPS_SIM == _ABIO32
     40 /* Structure describing file characteristics.  */
     41 struct stat
     42   {
     43         __dev_t st_dev;
     44     long int st_pad1[2];
     45 #ifndef __USE_FILE_OFFSET64
     46     __ino_t st_ino;             /* File serial number.          */
     47 #else
     48     __ino64_t st_ino;           /* File serial number.          */
     49 #endif
     50     __mode_t st_mode;           /* File mode.  */
     51     __nlink_t st_nlink;         /* Link count.  */
     52     __uid_t st_uid;             /* User ID of the file's owner. */
     53     __gid_t st_gid;             /* Group ID of the file's group.*/
...
 
also doch wie ich gesehen habe ist es pad1 !

bei Ihnen:
Code:
long int st_pad1[2];

bei mir:
Code:
long int st_pad1[3];

meine sind: freetz-1.0.1\toolchain\build\gcc-4.2.1-uClibc-0.9.28\mipsel-linux-uclibc\include
super toll das da die includes nicht stimmen :(

dann brauche ich korrekte includes.
wo kann ich aktuelle beziehen (freetz, openwrt, .. ??) ??
 
Zuletzt bearbeitet:
Wie bereits geschrieben, Freetz-1.0.1 ist schon ziemlich alt, ca. Ende 2008. Ein aktuelles Freetz gibt es bei http://freetz.org.

Trotzdem ist es seltsam. Damit hätten alle Programme, die damit erstellt wurden, diesen Fehler gehabt, schon so einfache Programme wie ls oder find. Es sei denn, dass Freetz Defines beim Übersetzen verwendet, die bewirken, dass eine andere Definition von stat genutzt wird, bei der die Definition passt.

Soweit ich weiß, gibt es auch keine aktuelle Firmware mehr, die uClibc-0.9.28 verwendet, von daher ist sowieso fraglich, ob das laufen würde.
 

Statistik des Forums

Themen
246,295
Beiträge
2,249,580
Mitglieder
373,893
Neuestes Mitglied
Kukkatto
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.