kernel Programmierung sys_creat

S

soundofakira

Grünschnabel
Hallo zusammen

Kurz zu meiner Person
Mein Name ist Andre, ich bin 27 und bin eigentlich Aquarianer :)

Ich arbeite mich grade ein wenig in die Kernel Programmierung ein und möchte ein wenig darüber lernen.

Mein erstes Problem, welches ich probieren möchte ist:

Ich möchte in die Kernel.log einen Eintrag schreiben lassen, wann immer eine neue Datei im System erstellt wird.

Ich habe mich jetzt ein wenig durch die syscalls gewühlt und habe rausgefunden, dass sys_creat zur Erstellung einer neuen Datei genutzt wird.
Sys_create ruft wiederum sys_open auf mit dem Flag O_Creat, wenn die Datei erstellt wird

Richtig soweit?

Jetzt stehe ich aber ein wenig vor dem Berg

Ist diese Funktion in fs/open.c zu finden?

Ich haber dort folgendes gefunden:

Code:
if (flags & O_CREAT) {
		op->intent |= LOOKUP_CREATE;
		if (flags & O_EXCL)
			op->intent |= LOOKUP_EXCL;
	}

	if (flags & O_DIRECTORY)
		lookup_flags |= LOOKUP_DIRECTORY;
	if (!(flags & O_NOFOLLOW))
		lookup_flags |= LOOKUP_FOLLOW;
	return lookup_flags;
}

/**
 * filp_open - open file and return file pointer
 *
 * @filename:	path to open
 * @flags:	open flags as per the open(2) second argument
 * @mode:	mode for the new file if O_CREAT is set, else ignored

Ich nehme mal an, dass ich also entsprechend unter
Code:
if (flags & O_CREAT) {
		op->intent |= LOOKUP_CREATE;

meinen Hinweis für den Kernel habe, dass es sich beim Aufruf der Funktion um eine neue Datei handelt die erstellt wird. (Flag O_Create)

Wenn dem so ist.. wie geht es denn dann weiter?
Da steige ich grade noch nicht so richtig hinter.

Wäre super, wenn mir da jemand helfen kann :)

gruß
Andre
gruß
Andre
 
So ich bin jetzt doch ein Stück weiter gekommen

Die sys_open wird auf die

do_sys_open Funktion gemapped (fs/open.c - Zeile 974)

Code:
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{	

	struct open_flags op;
	int lookup = build_open_flags(flags, mode, &op);
	char *tmp = getname(filename);
	int fd = PTR_ERR(tmp);

	if (!IS_ERR(tmp)) {
		fd = get_unused_fd_flags(flags);
		if (fd >= 0) {
			struct file *f = do_filp_open(dfd, tmp, &op, lookup);
			if (IS_ERR(f)) {
				put_unused_fd(fd);
				fd = PTR_ERR(f);
			} else {
				fsnotify_open(f);
				fd_install(fd, f);
			}
		}
		putname(tmp);
	}
	return fd;
}

Was ich jetzt machen müsste, wäre es die aktuelle Systemzeit abzugreifen und eine Ausgabe zu machen

Dies habe ich so implementiert
Code:
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{	
//Abfragen der aktuellen Systemzeit
	time_t zeit;
	time(&zeit);
	//Die Systemzeit wird in einem Chararray unbekannter Größe gespeichert
	char[] zeitpunkt = asctime(localtime(&zeit));
	
	struct open_flags op;
	int lookup = build_open_flags(flags, mode, &op);
	char *tmp = getname(filename);
	int fd = PTR_ERR(tmp);

	if (!IS_ERR(tmp)) {
		fd = get_unused_fd_flags(flags);
		if (fd >= 0) {
			struct file *f = do_filp_open(dfd, tmp, &op, lookup);
			if (IS_ERR(f)) {
				put_unused_fd(fd);
				fd = PTR_ERR(f);
			} else {
				fsnotify_open(f);
				fd_install(fd, f);
				printk(KERN_INFO "Hier wurde eine neue Datei erstellt: %s %s",*tmp, zeitpunkt);
			}
		}
		putname(tmp);
	}
	return fd;
}

Sollte so funktionieren oder?
 

Ähnliche Themen

Nginx als Reverse Proxy für Nextcloud und Emby

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Neuer Kernel kompiliert nicht

OpenVPN - Server kann clients nicht erreichen.

Routing Problematik

Zurück
Oben