Merge pull request #3 from ngkaho1234/master
[lwext4.git] / fs_test / lwext4_client.c
1 /*\r
2  * Copyright (c) 2014 Grzegorz Kostka (kostka.grzegorz@gmail.com)\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * - Redistributions of source code must retain the above copyright\r
10  *   notice, this list of conditions and the following disclaimer.\r
11  * - Redistributions in binary form must reproduce the above copyright\r
12  *   notice, this list of conditions and the following disclaimer in the\r
13  *   documentation and/or other materials provided with the distribution.\r
14  * - The name of the author may not be used to endorse or promote products\r
15  *   derived from this software without specific prior written permission.\r
16  *\r
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  */\r
28 \r
29 #include <stdio.h>\r
30 #include <string.h>\r
31 #include <stdlib.h>\r
32 #include <unistd.h>\r
33 #include <errno.h>\r
34 #include <stdbool.h>\r
35 #include <getopt.h>\r
36 \r
37 #ifdef WIN32\r
38 #include <winsock2.h>\r
39 #include <ws2tcpip.h>\r
40 #include <windows.h>\r
41 static int inet_pton(int af, const char *src, void *dst);\r
42 \r
43 #else\r
44 #include <sys/socket.h>\r
45 #include <netinet/in.h>\r
46 #include <arpa/inet.h>\r
47 #include <sys/types.h>\r
48 #endif\r
49 \r
50 static int winsock_init(void);\r
51 static void winsock_fini(void);\r
52 \r
53 /**@brief   Default server addres.*/\r
54 static char *server_addr = "127.0.0.1";\r
55 \r
56 /**@brief   Default connection port.*/\r
57 static int connection_port = 1234;\r
58 \r
59 /**@brief   Call op*/\r
60 static char *op_code;\r
61 \r
62 static const char *usage = "                                    \n\\r
63 Welcome in lwext4_client.                                       \n\\r
64 Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)  \n\\r
65 Usage:                                                          \n\\r
66     --call (-c) - call opt                                      \n\\r
67     --port (-p) - server port                                   \n\\r
68     --addr (-a) - server ip address                             \n\\r
69 \n";\r
70 \r
71 static int client_connect(void)\r
72 {\r
73         int fd = 0;\r
74         struct sockaddr_in serv_addr;\r
75 \r
76         if (winsock_init() < 0) {\r
77                 printf("winsock_init error\n");\r
78                 exit(-1);\r
79         }\r
80 \r
81         memset(&serv_addr, '0', sizeof(serv_addr));\r
82         fd = socket(AF_INET, SOCK_STREAM, 0);\r
83         if (fd < 0) {\r
84                 printf("socket() error: %s\n", strerror(errno));\r
85                 exit(-1);\r
86         }\r
87 \r
88         serv_addr.sin_family = AF_INET;\r
89         serv_addr.sin_port = htons(connection_port);\r
90 \r
91         if (!inet_pton(AF_INET, server_addr, &serv_addr.sin_addr)) {\r
92                 printf("inet_pton() error\n");\r
93                 exit(-1);\r
94         }\r
95 \r
96         if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) {\r
97                 printf("connect() error: %s\n", strerror(errno));\r
98                 exit(-1);\r
99         }\r
100 \r
101         return fd;\r
102 }\r
103 \r
104 static bool parse_opt(int argc, char **argv)\r
105 {\r
106         int option_index = 0;\r
107         int c;\r
108 \r
109         static struct option long_options[] = {\r
110             {"call", required_argument, 0, 'c'},\r
111             {"port", required_argument, 0, 'p'},\r
112             {"addr", required_argument, 0, 'a'},\r
113             {0, 0, 0, 0}};\r
114 \r
115         while (-1 != (c = getopt_long(argc, argv, "c:p:a:", long_options,\r
116                                       &option_index))) {\r
117 \r
118                 switch (c) {\r
119                 case 'a':\r
120                         server_addr = optarg;\r
121                         break;\r
122                 case 'p':\r
123                         connection_port = atoi(optarg);\r
124                         break;\r
125                 case 'c':\r
126                         op_code = optarg;\r
127                         break;\r
128                 default:\r
129                         printf("%s", usage);\r
130                         return false;\r
131                 }\r
132         }\r
133         return true;\r
134 }\r
135 \r
136 int main(int argc, char *argv[])\r
137 {\r
138         int sockfd;\r
139         int n;\r
140         int rc;\r
141         char recvBuff[1024];\r
142 \r
143         if (!parse_opt(argc, argv))\r
144                 return -1;\r
145 \r
146         sockfd = client_connect();\r
147 \r
148         n = send(sockfd, op_code, strlen(op_code), 0);\r
149         if (n < 0) {\r
150                 printf("\tWrite error: %s fd = %d\n", strerror(errno), sockfd);\r
151                 return -1;\r
152         }\r
153 \r
154         n = recv(sockfd, (void *)&rc, sizeof(rc), 0);\r
155         if (n < 0) {\r
156                 printf("\tWrite error: %s fd = %d\n", strerror(errno), sockfd);\r
157                 return -1;\r
158         }\r
159 \r
160         printf("rc: %d %s\n", rc, strerror(rc));\r
161         if (rc)\r
162                 printf("\t%s\n", op_code);\r
163 \r
164         winsock_fini();\r
165         return rc;\r
166 }\r
167 \r
168 static int winsock_init(void)\r
169 {\r
170 #if WIN32\r
171         int rc;\r
172         static WSADATA wsaData;\r
173         rc = WSAStartup(MAKEWORD(2, 2), &wsaData);\r
174         if (rc != 0) {\r
175                 return -1;\r
176         }\r
177 #endif\r
178         return 0;\r
179 }\r
180 \r
181 static void winsock_fini(void)\r
182 {\r
183 #if WIN32\r
184         WSACleanup();\r
185 #endif\r
186 }\r
187 \r
188 #if WIN32\r
189 static int inet_pton(int af, const char *src, void *dst)\r
190 {\r
191         struct sockaddr_storage ss;\r
192         int size = sizeof(ss);\r
193         char src_copy[INET6_ADDRSTRLEN + 1];\r
194 \r
195         ZeroMemory(&ss, sizeof(ss));\r
196         /* stupid non-const API */\r
197         strncpy(src_copy, src, INET6_ADDRSTRLEN + 1);\r
198         src_copy[INET6_ADDRSTRLEN] = 0;\r
199 \r
200         if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss,\r
201                                &size) == 0) {\r
202                 switch (af) {\r
203                 case AF_INET:\r
204                         *(struct in_addr *)dst =\r
205                             ((struct sockaddr_in *)&ss)->sin_addr;\r
206                         return 1;\r
207                 case AF_INET6:\r
208                         *(struct in6_addr *)dst =\r
209                             ((struct sockaddr_in6 *)&ss)->sin6_addr;\r
210                         return 1;\r
211                 }\r
212         }\r
213         return 0;\r
214 }\r
215 #endif\r