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