diff options
Diffstat (limited to 'tools/misc/xen_read_console.c')
-rw-r--r-- | tools/misc/xen_read_console.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tools/misc/xen_read_console.c b/tools/misc/xen_read_console.c new file mode 100644 index 0000000000..632b01ad9a --- /dev/null +++ b/tools/misc/xen_read_console.c @@ -0,0 +1,53 @@ +/****************************************************************************** + * Test program for reading console lines from DOM0 port 666. + */ + +#include <arpa/inet.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int main(void) +{ + unsigned char buf[208], abuf[32]; + struct sockaddr_in addr, from; + int fromlen = sizeof(from); + int len, fd = socket(PF_INET, SOCK_DGRAM, 0); + + if ( fd < 0 ) + { + fprintf(stderr, "could not open datagram socket\n"); + return -1; + } + + memset(&addr, 0, sizeof(addr)); + addr.sin_addr.s_addr = htonl(0xa9fe0100); /* 169.254.1.0 */ + addr.sin_port = htons(666); + addr.sin_family = AF_INET; + if ( bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0 ) + { + fprintf(stderr, "could not bind to local address and port\n"); + return -1; + } + + while ( (len = recvfrom(fd, buf, sizeof(buf), 0, + (struct sockaddr *)&from, &fromlen)) + >= 0 ) + { + printf("%d-byte message from %s:%d --\n", len, + inet_ntop(AF_INET, &from.sin_addr, abuf, sizeof(abuf)), + ntohs(from.sin_port)); + + /* For sanity, clean up the string's tail. */ + if ( buf[len-1] != '\n' ) { buf[len] = '\n'; len++; } + buf[len] = '\0'; + + printf("%s", buf); + + fromlen = sizeof(from); + } + + return 0; +} |