f1a6855bde60ef31cba138babce10272aaf60583
[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 = 1234;\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     return rc;\r
146 }\r
147 \r
148 static int winsock_init(void)\r
149 {\r
150 #if WIN32\r
151     int rc;\r
152     static WSADATA wsaData;\r
153     rc = WSAStartup(MAKEWORD(2,2), &wsaData);\r
154     if (rc != 0) {\r
155         return -1;\r
156     }\r
157 #endif\r
158     return 0;\r
159 }\r
160 \r
161 static void winsock_fini(void)\r
162 {\r
163 #if WIN32\r
164     WSACleanup();\r
165 #endif\r
166 }\r
167 \r
168 \r
169 #if WIN32\r
170 static int inet_pton(int af, const char *src, void *dst)\r
171 {\r
172     struct sockaddr_storage ss;\r
173     int size = sizeof(ss);\r
174     char src_copy[INET6_ADDRSTRLEN+1];\r
175 \r
176     ZeroMemory(&ss, sizeof(ss));\r
177     /* stupid non-const API */\r
178     strncpy (src_copy, src, INET6_ADDRSTRLEN+1);\r
179     src_copy[INET6_ADDRSTRLEN] = 0;\r
180 \r
181     if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {\r
182         switch(af) {\r
183         case AF_INET:\r
184             *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;\r
185             return 1;\r
186         case AF_INET6:\r
187             *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;\r
188             return 1;\r
189         }\r
190     }\r
191     return 0;\r
192 }\r
193 #endif\r