Листинг 15.16. Процедура сервера, открывающая файл и возвращающая клиенту дескриптор
//doors/serverfd1.c
1 #include "unpipc.h"
2 void
3 servproc(void *cookie, char *dataptr, size_t datasize,
4 door_desc_t *descptr, size_t ndesc)
5 {
6 int fd;
7 char resbuf[BUFFSIZE];
8 door_desc_t desc;
9 dataptr[datasize-1] = 0; /* завершающий О */
10 if ((fd = open(dataptr, O_RDONLY)) == –1) {
11 /* ошибка, нужно сообщить клиенту */
12 snprintf(resbuf, BUFFSIZE, "%s: can't open, %s",
13 dataptr, strerror(errno));
14 Door_return(resbuf, strlen(resbuf), NULL, 0);
15 } else {
16 /* ОК, возвращаем дескриптор */
17 desc.d_data.d_desc.d_descriptor = fd;
18 desc.d_attributes = DOOR_DESCRIPTOR;
19 Door_return(NULL, 0, &desc, 1);
20 }
21 }