} else if (S_ISREG(ocb->attr->mode)) {
return (my_read_file(ctp, msg, ocb));
} else {
return (EBADF);
}
}
Вот тут-то все веселье и начинается. С точки зрения высокого уровня, мы выделяем буфер (он называется
struct dirent
. Вспомогательная подпрограмма На первый взгляд этот код может показаться неэффективным; мы используем функцию
Наконец, обратите внимание, что мы используем поле
struct dirent
. Это означает, что мы также должны корректировать поле Возврат данных клиенту осуществляется «обычным» способом при помощи функции
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);
}
В функции
static int my_read_file(resmgr_context_t *ctp,
io_read_t *msg, iofunc_ocb_t *ocb) {
int nbytes;
int nleft;
char string;
// Тут нет никаких xtype...
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT