Листинг 4.16. Функция server, использующая сообщения
//pipemesg/server.c
1 #include "mesg.h"
2 void
3 server(int readfd, int writefd)
4 {
5 FILE *fp;
6 ssize_t n;
7 struct mymesg mesg;
8 /* считывание полного имени из канала */
9 mesg.mesg_type = 1;
10 if ((n = Mesg_recv(readfd, &mesg)) == 0)
11 err_quit("pathname missing");
12 mesg.mesg_data[n] = '\0'; /* полное имя, завершающееся 0 */
13 if ((fp = fopen(mesg.mesg_data, "r")) == NULL) {
14 /* ошибка, нужно сообщить клиенту */
15 snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) – n,
16 ": can't open, %s\n", strerror(errno));
17 mesg.mesg_len = strlen(mesg.mesg_data);
18 Mesg_send(writefd, &mesg);
19 } else {
20 /* файл успешно открыт, передача данных */
21 while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {
22 mesg.mesg_len = strlen(mesg.mesg_data);
23 Mesg_send(writefd, &mesg);
24 }
25 Fclose(fp);
26 }
27 /* отправка сообщения нулевой длины для обозначения конца связи */
28 mesg.mesg_len = 0;
29 Mesg_send(writefd, &mesg);
30 }