My Project
Chargement...
Recherche...
Aucune correspondance
fichier.c
Aller à la documentation de ce fichier.
1/*----------------------------------------------------------------------------*/
2/* Implantation des fichiers de Manux. */
3/* */
4/* (C) Manu Chaput 2002-2023 */
5/*----------------------------------------------------------------------------*/
6#include <manux/fichier.h>
7#include <manux/debug.h>
8#include <manux/string.h> // bcopy
9#include <manux/scheduler.h> // tacheEnCours
10#include <manux/errno.h>
11#ifdef MANUX_KMALLOC
12# include <manux/kmalloc.h>
13#endif
14
19static
20int fichierLire(Fichier * f, void * buffer, int nbOctets)
21{
22 int result = -EBADF;
23
24 if (f->fanions & O_RDONLY) {
25 printk_debug(DBG_KERNEL_SYSFI, "on invoque 0x%x\n", f->iNoeud->methodesFichier->lire);
26
27 // On invoque la méthode associée
28 result = f->iNoeud->methodesFichier->lire(f, buffer, nbOctets);
29 }
30
31 printk_debug(DBG_KERNEL_SYSFI, "on renvoie %d\n", result);
32
33 return result;
34}
35
36int fichierEcrire(Fichier * f, void * buffer, int nbOctets)
37{
38 int result = -EBADF;
39
40 if (f->fanions & O_WRONLY) {
41 printk_debug(DBG_KERNEL_SYSFI, "on invoque 0x%x\n", f->iNoeud->methodesFichier->ecrire);
42
43 // On invoque la méthode associée
44 result = f->iNoeud->methodesFichier->ecrire(f, buffer, nbOctets);
45 }
46 printk_debug(DBG_KERNEL_SYSFI, "on renvoie %d\n", result);
47
48 return result;
49}
50
51#ifdef MANUX_APPELS_SYSTEME
55int sys_fermer(ParametreAS as, int fd)
56{
57 Fichier * f;
58 int result = EBADF;
59 (void) as;
60
62
63 if (tacheEnCours == NULL) {
64 printk_debug(DBG_KERNEL_SYSFI, "pas de tache en cours !\n");
65 result = EINVAL;
66 } else if (tacheEnCours->fichiers[fd] == NULL) {
67 printk_debug(DBG_KERNEL_SYSFI, "pas de fichier %d !\n", fd);
68 result = EPASDEF;
69 } else {
70 f = tacheEnCours->fichiers[fd];
71 result = fichierFermer(f);
72
73 // WARNING : libérer l'emplacement dans les fichiers de la tâche
74 }
75
76 return result;
77
78}
79
80int sys_ecrire(ParametreAS as, int fd, void * buffer, int nbOctets)
81{
82 Fichier * f;
83 int result;
84 (void) as;
85
86 printk_debug(DBG_KERNEL_SYSFI, "sys_ecrire fd = %d, b = %d, nb = %d IN\n", fd, buffer, nbOctets);
87
88 if (tacheEnCours == NULL) {
89 printk_debug(DBG_KERNEL_SYSFI, "pas de tache en cours !\n");
90 result = -EINVAL;
91 } else if (tacheEnCours->fichiers[fd] == NULL) {
92 printk_debug(DBG_KERNEL_SYSFI, "pas de fichier %d !\n", fd);
93 result = -EPASDEF;
94 } else {
95 f = tacheEnCours->fichiers[fd];
96 printk_debug(DBG_KERNEL_SYSFI, "sys_ecrire : fd=%d, file=%x\n", fd, f);
97 result = fichierEcrire(f, buffer, nbOctets);
98 printk_debug(DBG_KERNEL_SYSFI, "sys_ecrire : res = %d\n", result);
99 }
100
101 return result;
102}
103
104int sys_lire(ParametreAS as, int fd, void * buffer, int nbOctets)
105{
106 Fichier * f;
107 int result;
108 (void) as;
109
110 printk_debug(DBG_KERNEL_SYSFI, "sys_lire fd = %d, b = %d, nb = %d IN\n", fd, buffer, nbOctets);
111
112 if (tacheEnCours == NULL) {
113 printk_debug(DBG_KERNEL_SYSFI, "pas de tache en cours !\n");
114 result = -EINVAL;
115 } else if (tacheEnCours->fichiers[fd] == NULL) {
116 printk_debug(DBG_KERNEL_SYSFI, "pas de fichier %d !\n", fd);
117 result = -EPASDEF;
118 } else {
119 f = tacheEnCours->fichiers[fd];
120 printk_debug(DBG_KERNEL_SYSFI, "sys_lire : fd=%d, file=%x\n", fd, f);
121 result = fichierLire(f, buffer, nbOctets);
122 printk_debug(DBG_KERNEL_SYSFI, "sys_lire : res = %d\n", result);
123 }
124
125 return result;
126}
127#endif //MANUX_APPELS_SYSTEME
128
130{
131#ifdef MANUX_APPELS_SYSTEME
132 definirAppelSysteme(NBAS_FERMER, sys_fermer);
133 definirAppelSysteme(NBAS_ECRIRE, sys_ecrire);
135#endif
136}
137
145int fichierOuvrir(INoeud * iNoeud, Fichier * f, uint16_t fanions, uint16_t mode)
146{
147 int result = ESUCCES;
148
150
151 // WARNING, plein de précautions à prendre !
152
153 f->iNoeud = iNoeud;
154 f->fanions = fanions;
155 f->mode = mode;
156
157 if (iNoeud->methodesFichier->ouvrir) {
158 result = iNoeud->methodesFichier->ouvrir(iNoeud, f, fanions, mode);
159 }
160
161 //printk_debug(DBG_KERNEL_SYSFI, "OUT");
162 return result;
163}
164
169{
170 int result = EBADF;
171
173
174 if (f->iNoeud->methodesFichier->fermer) {
175 result = f->iNoeud->methodesFichier->fermer(f);
176 }
177
178 //printk_debug(DBG_KERNEL_SYSFI, "OUT");
179 return result;
180}
181
182#ifdef MANUX_KMALLOC
189Fichier * fichierDupliquer(Fichier * f)
190{
191 int res;
192 Fichier * result;
193
194 result = kmalloc(sizeof(Fichier));
195
196 if (result == NULL) {
197 paniqueNoyau("Plus de memoire !\n");
198 } else {
199 // On fait une coie simple, ...
200 bcopy(f, result, sizeof(Fichier));
201
202 // ... et on invoque la méthode d'ouverture, si elle a des
203 // décomptes à faire, par exemple
204 if (f->iNoeud->methodesFichier->ouvrir != NULL) {
205 res = f->iNoeud->methodesFichier->ouvrir(f->iNoeud, result, f->fanions, f->mode);
206 if (res != ESUCCES) {
207 kfree(result);
208 result = NULL;
209 }
210 }
211 }
212
213 return result;
214}
215
219Fichier * fichierCreer(INoeud * iNoeud, uint16_t fanions, uint16_t mode)
220{
221 Fichier * result = kmalloc(sizeof(Fichier));
222
223 // printk_debug(DBG_KERNEL_SYSFI, "IN");
224 if (fichierOuvrir(iNoeud, result, fanions, mode) == ESUCCES) {
225 return result;
226 } else {
227 kfree(result);
228 return NULL;
229 }
230}
231#endif // MANUX_KMALLOC
int fichierFermer(Fichier *f)
Fermeture d'un fichier.
Definition fichier.c:168
void sfInitialiser(void)
Definition fichier.c:129
int fichierOuvrir(INoeud *iNoeud, Fichier *f, uint16_t fanions, uint16_t mode)
: Ouverture d'un fichier.
Definition fichier.c:145
int fichierEcrire(Fichier *f, void *buffer, int nbOctets)
Definition fichier.c:36
#define O_WRONLY
Definition fichier.h:28
#define O_RDONLY
Les différents fanions.
Definition fichier.h:27
int definirAppelSysteme(int num, void *appel)
#define NBAS_FERMER
#define NBAS_LIRE
#define NBAS_ECRIRE
#define EINVAL
Definition errno.h:14
#define ESUCCES
Definition errno.h:10
#define EBADF
Definition errno.h:11
#define EPASDEF
Definition errno.h:15
typedef void(Handler(void))
Définition de kmalloc.
#define NULL
Definition stddef.h:10
void bcopy(const void *src, void *dest, int n)
Definition string.c:35
unsigned short uint16_t
Definition types.h:16
int fd[2]
void * kmalloc(size_t n)
Allocation d'une zone de n octets.
Definition kmalloc-zs.c:139
void kfree(void *p)
Libération d'une zone mémoire allouée.
Definition kmalloc-zs.c:265
#define DBG_KERNEL_SYSFI
Definition debug.h:24
#define paniqueNoyau(fmt, args...)
Definition debug.h:107
#define printk_debug(lvl, fmt, args...)
Definition debug.h:86
Tache * tacheEnCours
: L'identification de la tâche en cours
Definition scheduler.c:91
: Qu'est-ce qu'un fichier ouvert du point de vue du noyau ?
Definition fichier.h:46
INoeud * iNoeud
Caractérisation de la structure.
Definition fichier.h:48
uint16_t fanions
O_RDONLY, O_NONBLOCK, O_SYNC.
Definition fichier.h:50
uint16_t mode
FMODE_READ, FMODE_WRITE, ... pour création.
Definition fichier.h:49
: Un INoeud représente un fichier, d'un point de vue statique Il s'agit donc de la description d'un f...
Definition inoeud.h:27
MethodesFichier * methodesFichier
Definition inoeud.h:30
int(* fermer)(Fichier *f)
Definition fichier.h:38
int(* ouvrir)(INoeud *iNoeud, Fichier *f, uint16_t fanions, uint16_t mode)
Definition fichier.h:37
size_t(* lire)(Fichier *f, void *buffer, size_t nbOctets)
Definition fichier.h:40
size_t(* ecrire)(Fichier *f, void *buffer, size_t nbOctets)
Definition fichier.h:39