2016-04-27 4 views
3

Ich versuche, mich mit dem Ändern von Minix Systemaufrufen und Neuaufbau des Kernels vertraut zu machen.Modyifing vorhandenen do_mkdir() Systemaufruf zum Drucken erstellt Ordner, die nicht bereits existiert

I modifizierte mkdirNew dir -> <directory-name> <permissions> jedes Mal zu drucken, es hieß, es sei denn, das Verzeichnis bereits existierte.

Ich bearbeitet /usr/src/servers/vfs/open.c, die den Code für mkdir enthält. Ich habe diese Zeile Code 610 an die Leitung:

printf("New dir -> %s %o",fullpath,dirmode); 

Mit diesem bearbeiten, mkdir korrekt gedruckt, mit der Ausnahme, dass, wenn der Ordner existiert bereits, ich war die folgende Meldung erhalten:

New Dir -> test 755 mkdir: test: file exists 

ich erwartet zu sehen:

mkdir: test: file exists 

ich dachte, dass der printf zum letzten if-else Körper durch Zugabe in der Nähe von Linie 610, wäre es in diesem Fall nicht ausgeführt werden, da diese i Die f-else-Struktur überprüft, ob das neue Verzeichnis gültig ist (Inode, Berechtigungen usw.), und der Aufruf sollte zurückkehren, wenn das Verzeichnis bereits existiert. Ich lag falsch.

Welche Systemfunktion oder -variable sollte ich überprüfen, um festzustellen, ob die Datei bereits existiert?

My edited version of open.c.

Ich verwende Minix Version 3.2.1.

Um dies zu testen, habe ich nur den Kernel wieder aufgebaut, wie folgt aus:

cd /usr/src/releasetools 
make hdboot 
+2

Ich denke, Sie sollten überprüfen Sie die 'req_mkdir' Rückgabewert, um zu sehen, ob alles gut ging. – LPs

+1

Sie sollten es nennen, wo Sie das printf auskommentiert haben, aber mit dem Rückgabewert von 'req_mkdir' konditioniert. –

Antwort

2

Wie die commen vorgeschlagen, müssen Sie eine weitere Sache zu prüfen.

Der Code in der Nähe des Abschnitts, der Sie geändert sagt:

/* Make sure that the object is a directory */ 
if (!S_ISDIR(vp->v_mode)) { 
    r = ENOTDIR; 
} else if ((r = forbidden(fp, vp, W_BIT|X_BIT)) == OK) { 
    r = req_mkdir(vp->v_fs_e, vp->v_inode_nr, fullpath, fp->fp_effuid, 
        fp->fp_effgid, bits); 
    printf("New dir -> %s %o",fullpath,dirmode); 
} 

Der Schlüssel hier ist, dass die Zweige prüfen, ob das übergeordnete Verzeichnis vorhanden ist, und prüfen Sie, ob das Programm der Erlaubnis, ein neues Verzeichnis zu erstellen hat - aber nichts darüber, ob ein Verzeichnis bereits existiert oder nicht.

Diese Überprüfung wird als Teil von req_mkdir durchgeführt, die einen Fehlercode zurückgibt, ob es erfolgreich war oder nicht. Sie würden diesen Fehlercode überprüfen mögen:

/* Make sure that the object is a directory */ 
if (!S_ISDIR(vp->v_mode)) { 
    r = ENOTDIR; 
} else if ((r = forbidden(fp, vp, W_BIT|X_BIT)) == OK) { 
    r = req_mkdir(vp->v_fs_e, vp->v_inode_nr, fullpath, fp->fp_effuid, 
        fp->fp_effgid, bits); 
    if (r == OK) { 
     printf("New dir -> %s %o\n", fullpath, dirmode); 
    } 
} 

Während ich es war, habe ich auch die fehlenden Newline am Ende des printf Format-String, so dass es nicht zusammen mit der nächsten Zeile aufgereiht bekommt.

Haftungsausschluss: Ich habe dies nicht wirklich getestet und könnte einen Fehler gemacht haben.

Verwandte Themen