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