Integrate parts of meta-intel-iot-security
[AGL/meta-agl.git] / meta-security / recipes-test / tcp-smack-test / files / tcp_server.c
1 // (C) Copyright 2015 Intel Corporation\r
2 //\r
3 // Permission is hereby granted, free of charge, to any person obtaining a copy\r
4 // of this software and associated documentation files (the "Software"), to deal\r
5 // in the Software without restriction, including without limitation the rights\r
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
7 // copies of the Software, and to permit persons to whom the Software is\r
8 // furnished to do so, subject to the following conditions:\r
9 //\r
10 // The above copyright notice and this permission notice shall be included in\r
11 // all copies or substantial portions of the Software.\r
12 //\r
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
19 // THE SOFTWARE.\r
20 #include <stdio.h>\r
21 #include <sys/socket.h>\r
22 #include <sys/types.h>\r
23 #include <errno.h>\r
24 #include <netinet/in.h>\r
25 #include <unistd.h>\r
26 #include <string.h>\r
27 \r
28 int main(int argc, char* argv[])\r
29 {\r
30 \r
31         int sock;\r
32         int clientsock;\r
33         char message[255];\r
34         socklen_t client_length;\r
35         struct sockaddr_in server_addr, client_addr;\r
36         char* label_in;\r
37         char* attr_in = "security.SMACK64IPIN";\r
38         int port;\r
39 \r
40         struct timeval timeout;\r
41         timeout.tv_sec = 15;\r
42         timeout.tv_usec = 0;\r
43 \r
44         if (argc != 3)\r
45         {\r
46                 perror("Server: Argument missing please provide port and label for SMACK64IPIN");\r
47                 return 2;\r
48         }\r
49         \r
50         port = atoi(argv[1]);\r
51         label_in = argv[2];\r
52         bzero(message,255);\r
53 \r
54         \r
55         if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)\r
56         {\r
57                 perror("Server: Socket failure");\r
58                 return 2;\r
59         }\r
60         \r
61         \r
62         if(fsetxattr(sock, attr_in, label_in, strlen(label_in),0) < 0)\r
63         {\r
64                 perror("Server: Unable to set attribute ipin 2");\r
65                 return 2;\r
66         }\r
67 \r
68         server_addr.sin_family = AF_INET;         \r
69         server_addr.sin_port = htons(port);     \r
70         server_addr.sin_addr.s_addr = INADDR_ANY; \r
71         bzero(&(server_addr.sin_zero),8); \r
72 \r
73         if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0)\r
74         {\r
75                 perror("Server: Set timeout failed\n");\r
76                 return 2;\r
77         }\r
78 \r
79         if(bind(sock, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0)\r
80         {\r
81                 perror("Server: Bind failure ");\r
82                 return 2;\r
83         }\r
84 \r
85         listen(sock, 1);\r
86         client_length = sizeof(client_addr);\r
87 \r
88         clientsock = accept(sock,(struct sockaddr*) &client_addr, &client_length);\r
89 \r
90         if (clientsock < 0)\r
91         {\r
92                 perror("Server: Connection failed");\r
93                 close(sock);\r
94                 return 1;\r
95         }\r
96         \r
97 \r
98         if(fsetxattr(clientsock, "security.SMACK64IPIN", label_in, strlen(label_in),0) < 0)\r
99         {\r
100                 perror(" Server: Unable to set attribute ipin 2");\r
101                 close(sock);\r
102                 return 2;\r
103         }\r
104 \r
105         if(read(clientsock, message, 254) < 0)\r
106         {\r
107                 perror("Server: Error when reading from socket");\r
108                 close(clientsock);\r
109                 close(sock);\r
110                 return 1;\r
111         }\r
112 \r
113 \r
114         close(clientsock);\r
115         close(sock);\r
116 \r
117         return 0;\r
118 }\r