1 #ifdef __LITEOS_A__
2 #define _BSD_SOURCE
3 #include<netdb.h>
4 #include<errno.h>
5 #include<stdlib.h>
6 #include<stdio.h>
7 #include<string.h>
8 #endif
9 #include <netdb.h>
10 #include <unsupported_api.h>
11
12 #ifdef __LITEOS_A__
13 #define SERV_FILE_PATH "/etc/services"
14 #define BUFFER_SIZE 200
15 #define MAX_PORT 65535
16 #define MAX_ALIAS_NO 10
17
18 struct servdata
19 {
20 FILE *servf;
21 int stayopen;
22 struct servent se;
23 char buf[BUFFER_SIZE];
24 char *alias_list[MAX_ALIAS_NO + 1];
25 };
26 static struct servdata *sd = NULL;
27
servent_resolv()28 static int servent_resolv()
29 {
30 if (sd->buf[0] == '#')
31 return -1;
32 char *ch, *temp, *ptr = NULL;
33 ch = strchr(sd->buf, '#');
34 if (ch)
35 *ch = '\0';
36 ch = strtok_r(sd->buf, " \t\n", &ptr);
37 temp = strtok_r(NULL, " \t\n", &ptr);
38 if (!ch || !temp)
39 return -1;
40
41 sd->se.s_name = ch;
42 ch = strchr(temp, '/');
43 if (ch == NULL)
44 return -1;
45 *ch++ = '\0';
46 sd->se.s_port = atoi(temp);
47 if (sd->se.s_port < 1 || sd->se.s_port > MAX_PORT)
48 return -1;
49 sd->se.s_port = htons(sd->se.s_port);
50 if (strcmp(ch, "tcp") != 0 && strcmp(ch, "udp") != 0)
51 return -1;
52 sd->se.s_proto = ch;
53
54 int i = 0;
55 while (i < MAX_ALIAS_NO) {
56 ch = strtok_r(NULL, " \t\n", &ptr);
57 sd->alias_list[i++] = ch;
58 }
59 sd->alias_list[MAX_ALIAS_NO] = NULL;
60 sd->se.s_aliases = sd->alias_list;
61 return 0;
62 }
63 #endif
64
getservent(void)65 struct servent *getservent(void)
66 {
67 #ifdef __LITEOS_A__
68 if (sd == NULL) {
69 if ((sd = malloc(sizeof(struct servdata))) == NULL) {
70 errno = ENOMEM;
71 return NULL;
72 }
73 sd->servf = NULL;
74 sd->stayopen = 0;
75 }
76 if (!sd->servf && !(sd->servf = fopen(SERV_FILE_PATH, "r"))) {
77 errno = ENOENT;
78 free(sd);
79 sd = NULL;
80 return NULL;
81 }
82 do {
83 if (!fgets(sd->buf, BUFFER_SIZE - 1, sd->servf)) {
84 errno = EINVAL;
85 return NULL;
86 }
87 } while (servent_resolv());
88 return &(sd->se);
89 #else
90 return 0;
91 #endif
92 }
93
endservent(void)94 void endservent(void)
95 {
96 #ifdef __LITEOS_A__
97 if (sd == NULL)
98 return;
99 if (sd->stayopen == 0) {
100 if (sd->servf != NULL)
101 fclose(sd->servf);
102 free(sd);
103 sd = NULL;
104 }
105 #endif
106 }
107
setservent(int stayopen)108 void setservent(int stayopen)
109 {
110 #ifdef __LITEOS_A__
111 if (sd == NULL) {
112 if ((sd = malloc(sizeof(struct servdata))) == NULL) {
113 errno = ENOMEM;
114 return;
115 }
116 sd->servf = NULL;
117 }
118 if (!sd->servf)
119 sd->servf = fopen(SERV_FILE_PATH, "r");
120 else
121 rewind(sd->servf);
122 sd->stayopen = stayopen;
123 #endif
124 }
125