Листинг 6.13. Функция server
//svmsgmpx1q/server.c
1 #include "mesg.h"
2 void
3 server(int readfd, int writefd)
4 {
5 FILE *fp;
6 char *ptr;
7 pid_t pid;
8 ssize_t n;
9 struct mymesg mesg;
10 for (;;) {
11 /* считывание полного имени из канала IPC */
12 mesg.mesg_type = 1:
13 if ((n = Mesg_recv(readfd, &mesg)) == 0) {
14 err_msg("pathname missing");
15 continue;
16 }
17 mesg.mesg_data[n] = '\0'; /* полное имя */
18 if ((ptr = strchr(mesg.mesg_data, ' ')) == NULL) {
19 err_msg("bogus request: %s", mesg.mesg_data);
20 continue;
21 }
22 *ptr++ =0; /* ptr = полное имя */
23 pid = atol(mesg.mesg_data);
24 mesg.mesg_type = pid; /* для обратных сообщений */
25 if ((fp = fopen(ptr, "r")) == NULL) {
26 /* 4error: must tell client */
27 snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) – n,
28 ": can't open. %s\n", strerror(errno));
29 mesg.mesg_len – strlen(ptr);
30 memmove(mesg.mesg_data, ptr, mesg.mesg_len);
31 Mesg_send(writefd, &mesg);
32 } else {
33 /* файл открыт, копируем клиенту */
34 while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {
35 mesg.mesg_len = strlen(mesg.mesg_data);
36 Mesg_send(writefd, &mesg);
37 }
38 Fclose(fp);
39 }
40 /* сообщение нулевой длины заканчивает связь */
41 mesg.mesg_len = 0;
42 Mesg_send(writefd, &mesg);
43 }
44 }