Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : PERL - Spass mit chmod() ;(



sticky bit
19-03-2002, 10:28
Folgende Situation, ich habe eine Subroutine, die aus einer Datei liest, mit read() also Byteweise. Diese Subroutine wird in Main aufgerufen und liefert eine Referenz auf einen Hash zurück. Einer dieser Hash-Werte enthält einen Berechtigungs Modus für eine Datei, allerdings etwas unformatiert, alo schick ich diesen Wert in eine Subroutine, die ihn mir formatiert und gib ihn gleich weiter an eine weitere Subroutine, die eine Datei erstellen soll, in eben diesem Berechtigungs Modus, bzw. den Modus wechseln nach dem Erstellen.
Testsystem ist ein Linux 2.0.30 mit PERL 5.004_03.
Beispiel:


#!usr/bin/perl

sub read_aboutfile
{
(my $aboutfile_handle_) = @_;
my $filehash_r_ = \ my $filehash_;

read($aboutfile_hanlde_, $filehash_{'filename'}, 100);
read($aboutfile_handle_, $filehash_{'filemode'}, 6);
read($aboutfile_handle_, $filehash_{'irgendwas'}, 8);

return($filehash_r_);
}

sub format_value
{
(my $value_) = @_;

$value_ =~ /(\d{4})$/;

return($0);
}

sub create_file
{
(my $filename_, my $filemode_) = @_;

print("'$filename_' wird erstellt; Modus: $filemode;\n");

open(OUTFILE, ">$filename_");
print(OUTFILE, "irgendwas");
close(OUTFILE);
chmod($filemode_, $filename_);

return(0);
}

my $filehash_r;

open(ABOUTFILE, "<aboutfile");
$filehash_r = &read_aboutfile(ABOUTFILE);
close(ABOUTFILE);

&create_file($$filehash_r{'filename'}, &format_value($$filehash_r{'filemode'}));

exit(0);


Das Problem ist jetzt, das da immer völlig wirre Berechtiguns Modi rauskommen. Sie kommen richtig an, zumindest, wenn ich sie in der Subroutine die die Datei erstellen soll mittels print() ausgebe, kommt das was ich erwarte auf den Bildschirm (z. B. 0755), die Datei letzt endlich hat dann aber 1362. Sonst macht PERL alles wie erwartet, wenn ich chmod() mit fest deklarieren Variablen aufrufe. Allerdings wenn ich z. B. perl -e 'chomp($mode = <STDIN>); chmod($mode, file);' mache kommt wieder erwarten ein Berechtigungs Modus von 1233 raus. Also nehme ich an, dass es daran liegt, dass PERL den String nicht richig als Zahl umwandeln kann (im eigentlichen Programm ist der u. U. intern noch nicht mal ein richtiger String, weil er ja Byteweise gelesen wurde, vielleicht haut da auch was mit der Null-Terminierung nicht hin?). Also hab ich mit sprintf() und weil da nur Schmarrn raus kommt (logisch...) noch in Verbundung mit oct() versucht, also etwa so $mode = sprintf("%o", oct("$mode")); in der Hoffnung das würde es richtig formatieren, wieder erwartete Ausgabe, bloss ohne leading zero, aber die Datei hat wieder nicht den richtigen Modus. Auch den Umgekehrten Weg habe ich versucht, nämlich Stringkontext zu erzwingen, in dem ich $mode in der Subroutine die die Datei erstellt im Aufruf von chmod() gedoublequotet hab, Ergebnis ist wieder das gleiche, korrekte Ausgabe, falscher Datei Modus...

So und jetzt sind mir die Ideen ausgegangen und ich hab keinen Plan, was zum Teufel da falsch läuft, bzw. was dür ein komisches Verhalten von PERL ich da wieder entdeckt hab oder wo mein Denkfehler ist, oder wie auch immer. Auf jeden Fall krieg ich langsam nen Affen damit und hoff, dass mir hier jemand einen Tip geben kann, bevor ich endgültig aus dem Fenster spring...

Christoph
20-03-2002, 12:39
Wenn ich mich recht entsinne, hat PERL 5.004 hat einen hässlichen
Bug bei der Rückgabe von Werten mittels return():
manchmal gibt "return 1;" 0 zurück (oder umgekehrt)
Als Beispiel für dises Problem kann das vncserver Script
dienen.

Workaraound beim vncserver Script: "return(1+0);".

Christoph