Make read_memory debug output use ccdbg_debug.
[fw/altos] / s51 / s51-main.c
1 /*
2  * Copyright © 2008 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #include "s51.h"
20 #include <unistd.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24
25 static int s51_port = 0;
26 static char *cpu = "8051";
27 static double freq = 11059200;
28 char *s51_prompt = "> ";
29 struct ccdbg *s51_dbg;
30
31 static void
32 usage(void)
33 {
34         fprintf(stderr, "You're doing it wrong.\n");
35         exit(1);
36 }
37
38 int
39 main(int argc, char **argv)
40 {
41         int flags, opt;
42         FILE *console_in = stdin;
43         FILE *console_out = stdout;
44         char *endptr;
45
46         while ((opt = getopt(argc, argv, "PVvHht:X:c:Z:s:S:p:")) != -1) {
47                 switch (opt) {
48                 case 't':
49                         cpu = optarg;
50                         break;
51                 case 'X':
52                         freq = strtod(optarg, &endptr);
53                         if (endptr == optarg)
54                                 usage();
55                         if (endptr[0] != '\0') {
56                                 if (!strcmp(endptr, "k"))
57                                         freq *= 1000;
58                                 else if (!strcmp(endptr, "M") )
59                                         freq *= 1000000;
60                                 else
61                                         usage ();
62                         }
63                         break;
64                 case 'c':
65                         break;
66                 case 'Z':
67                         s51_port = strtol(optarg, &endptr, 0);
68                         if (endptr == optarg || strlen(endptr) != 0)
69                                 usage();
70                         break;
71                 case 's':
72                         break;
73                 case 'S':
74                         break;
75                 case 'p':
76                         s51_prompt = optarg;
77                         break;
78                 case 'P':
79                         s51_prompt = NULL;
80                         break;
81                 case 'V':
82                         break;
83                 case 'v':
84                         break;
85                 case 'H':
86                         exit (0);
87                         break;
88                 case 'h':
89                         usage ();
90                         break;
91                 }
92         }
93         if (s51_port) {
94                 int l, r, one = 1;
95                 int s;
96                 struct sockaddr_in in;
97
98                 l = socket(AF_INET, SOCK_STREAM, 0);
99                 if (l < 0) {
100                         perror ("socket");
101                         exit(1);
102                 }
103                 in.sin_family = AF_INET;
104                 in.sin_port = htons(s51_port);
105                 in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
106                 r = bind(l, (struct sockaddr *) &in, sizeof (in));
107                 if (r) {
108                         perror("bind");
109                         exit(1);
110                 }
111                 r = setsockopt(l, SOL_SOCKET, SO_REUSEADDR, &one, sizeof (int));
112                 if (r) {
113                         perror("setsockopt");
114                         exit(1);
115                 }
116                 r = listen(l, 5);
117                 if (r) {
118                         perror("listen");
119                         exit(1);
120                 }
121                 for (;;) {
122                         struct sockaddr_in client_addr;
123                         socklen_t client_len = sizeof (struct sockaddr_in);
124                         FILE *client;
125                         
126                         s = accept(r, (struct sockaddr *)
127                                    &client_addr, &client_len);
128                         if (s < 0) {
129                                 perror("accept");
130                                 exit(1);
131                         }
132                         client = fdopen(s, "rw");
133                         if (!client) {
134                                 perror("fdopen");
135                                 exit(1);
136                         }
137                         command_read(client, client);
138                         fclose(client);
139                 }
140         } else
141                 command_read(console_in, console_out);
142         exit(0);
143 }