Π’Π΅ΠΏΠ΅ΡΡ ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΉ Π½Π°ΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ POSIX-ΡΡΠΎΠ²Π½Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ! Π€ΡΠ½ΠΊΡΠΈΡ iofunc_open_default() ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π² ΡΠΎΠΉ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΠΉΡΠ°Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ my_open(). ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ Π½Π°Π±ΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²!
ΠΡΠ΅, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΄Π΅Π»Π°ΡΡ β ΡΡΠΎ ΡΠ΅ΡΠΈΡΡ, ΠΊΠ°ΠΊΡΡ Π°ΡΡΠΈΠ±ΡΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ²ΡΠ·Π°ΡΡ Ρ OCB, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΌ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: Π»ΠΈΠ±ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ (Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ attr), Π»ΠΈΠ±ΠΎ ΠΎΠ΄Π½Ρ ΠΈΠ· 26 ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ Ρ Π½Π°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ (ΡΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ atoz_attrs). ΠΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΠ΅ Π² ΡΠ»ΠΎΡ open Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ Β«ΡΠ²Π΅ΠΉΡΠ°ΡΒ» ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ Π·Π°ΠΏΡΠΎΡΠ°ΠΌ ΠΊ Π²Π°ΡΠ΅ΠΌΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡ ΡΠ΅ΡΡΡΡΠ°.
static int my_open(resmgr_context_t *ctp, io_open_t *msg,
iofunc_attr_t *attr, void *extra) {
if (msg->connect.path[0] == 0) {
// ΠΠ°ΡΠ°Π»ΠΎΠ³ (/dev/atoz)
return (iofunc_open_default(ctp, msg, attr, extra));
} else if (msg->connect.path[1] == 0 &&
(msg->connect.path[0] >= 'a' &&
msg->connect.path[0] <= 'z')) { // Π€Π°ΠΉΠ» (/dev/atoz/[a-z])
return
(iofunc_open_default(ctp, msg, atoz_attrs +
msg->connect.path[0] - 'a', extra));
} else {
return (ENOENT);
}
}
my_read()Π ΡΡΠ½ΠΊΡΠΈΠΈ my_read(), ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ, ΠΌΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅ mode Π°ΡΡΠΈΠ±ΡΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ. ΠΡΠ»ΠΈ ΠΌΠ°ΠΊΡΠΎΡ S_ISDIR() Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΡΡΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ my_read_dir(); Π΅ΡΠ»ΠΈ ΠΌΠ°ΠΊΡΠΎΡ S_ISREG() Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΉΠ», ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ my_read_file(). (ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡ EBADF, ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π΅ΠΌΡ ΡΡΠΈΠΌ, ΡΡΠΎ ΡΡΠΎ-ΡΠΎ Π·Π΄Π΅ΡΡ Π½Π΅ ΡΠ°ΠΊ.)
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ ΠΎ Π½Π°ΡΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ , Π΄Π° Π΅ΠΌΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ Π΄Π΅Π»Π° Π΄ΠΎ Π½ΠΈΡ Π½Π΅Ρ β ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
static int my_read(resmgr_context_t *ctp, io_read_t *msg,
iofunc_ocb_t *ocb) {
int sts;
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
// ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ
if ((sts =
iofunc_read_verify(ctp, msg, ocb, NULL)) != EOK) {
return (sts);
}
// Π Π΅ΡΠΈΡΡ, Π½Π°Π΄ΠΎ Π»ΠΈ ΡΠΈΡΠ°ΡΡ Β«ΡΠ°ΠΉΠ»Β» ΠΈΠ»ΠΈ Β«ΠΊΠ°ΡΠ°Π»ΠΎΠ³Β»
if (S_ISDIR(ocb->attr->mode)) {
return (my_read_dir(ctp, msg, ocb));
} else if (S_ISREG(ocb->attr->mode)) {
return (my_read_file(ctp, msg, ocb));
} else {
return (EBADF);
}
}
my_read_dir()ΠΠΎΡ ΡΡΡ-ΡΠΎ Π²ΡΠ΅ Π²Π΅ΡΠ΅Π»ΡΠ΅ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΠΌΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π±ΡΡΠ΅Ρ (ΠΎΠ½ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ reply_msg), Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ dp, ΡΡΠΎΠ±Ρ Β«ΠΏΡΠΎΠ³ΡΠ»ΡΡΡΡΡΒ» ΠΏΠΎ Π±ΡΡΠ΅ΡΡ, Π·Π°ΠΏΠΎΠ»Π½ΡΡ Π΅Π³ΠΎ ΠΏΠΎ Ρ ΠΎΠ΄Ρ Π΄Π΅Π»Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ struct dirent. ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° dirent_size() ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π΅ΡΡΡ Π»ΠΈ Ρ Π½Π°Ρ ΠΌΠ΅ΡΡΠΎ Π² Π±ΡΡΠ΅ΡΠ΅ Π΄Π»Ρ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° dirent_fill() ΠΊΠ»Π°Π΄Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π±ΡΡΠ΅Ρ. (ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΡΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ Π²Ρ ΠΎΠ΄ΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ²; ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΠΈΡ Π½ΠΈΠΆΠ΅.)
ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ; ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sprintf() Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄Π²ΡΡ Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° (ΡΠΈΠΌΠ²ΠΎΠ» ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ NULL) Π² Π±ΡΡΠ΅ΡΠ΅ Π΄Π»ΠΈΠ½ΠΎΠΉ _POSIX_PATH_MAX (ΡΠΎ Π΅ΡΡΡ 256) Π±Π°ΠΉΡ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΌ.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅ offset Π² OCB Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ, Π΄Π»Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΌΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ struct dirent. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»Π΅ offset Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅.
ΠΠΎΠ·Π²ΡΠ°Ρ Π΄Π°Π½Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Β«ΠΎΠ±ΡΡΠ½ΡΠΌΒ» ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ MsgReply(). ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΠΎΠ»Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (status) ΡΡΠ½ΠΊΡΠΈΠΈ MsgReply() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠΈΡΠ»Π° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π±Π°ΠΉΡ.
static int my_read_dir(resmgr_context_t *ctp,
io_read_t *msg, iofunc_ocb_t *ocb) {
int nbytes;
int nleft;
struct dirent *dp;
char *reply_msg;
char fname[_POSIX_PATH_MAX];
// ΠΡΠ΄Π΅Π»ΠΈΡΡ Π±ΡΡΠ΅Ρ Π΄Π»Ρ ΠΎΡΠ²Π΅ΡΠ°
reply_msg = calloc(1, msg->i.nbytes);
if (reply_msg == NULL) {
return (ENOMEM);
}
// ΠΠ°Π·Π½Π°ΡΠΈΡΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡΡΠ΅Ρ
dp = (struct dirent *)reply_msg;
// ΠΡΡΠ°Π»ΠΎΡΡ Β«nleftΒ» Π±Π°ΠΉΡ
nleft = msg->i.nbytes;
while (ocb->offset < NUM_ENTS) {
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°
sprintf(fname, "%Ρ", ocb->offset + "a");
// ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π΅Π»ΠΈΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
nbytes = dirent_size(fname);
// ΠΡΡΡ ΠΌΠ΅ΡΡΠΎ?
if (nleft - nbytes >= 0) {
// ΠΠ°ΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
dp =
dirent_fill(dp, ocb->offset + 1, ocb->offset, fname);
// Π£Π²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ OCB
ocb->offset++;
// Π£ΡΠ΅ΡΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ
nleft -= nbytes;
} else {
// ΠΠ΅ΡΡΠ° Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ, ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ
break;
}
}
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΡ
MsgReply(ctp->rcvid, (char*)dp - reply_msg, reply_msg,
(char*)dp β reply_msg);
// ΠΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ Π±ΡΡΠ΅Ρ
free(reply_msg);
// Π‘ΠΊΠ°Π·Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ ΠΎΡΠ²Π΅ΡΠΈΠ»ΠΈ ΡΠ°ΠΌΠΈ
return (_RESMGR_NOREPLY);
}
my_read_file()Π ΡΡΠ½ΠΊΡΠΈΠΈ my_read_file() ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠ΄, ΠΏΠΎΡΡΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΠΏΡΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π²ΡΡΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΡΡΠ°Π½Π½Π°Ρ Π²Π΅ΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π·Π΄Π΅ΡΡ Π΄Π΅Π»Π°Π΅ΠΌ β ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ Π΄Π°Π½Π½ΡΡ , Π·Π½Π°ΡΠΈΡ, Π΅ΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ nbytes Π½Π΅ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ, ΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ (ΠΈ Π½ΠΈΡΠ΅ΠΌΡ Π΄ΡΡΠ³ΠΎΠΌΡ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΡ, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ string. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅ inode Π°ΡΡΠΈΠ±ΡΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ. ΠΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΏΡΠΈΠ΅ΠΌ Π΄Π»Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΠ², ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΡΡΠΊΠΎΠΌ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π°ΡΡΠΈΠ±ΡΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ (ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎΠ± ΡΡΠΎΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈΒ») ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² Π½Π΅ΠΉ Π»ΠΈΠ±ΠΎ ΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΠ΅, Π»ΠΈΠ±ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½ΠΈΡ .
static int my_read_file(resmgr_context_t *ctp,
io_read_t *msg, iofunc_ocb_t *ocb) {
int nbytes;
int nleft;
char string;
// Π’ΡΡ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ xtype...
if ((msg->i.xtype & _IO_XTYPE_MASK) != _IO_XTYPE_NONE) (
return (ENOSYS);
}
// ΠΡΡΡΠ½ΠΈΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡ ΠΎΡΡΠ°Π»ΠΎΡΡ...
nleft = ocb->attr->nbytes β ocb->offset;
// ...ΠΈ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ
nbytes = min(nleft, msg->i.nbytes);
if (nbytes) {
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ²Π΅ΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ
string = ocb->attr->inode - 1 + "A";
// ΠΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ Π΅Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ
MsgReply(ctp->rcvid, nbytes, &string + ocb->offset,
nbytes);
// ΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠ»Π°Π³ΠΈ ΠΈ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅
ocb->attr->flags |=
IOFUNC_ATTR_ATIME | IOFUNC_ATTR_DIRTY_TIME;
ocb->offset += nbytes;
} else {
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½Π΅ΡΠ΅Π³ΠΎ, ΠΈΠ½Π΄ΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°
MsgReply(ctp->rcvid, EOK, NULL, 0);
}
// Π£ΠΆΠ΅ ΠΎΡΠ²Π΅ΡΠΈΠ»ΠΈ ΡΠ°ΠΌΠΈ
return (_RESMGR_NOREPLY);
}
dirent_size()ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° dirent_size() ΠΏΡΠΎΡΡΠΎ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΠΈΡΠ»ΠΎ Π±Π°ΠΉΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ struct dirent, Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ. ΠΠΏΡΡΡ ΠΆΠ΅, Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ² Π·Π΄Π΅ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ ΡΠΎΡΠ½ΠΎ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠ² ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° β Π²ΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠΌΠ΅ΡΡ Π΄Π»ΠΈΠ½Ρ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ Π±Ρ ΡΠ°ΠΌ Π½ΠΈ Π±ΡΠ»ΠΎ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.
int dirent_size(char *fname) {
return (ALIGN(sizeof(struct dirent) - 4 + strlen(fname)));
}
dirent_fill()Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° dirent_fill() ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ Π΅ΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β ΠΏΠΎΠ»Π΅ΠΉ inode, offset ΠΈ fname) Π² ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Π΅ΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°. Π ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ΅Π΄ΡΠΎΡΡΠΈ ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π°Π΄ΡΠ΅Ρ (Ρ ΡΡΠ΅ΡΠΎΠΌ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ), Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°.
struct dirent* dirent_fill(struct dirent *dp, int inode,
int offset, char *fname) {
dp->d_ino = inode;
dp->d_offset = offset;