33fd00349f3bea4eb8949fbf76d4007da6297e71
[mTask.git] / int / interface_linux.c
1 #include <stdbool.h>
2 #include <stdint.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include <stdio.h>
7 #include <netdb.h>
8 #include <netinet/in.h>
9 #include <signal.h>
10 #include <sys/socket.h>
11 #include <sys/time.h>
12 #include <sys/types.h>
13 #include <unistd.h>
14
15 #include "interface.h"
16 struct timeval tv1;
17 int sock_fd = -1;
18 int fd = -1;
19 int gargc;
20 char **gargv;
21
22 uint8_t bt;
23
24 void killHandler(int i)
25 {
26 printf("%i caught, Bye...\n", i);
27 exit(1);
28 }
29
30 void usage(FILE *o, char *arg0){
31 fprintf(o, "Usage: %s [opts]\n\nOptions\n"
32 "-p PORT Custom port number, default: 8123\n" , arg0);
33 }
34
35 long millis(void) {
36 if (gettimeofday(&tv1, NULL) == -1)
37 pdie("gettimeofday");
38 return tv1.tv_sec*1000 + tv1.tv_usec/1000;
39 }
40
41 bool input_available(void){
42 struct timeval tv;
43 fd_set fds;
44 tv.tv_sec = 0;
45 tv.tv_usec = 0;
46 FD_ZERO(&fds);
47 FD_SET(fd, &fds);
48 if (select(fd+1, &fds, NULL, NULL, &tv) == -1)
49 pdie("select");
50 if(!FD_ISSET(fd, &fds))
51 return false;
52 read(fd, &bt, 1);
53 return true;
54 }
55
56 uint8_t read_byte(void)
57 {
58 read(fd, &bt, 1);
59 return bt;
60 }
61
62 void write_byte(uint8_t b)
63 {
64 write(fd, &b, 1);
65 }
66
67 void write_dpin(uint8_t i, bool b)
68 {
69 debug("dwrite %d: %d", i, b);
70 (void) i;
71 (void) b;
72 }
73
74 bool read_dpin(uint8_t i)
75 {
76 debug("dread %d", i);
77 return false;
78 (void) i;
79 }
80
81 void write_apin(uint8_t i, uint8_t a)
82 {
83 debug("awrite %d: %d", i, a);
84 (void) a;
85 (void) i;
86 }
87
88 uint8_t read_apin(uint8_t i)
89 {
90 debug("aread %d", i);
91 return 0;
92 (void) i;
93 }
94
95 void delay(long ms)
96 {
97 usleep(ms*1000);
98 }
99
100 void setup(void)
101 {
102 int port = 8123, opti = 1;
103 //Register signal handler
104 if(signal(SIGINT, killHandler) == SIG_ERR){
105 die("Couldn't register signal handler...");
106 }
107 if(signal(SIGTERM, killHandler) == SIG_ERR){
108 die("Couldn't register signal handler...");
109 }
110 //Command line arguments
111 while(opti < gargc){
112 if(strcmp((*gargv)+opti, "-h") == 0){
113 usage(stdout, gargv[0]);
114 exit(EXIT_SUCCESS);
115 } else if(strcmp(gargv[opti], "-p") == 0 && opti+1<gargc){
116 port = atoi(gargv[++opti]);
117 if(port < 1)
118 die("Port numbers are > 1");
119 } else {
120 usage(stderr, gargv[0]);
121 exit(EXIT_FAILURE);
122 }
123 opti++;
124 }
125
126 //Open file descriptors
127 struct sockaddr_in sa;
128
129 memset(&sa, 0, sizeof(sa));
130 sa.sin_family = AF_INET;
131 sa.sin_addr.s_addr = INADDR_ANY;
132 sa.sin_port = htons(port);
133
134 if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
135 pdie("socket");
136 if(bind(sock_fd, (struct sockaddr*)&sa, sizeof(sa)) == -1)
137 pdie("bind");
138 if(listen(sock_fd, 10) == -1)
139 pdie("listen");
140
141 printf("Listening on %d\n", port);
142 fflush(stdout);
143 if((fd = accept(sock_fd, (struct sockaddr*)NULL, NULL)) == -1)
144 pdie("accept");
145 }
146
147 void test(void)
148 {
149
150 }