permission denied nach zwei open() calls?



  • Hi,

    bastle derzeit an einem copy Programm in C, das als 2. und 3. Argument in der Kommandozeile die eingabe und ausgabe datei bekommen soll. Es läuft alles perfekt bis auf folgendes kurioses problem:

    ich überprüfe mit einer fall abfolge, ob die angegebene zieldatei bereits existiert:

    if ((fdesout = open(zieldatei, O_WRONLY | O_CREAT | O_EXCL)) == -1)
          { ...
            ...
          }
    

    wenn allerdings die datei noch nicht existiert soll er sie neu anlegen (bzw. inhalt löschen und neu reinschreiben, wenn vorher entsprechende variable auf true gesetzt wurde):

    else if ((fdesout = open(zieldatei, O_WRONLY | O_CREAT | O_TRUNC)) == -1)
          { ...
            ...
          }
    

    mein problem bei dieser -if, else if- abfolge ist nun folgendes:
    es wird bei einem nichtvorhandensein der zieldatei zwar brav in den rumpf der zweiten bedingung gesprungen, aber er kann die datei zum schreiben nicht öffen (eine perror überprüfung sagt mir ein permission denied, obwohl ich überall owner bin und lese/schreibzugriff habe).
    sobald ich nun aber oben den "if teil" einfach auskommentiere und unten aus dem "else if" ein "if" mache legt er mir die datei anstandslos an!! 😃 😕

    habs auch schon mit vorherigem close (fdesout) probiert und ne andere variable für den FD eingesetzt. es geht trotzdem nur, wenn der erste teil mit dem open call und der existenzprüfung fehlt, als ob sich beide open calls behindern würden, obwohl sie in zwei verscheidenen fällen stehen...

    bin mit meienm latein am ende, vielen dank für eure hilfe!! 😉

    MfG



  • hmm, mit close sollte es eigentlich funktionieren, des wundert mich halt jetzt, aber was solls...
    ich mein, die zwei verschiedenen fälle sind gar nicht so verschieden.
    der erste wird auf jeden fall aufgerufen, wenns bei dem ein problem gibt, wird der zweite aufgerufen, das heißt im klartext:
    wenns klappt im ersten if die datei zu öffnen (das erste if ist ja für den fall, dass es nicht geklappt hat) wird versucht die datei nochmal zu öffnen und dann krachts halt.
    also ich würds mal ohne if - else if probieren, da du da eigentlich keine chance hast, close() aufzurufen.
    setz ne variable auf nen bestimmten wert, z.b.

    int geklappt = 0;
    if((fdesout = open(zieldatei, O_WRONLY | O_CREAT | O_EXCL)) != -1)
    {
      geklappt = 1;
    }
    
    if(!geklappt)
    {
      close(fdesout);
      if((fdesout = open(zieldatei, O_WRONLY | O_CREAT | O_TRUNC) == -1)
      // weiter im text
    }
    

    klingt eigentlich logisch, habs leider net getestet, aber sollte so funktionieren... würde an deiner stelle evtl auch zugriffsrechte für die datei vergeben, z.b. bei

    open(zieldatei, O_WRONLY | O_CREAT | O_TRUNC, 0755);
    

    is die 0755 die berechtigung in oktalschreibweise, aber gibt afaik auch konstanten dafür



  • vielen dank vorden für deinen interessanten vorschlag, hat aber leider auch nicht geklappt (auch nicht mit dem setzen der zugriffsrechte). 😞
    habs auch noch mal so versucht:

    if...
    {
       ...
    }
    else
    {
       close(fdesout);
       if...
       {
          ...
       }
    }
    

    ...leider auch ohne erfolg 👎

    mmh, bin echt ratlos, gibts noch mehr vorschläge?

    MfG



  • ha, juhuu, ich habs...

    man muss vorher bei der ersten abfrage auf existenz, die zugriffsrechte schon setzen, nicht erst bei der zweiten, beim datei erstellen (da können sie auch weggelassen werden)

    vermute mal, dass wenn bei der ersten abfrage die bedingung schon fehlschlägt (sprich, wenn die datei noch nich vorhanden ist) und die open funktione keine zugriffsrechte setzen soll, dass dann in der zweiten anweisung, die openfunktion ebenfalls diese nicht gesetzten rechte übernimmt und dann logischerweise nichts erzeugen kann..

    finds zwar immer noch eigenartig, weil meiner menung nach in jeder bedingung dem filedeskriptor ein anderer wert (und somit andere argumente der open funktion) zugewiesen wird und notfalls alte zuweisungen überschreibt, aber was solls.. vll hat da jemand noch eine erklärung für?

    hauptsache es geht nun, danke nochmal

    MFG



  • naja, ich dachte mir, dass du die zugriffsrechte beim ersten open schon setzt, also im allgemeinen für open() die zugriffsrechte eingetragen hast...
    also zur erklärung:
    du erstellst eine datei mit O_EXCL, das heißt, dass du exklusiv drauf zugriff hast... damit ist auch genau ein filedeskriptor daran gebunden. sobald die datei einmal geöffnet ist (wird), kann die datei durch keine andere open-operation mehr erreicht werden. dadurch brauchste des close hinterher.
    und abgesehen davon: dem filedeskriptor wird schon immer ein anderer wert zugewiesen. allerdings ist die datei noch offen (im O_EXCL fall biste damit am ende) und müsste vorher geschlossen werden. und dass es öffnen net klappt, wenn du keine zugriffsrechte hast (wenn die datei beispielsweise mit 0000 angelegt wurde oder so), sollte auch klar sein



  • jo danke alles nun klar soweit, danke nochmal 👍


Anmelden zum Antworten