add task 12
This commit is contained in:
parent
aa602678c0
commit
d595cdf771
3 changed files with 138 additions and 0 deletions
15
README.md
15
README.md
|
@ -287,6 +287,21 @@ ls -l /sys/eudyptula/
|
|||
`kobject`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/samples/kobject)
|
||||
* [Chapitre 14, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
||||
|
||||
### Tache 12
|
||||
|
||||
Il suffit de charger le menu et de lire les messages noyaux pour voir le bon
|
||||
fonctionnement. J'ai repris le `main` donné dans l'ennoncé sans le modifier
|
||||
plus que ça :
|
||||
|
||||
```
|
||||
[1220142.976299] Coucou le gens !!!!
|
||||
[1220142.976340] id 3 = Dave
|
||||
[1220142.976346] id 42 not found
|
||||
[1220148.124624] Tschuss !!!
|
||||
```
|
||||
|
||||
* [Chapitre 11, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
||||
|
||||
## Informations diverses
|
||||
|
||||
Je liste dans cette section quelques informations que j'ai pu découvrir en
|
||||
|
|
9
task_12/Makefile
Normal file
9
task_12/Makefile
Normal file
|
@ -0,0 +1,9 @@
|
|||
obj-m += list.o
|
||||
|
||||
PWD := $(CURDIR)
|
||||
|
||||
all:
|
||||
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
|
||||
|
||||
clean:
|
||||
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
|
114
task_12/list.c
Normal file
114
task_12/list.c
Normal file
|
@ -0,0 +1,114 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#define NAME_SIZE 20
|
||||
|
||||
struct identity {
|
||||
struct list_head list;
|
||||
char name[NAME_SIZE];
|
||||
int id;
|
||||
bool busy;
|
||||
};
|
||||
|
||||
static struct list_head identity_list;
|
||||
|
||||
static int identity_create(char *name, int id)
|
||||
{
|
||||
int ret = 0;
|
||||
struct identity *new = kmalloc(sizeof(*new), GFP_KERNEL);
|
||||
|
||||
if (!new) {
|
||||
ret = -ENOMEM;
|
||||
} else {
|
||||
ssize_t name_len = strlen(name) + 1;
|
||||
|
||||
if (name_len > NAME_SIZE) {
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
strscpy(new->name, name, name_len);
|
||||
new->id = id;
|
||||
new->busy = false;
|
||||
list_add_tail(&new->list, &identity_list);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct identity *identity_find(int id)
|
||||
{
|
||||
struct identity *ret = NULL;
|
||||
struct identity *tmp = NULL;
|
||||
struct list_head *list = &identity_list;
|
||||
|
||||
do {
|
||||
tmp = list_entry(list, struct identity, list);
|
||||
if (tmp->id == id)
|
||||
ret = tmp;
|
||||
else
|
||||
list = tmp->list.next;
|
||||
} while (list != &identity_list && !ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void identity_destroy(int id)
|
||||
{
|
||||
struct identity *tmp = identity_find(id);
|
||||
|
||||
if (tmp) {
|
||||
list_del(&tmp->list);
|
||||
kfree(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init my_init(void)
|
||||
{
|
||||
struct identity *temp;
|
||||
|
||||
pr_info("Coucou le gens !!!!\n");
|
||||
INIT_LIST_HEAD(&identity_list);
|
||||
|
||||
if (identity_create("Alice", 1))
|
||||
pr_info("Alice n'a pas été créée.");
|
||||
if (identity_create("Bob", 2))
|
||||
pr_info("Bob n'a pas été créée.");
|
||||
if (identity_create("Dave", 3))
|
||||
pr_info("Dave n'a pas été créée.");
|
||||
if (identity_create("Gena", 10))
|
||||
pr_info("Gena n'a pas été créée.");
|
||||
|
||||
temp = identity_find(3);
|
||||
if (!temp)
|
||||
pr_info("id 3 not found\n");
|
||||
else
|
||||
pr_info("id 3 = %s\n", temp->name);
|
||||
|
||||
temp = identity_find(42);
|
||||
if (!temp)
|
||||
pr_info("id 42 not found\n");
|
||||
|
||||
identity_destroy(2);
|
||||
identity_destroy(1);
|
||||
identity_destroy(10);
|
||||
identity_destroy(42);
|
||||
identity_destroy(3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit my_exit(void)
|
||||
{
|
||||
pr_info("Tschuss !!!\n");
|
||||
}
|
||||
|
||||
module_init(my_init);
|
||||
module_exit(my_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("rick <rick@gnous.eu>");
|
||||
MODULE_DESCRIPTION("Simple liste chainée.");
|
Loading…
Reference in a new issue