d40253a91d9f16e579d2f1ee6a302c71d56e5005
[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 \r
30 #include <stdio.h>\r
31 #include <string.h>\r
32 #include <stdlib.h>\r
33 #include <unistd.h>\r
34 #include <errno.h>\r
35 #include <stdbool.h>\r
36 #include <getopt.h>\r
37 \r
38 #ifdef WIN32\r
39 #include <winsock2.h>\r
40 #include <ws2tcpip.h>\r
41 #include <windows.h>\r
42 static int inet_pton(int af, const char *src, void *dst);\r
43 \r
44 #else\r
45 #include <sys/socket.h>\r
46 #include <netinet/in.h>\r
47 #include <arpa/inet.h>\r
48 #include <sys/types.h>\r
49 #endif\r
50 \r
51 static int winsock_init(void);\r
52 static void winsock_fini(void);\r
53 \r
54 /**@brief   Default server addres.*/\r
55 static char *server_addr = "127.0.0.1";\r
56 \r
57 /**@brief   Default connection port.*/\r
58 static int connection_port = 1234;\r
59 \r
60 /**@brief   Call op*/\r
61 static char *op_code;\r
62 \r
63 static const char *usage = "                                    \n\\r
64 Welcome in lwext4_client.                                       \n\\r
65 Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)  \n\\r
66 Usage:                                                          \n\\r
67     --call (-c) - call opt                                      \n\\r
68     --port (-p) - server port                                   \n\\r
69     --addr (-a) - server ip address                             \n\\r
70 \n";\r
71 \r
72 \r
73 \r
74 static int client_connect(void)\r
75 {\r
76     int fd = 0;\r
77     struct sockaddr_in serv_addr;\r
78 \r
79     if(winsock_init() < 0) {\r
80         printf("winsock_init error\n");\r
81         exit(-1);\r
82     }\r
83 \r
84     memset(&serv_addr, '0', sizeof(serv_addr));\r
85     fd = socket(AF_INET, SOCK_STREAM, 0);\r
86     if(fd < 0) {\r
87         printf("socket() error: %s\n", strerror(errno));\r
88         exit(-1);\r
89     }\r
90 \r
91     serv_addr.sin_family = AF_INET;\r
92     serv_addr.sin_port = htons(connection_port);\r
93 \r
94     if(!inet_pton(AF_INET, server_addr, &serv_addr.sin_addr)){\r
95         printf("inet_pton() error\n");\r
96         exit(-1);\r
97     }\r
98 \r
99     if(connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))){\r
100         printf("connect() error: %s\n", strerror(errno));\r
101         exit(-1);\r
102     }\r
103 \r
104     return fd;\r
105 }\r
106 \r
107 \r
108 \r
109 static bool parse_opt(int argc, char **argv)\r
110 {\r
111     int option_index = 0;\r
112     int c;\r
113 \r
114     static struct option long_options[] =\r
115     {\r
116             {"call",    required_argument, 0, 'c'},\r
117             {"port",    required_argument, 0, 'p'},\r
118             {"addr",    required_argument, 0, 'a'},\r
119             {0, 0, 0, 0}\r
120     };\r
121 \r
122     while(-1 != (c = getopt_long (argc, argv, "c:p:a:", long_options, &option_index))) {\r
123 \r
124         switch(c){\r
125         case 'a':\r
126             server_addr = optarg;\r
127             break;\r
128         case 'p':\r
129             connection_port = atoi(optarg);\r
130             break;\r
131         case 'c':\r
132             op_code = optarg;\r
133             break;\r
134         default:\r
135             printf("%s", usage);\r
136             return false;\r
137 \r
138         }\r
139     }\r
140     return true;\r
141 }\r
142 \r
143 \r
144 int main(int argc, char *argv[])\r
145 {\r
146     int sockfd;\r
147     int n;\r
148     int rc;\r
149     char recvBuff[1024];\r
150 \r
151     if(!parse_opt(argc, argv))\r
152         return -1;\r
153 \r
154     sockfd = client_connect();\r
155 \r
156 \r
157     n = send(sockfd, op_code, strlen(op_code), 0);\r
158     if(n < 0) {\r
159         printf("\tWrite error: %s fd = %d\n", strerror(errno), sockfd);\r
160         return -1;\r
161     }\r
162 \r
163     n = recv(sockfd, (void *)&rc, sizeof(rc), 0);\r
164     if(n < 0) {\r
165         printf("\tWrite error: %s fd = %d\n", strerror(errno), sockfd);\r
166         return -1;\r
167     }\r
168 \r
169     printf("rc: %d %s\n", rc, strerror(rc));\r
170     if(rc)\r
171         printf("\t%s\n",op_code);\r
172 \r
173     return rc;\r
174 }\r
175 \r
176 static int winsock_init(void)\r
177 {\r
178 #if WIN32\r
179     int rc;\r
180     static WSADATA wsaData;\r
181     rc = WSAStartup(MAKEWORD(2,2), &wsaData);\r
182     if (rc != 0) {\r
183         return -1;\r
184     }\r
185 #endif\r
186     return 0;\r
187 }\r
188 \r
189 static void winsock_fini(void)\r
190 {\r
191 #if WIN32\r
192     WSACleanup();\r
193 #endif\r
194 }\r
195 \r
196 \r
197 #if WIN32\r
198 static int inet_pton(int af, const char *src, void *dst)\r
199 {\r
200     struct sockaddr_storage ss;\r
201     int size = sizeof(ss);\r
202     char src_copy[INET6_ADDRSTRLEN+1];\r
203 \r
204     ZeroMemory(&ss, sizeof(ss));\r
205     /* stupid non-const API */\r
206     strncpy (src_copy, src, INET6_ADDRSTRLEN+1);\r
207     src_copy[INET6_ADDRSTRLEN] = 0;\r
208 \r
209     if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {\r
210         switch(af) {\r
211         case AF_INET:\r
212             *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;\r
213             return 1;\r
214         case AF_INET6:\r
215             *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;\r
216             return 1;\r
217         }\r
218     }\r
219     return 0;\r
220 }\r
221 #endif\r