• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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