| Patrick Williams | 213cb26 | 2021-08-07 19:21:33 -0500 | [diff] [blame] | 1 | // (C) Copyright 2015 Intel Corporation | 
|  | 2 | // | 
|  | 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy | 
|  | 4 | // of this software and associated documentation files (the "Software"), to deal | 
|  | 5 | // in the Software without restriction, including without limitation the rights | 
|  | 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
|  | 7 | // copies of the Software, and to permit persons to whom the Software is | 
|  | 8 | // furnished to do so, subject to the following conditions: | 
|  | 9 | // | 
|  | 10 | // The above copyright notice and this permission notice shall be included in | 
|  | 11 | // all copies or substantial portions of the Software. | 
|  | 12 | // | 
|  | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
|  | 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
|  | 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
|  | 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
|  | 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|  | 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
|  | 19 | // THE SOFTWARE. | 
|  | 20 | #include <sys/socket.h> | 
|  | 21 | #include <stdio.h> | 
|  | 22 | #include <netinet/in.h> | 
|  | 23 | #include <netdb.h> | 
|  | 24 | #include <string.h> | 
|  | 25 |  | 
|  | 26 | int main(int argc, char* argv[]) | 
|  | 27 | { | 
|  | 28 | int sock,ret; | 
|  | 29 | struct sockaddr_in server_addr, client_addr; | 
|  | 30 | socklen_t len; | 
|  | 31 | char message[5]; | 
|  | 32 | char* label; | 
|  | 33 | char* attr = "security.SMACK64IPIN"; | 
|  | 34 | int port; | 
|  | 35 |  | 
|  | 36 | if(argc != 3) | 
|  | 37 | { | 
|  | 38 | perror("Server: Argument missing, please provide port and label for SMACK64IPIN"); | 
|  | 39 | return 2; | 
|  | 40 | } | 
|  | 41 |  | 
|  | 42 | port = atoi(argv[1]); | 
|  | 43 | label = argv[2]; | 
|  | 44 |  | 
|  | 45 | struct timeval timeout; | 
|  | 46 | timeout.tv_sec = 15; | 
|  | 47 | timeout.tv_usec = 0; | 
|  | 48 |  | 
|  | 49 | sock = socket(AF_INET,SOCK_DGRAM,0); | 
|  | 50 | if(sock < 0) | 
|  | 51 | { | 
|  | 52 | perror("Server: Socket error"); | 
|  | 53 | return 2; | 
|  | 54 | } | 
|  | 55 |  | 
|  | 56 |  | 
|  | 57 | if(fsetxattr(sock, attr, label, strlen(label), 0) < 0) | 
|  | 58 | { | 
|  | 59 | perror("Server: Unable to set attribute "); | 
|  | 60 | return 2; | 
|  | 61 | } | 
|  | 62 |  | 
|  | 63 | server_addr.sin_family = AF_INET; | 
|  | 64 | server_addr.sin_port = htons(port); | 
|  | 65 | server_addr.sin_addr.s_addr = INADDR_ANY; | 
|  | 66 | bzero(&(server_addr.sin_zero),8); | 
|  | 67 |  | 
|  | 68 |  | 
|  | 69 | if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) | 
|  | 70 | { | 
|  | 71 | perror("Server: Set timeout failed\n"); | 
|  | 72 | return 2; | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | if(bind(sock, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0) | 
|  | 76 | { | 
|  | 77 | perror("Server: Bind failure"); | 
|  | 78 | return 2; | 
|  | 79 | } | 
|  | 80 |  | 
|  | 81 | len = sizeof(client_addr); | 
|  | 82 | ret = recvfrom(sock, message, sizeof(message), 0, (struct sockaddr*)&client_addr, | 
|  | 83 | &len); | 
|  | 84 | close(sock); | 
|  | 85 | if(ret < 0) | 
|  | 86 | { | 
|  | 87 | perror("Server: Error receiving"); | 
|  | 88 | return 1; | 
|  | 89 |  | 
|  | 90 | } | 
|  | 91 | return 0; | 
|  | 92 | } | 
|  | 93 |  |