Bitoperatoren, Zugriffsrechte ausgeben



  • Hallo,

    hui, ich möchte folgende Aufgabe lösen: Eine Funktion schreiben, in der verschiedene Zugriffsrechte vereinbart sind. Diese Zugriffsrechte will ich dann auf Konsole ausgeben lassen. Und zwar in der Form, wie sie auch bei der Anzeige der Zugriffsrechte unter dem Betriebssystem Unix / Linux erscheinen.
    Beispielsweise rwxr-xr-x (Benutzer hat alle Rechte, Gruppe und Andere nur Lese-und Ausführrechte.
    Zuordnung der Bits zu den Rechten:
    o Bit 0: Leserecht Benutzer
    o Bit 1: Schreibrecht Benutzer
    o Bit 2: Ausführrecht Benutzer
    o Bit 3: Leserecht Gruppe
    o Bit 4: Schreibrecht Gruppe etc...

    Bitte nicht falsch verstehen, ich möchte keinen Code von euch! Es wäre nur schön, wenn ich einen Start-Tipp, Ratschlag bekommen könnte! Bisher bin ich nur mit formatierter Ausgabe und Funktionen mit einfachen Berechnungen umgegangen. Deswegen habe ich keine rechte Idee, wie so ewtas aussehen soll. Brauche ich dafür besteimmte Bibliotheken, die ich am Anfang includieren muss?
    Danke im Voraus für Hilfe..
    Grüße,J



  • wo ist dein problem?
    bei der anzeige?
    bei den bits?
    bei deinem können?



  • hallo,
    ..wie man meiner "anfrage" wahrscheinlich schon fast entnehmen kann, ist mein problem eine mischung aus allem. also wie das programm ganz roh aussehen müsste

    #include <stdio.h>
    #include (???)
    
    int bitausgabe(?,?); /*Prototyp*/
    
    int main(){
    
       printf("%15s\n", "Zugriffsrechte:");
    
       int bitausgabe(?);
    
       return 0;
    
    }
    
       int bitausgabe(??){
    
          /*welche variablen, welche bitoperatoren, welche bits wie belegen?????*/
    
       }
    

    Ich denke, das größte Problem habe also mit den Bits. ..

    Grüße, j



  • Aus was soll denn die Ausgabe entstehen? Übergibst du einen Int in dem die Zugriffsrechte codiert sind? Du musst ja schon gewisse Vorstellungen haben...

    Mit ints haette ich das dann vllt in der Art geloest:

    void bitausgabe(int Rechte)
    {
    	printf("%s%s%s", (Rechte & 1) == 0 ? "" : "r", (Rechte & 2) == 0 ? "" : "w", (Rechte & 4) == 0 ? "" : "x");
    }
    

    so vllt in etwa?

    Gruss,
    DeSoVoDaMu



  • #include <stdio.h>
    
    #define USER_READ   1<<0
    #define USER_WRITE  1<<1
    #define USER_EXEC   1<<2
    
    #define GROUP_READ  1<<3
    #define GROUP_WRITE 1<<4
    #define GROUP_EXEC  1<<5
    
    unsigned char setRights(unsigned char);
    
    void printRights(unsigned char);
    
    char listRights[6][12]={"user_read","user_write","user_exec","group_read","group_write","group_exec"};
    
    int main(void){
            unsigned char rights;
            rights = setRights( USER_READ | USER_EXEC | GROUP_READ | GROUP_EXEC );
            printRights(rights);
            return 0;
    }
    
    unsigned char setRights(unsigned char a){
            return a;
    }
    
    void printRights(unsigned char b){
            unsigned int i;
            printf("Gesetzte Rechte:\n");
            for(i=0;i<6;i++){
                    if(b & 1<<i) puts(listRights[i]);
            }
    }
    


  • Hallo zusammen,
    musste die Aufgabe etwas ruhen lassen und komme erst jetzt zum weiter machen. Danke bis hierher. Den Code aus dem letzten Beitrag habe ich kompiliert, größtenteils verstehe ich auch den Ablauf. Allerdings ist mir die Zuwesiung der einzelnen Bits zu Beginn mit den Schiebeoperatoren unklar. Und ich verstehe in dem listRights die "Veroderungen" nicht.
    Außerdem möchte ich das Programm in 2 Funktionen aufteilen. Ungefähr so:

    #include<stdio.h>
    #include<string.h> 
    #include<ctype.h> 
    /*Kann ich vielleicht diese beiden Bibliotheken zu "geschickterer" Ausgabe oder Speicherung der Rechte nutzen?*/
    
    /*Zuweisung Bits zu den Rechten wie im Beispiel von TactX, bzw. geht das auch anders in main?*/
    
    /*Prototyp Funktion drucke_Rechte:
    soll die Zugriffsrechte in einem int-Wert speichern und ausgeben!
    HIERZU: Wie kann ich das machen? Ich kann mir nicht richtig vorstellen, wie ich die Informationen in dieser Form: rwx-rwx-rwx für die drei Benutzerklassen in EINEN int-Wert speichern soll.*/
    
    void drucke_Rechte(int);
    
    /*Prototyp Funktion chmod: 
    Rückgabewert=veränderte Zugriffsrechte
    Param1=char-Array soll Form der zu ändernde Rechte beschreiben (z.B. u - r)
    Param2=übergebener int-Wert mit den "Rechte-Bits"*/
    
    int chmod (char[], int); 
    
    int main(void){
    
    /*?*/
    
    }
    

    😕
    Das größte Problem liegt in dem Verständnis dieser Zeichenkettenform als int-Wert UND den Bitoperatoren.
    Falls also nochmal jemand die Muße hat...
    So long, J



  • Ich würde gerne wissen ob ihr zu einem ergebniss gekommen seid und den fertigen quelltext auch mal postet 😋



  • Hallo,

    nur mal zur Info: Der vorige Beitrag war nicht von mir! Ich habe nämlich bereits selbst eine fertige Lösung, (mit etwas Hilfe), bei der mir 1-2 Dinge nicht klar sind im Ablauf und immer noch zum Verständnis mit der Bitbelegung des int-Wertes. Da es allerdings ca.190 Zeilen Code sind, wollte ich vorher mal fragen, ob es ok ist, wenn ich die hier poste und jemand bereit wäre, sich das mal anzusehen.

    Grüße, J.



  • Da es allerdings ca.190 Zeilen Code sind, wollte ich vorher mal fragen, ob es ok ist, wenn ich die hier poste und jemand bereit wäre, sich das mal anzusehen.

    😃 i don't think so, ausser du findest nen übereifrigen spinner 😃



  • nimm alles aus dem programm, was keinen fehler produziert.
    dann sorge dafür, dass man das programm *lesen* kann (keine Ungarische Notation, keine ein-zeichen-varnamen, keine spagetti-varnamen)

    http://rafb.net/paste/



  • Morgen,

    so, ich habe den Link genutzt und das Programm dort eingegeben. Ich habe nichts weggelassen, da es keine Stellen gibt, die nicht funktionieren. Es läuft so wie es ist, sind nur unheimlich viele if-Abfragen drin. Meine zwei Fragen dazu: Bei der Eingabe zum Starten des Programms von programmname.exe chmod u+x beispielsweise, wie funktioniert da main? in argv[0] steht der Programmname. in argv[1] steht doch chmod, also der funktionsname. wie kann daraus "zahl" als int- Wert gemacht werden???eigentlich müsste doch argv[2] gezählt werden, wenn man wissen will wie viele Argumente eingegeben wurden. Wie also funktioniert der Anfang direkt?
    2. Wie funktioniert das mit der Bitbelegung in der Funktion bitaausgabe? Was machen die Bitoperatoren <<>>???
    Letztendlich: Kann man das Ganze übersichtlicher und weniger verschachtelt lösen?

    Hoffe das Programm ist "lesbar" genug, Danke 🙄



  • hohesC schrieb:

    i don't think so, ausser du findest nen übereifrigen spinner

    also einen hättest du schon 😃

    und 190 zeilen sind ja nun nicht die welt.

    ich hätte da ne einfache lösung für dein problem. erst mal codierst du jedes zugriffsrecht als ein bit. dann nimmst du den string "rwxrwx". ist bit n nicht gesetzt, dann ersetzt du den zugehörigen buchstaben im string durch '-'.

    char
    *mod2txt (int mod)
    {
      static txt[7];
      int i;
    
      strcpy(txt,"rwxrwx");
    
      for(i=0; i<6; i++)
        if((mod&(1<<i))==0)
          txt[i]='-';
    
      return txt;
    }
    


  • 👍 Danke für die Erklärung..Hab's jetzt tatsächlich dank Deinem Beispiel erst richtig vertanden, wie der Eingabe-String und der int-Wert zusammen hängen! Habe mein (viel zu umständliches ) Programm schon bisschen verändert, ist bald endlich fertig ..
    Viele Grüße, J.


Log in to reply