Subversion Repositories Tewi

Rev

Rev 182 | Rev 187 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 182 Rev 183
Line 1... Line 1...
1
/* $Id: main.c 182 2024-09-27 12:55:12Z nishi $ */
1
/* $Id: main.c 183 2024-09-27 16:15:15Z nishi $ */
2
 
2
 
3
#define SOURCE
3
#define SOURCE
4
 
4
 
5
#include "../config.h"
5
#include "../config.h"
6
 
6
 
Line 26... Line 26...
26
#endif
26
#endif
27
 
27
 
28
#ifdef _PSP
28
#ifdef _PSP
29
#include <pspkernel.h>
29
#include <pspkernel.h>
30
#include <pspdebug.h>
30
#include <pspdebug.h>
-
 
31
#include <pspsdk.h>
-
 
32
#include <psputility.h>
-
 
33
#include <pspctrl.h>
-
 
34
#include <pspnet_apctl.h>
-
 
35
#include <pspwlan.h>
31
 
36
 
32
PSP_MODULE_INFO("Tewi HTTPd", PSP_MODULE_USER, 1, 1);
37
PSP_MODULE_INFO("Tewi HTTPd", PSP_MODULE_USER, 1, 1);
33
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
38
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
34
 
39
 
35
#define printf(...) pspDebugScreenPrintf(__VA_ARGS__)
40
#define printf(...) pspDebugScreenPrintf(__VA_ARGS__)
-
 
41
#define STDERR_LOG(...) pspDebugScreenPrintf(__VA_ARGS__)
-
 
42
#else
-
 
43
#define STDERR_LOG(...) fprintf(stderr, __VA_ARGS__)
36
#endif
44
#endif
37
 
45
 
38
extern bool cm_do_log;
46
extern bool cm_do_log;
39
extern struct tw_config config;
47
extern struct tw_config config;
40
extern FILE* logfile;
48
extern FILE* logfile;
Line 84... Line 92...
84
	status.dwCurrentState = SERVICE_STOPPED;
92
	status.dwCurrentState = SERVICE_STOPPED;
85
	SetServiceStatus(status_handle, &status);
93
	SetServiceStatus(status_handle, &status);
86
}
94
}
87
#endif
95
#endif
88
 
96
 
-
 
97
int running = 1;
-
 
98
#ifdef _PSP
-
 
99
 
-
 
100
int psp_exit_callback(int arg1, int arg2, void* arg3) { running = 0; }
-
 
101
 
-
 
102
int psp_callback_thread(SceSize args, void* argp) {
-
 
103
	int cid;
-
 
104
	cid = sceKernelCreateCallback("Exit Call Back", psp_exit_callback, NULL);
-
 
105
	sceKernelRegisterExitCallback(cid);
-
 
106
	sceKernelSleepThreadCB();
-
 
107
	return 0;
-
 
108
}
-
 
109
#endif
-
 
110
 
89
int main(int argc, char** argv) {
111
int main(int argc, char** argv) {
90
	logfile = stderr;
112
	logfile = stderr;
91
#ifdef SERVICE
113
#ifdef SERVICE
92
	SERVICE_TABLE_ENTRY table[] = {{"Tewi HTTPd", servmain}, {NULL, NULL}};
114
	SERVICE_TABLE_ENTRY table[] = {{"Tewi HTTPd", servmain}, {NULL, NULL}};
93
	StartServiceCtrlDispatcher(table);
115
	StartServiceCtrlDispatcher(table);
94
#else
116
#else
95
#ifdef _PSP
117
#ifdef _PSP
96
	pspDebugScreenInit();
118
	pspDebugScreenInit();
97
	pspDebugScreenSetXY(0, 0);
119
	pspDebugScreenSetXY(0, 0);
-
 
120
	printf("PSP Bootstrap, Tewi/%s\n", tw_get_version());
-
 
121
	int thid = sceKernelCreateThread("update_thread", psp_callback_thread, 0x11, 0xfa0, 0, NULL);
-
 
122
	if(thid >= 0) {
-
 
123
		sceKernelStartThread(thid, 0, NULL);
-
 
124
	} else {
-
 
125
		printf("Failed to start thread\n");
-
 
126
		while(running) sceKernelDelayThread(50 * 1000);
-
 
127
		sceKernelExitGame();
-
 
128
	}
-
 
129
	sceCtrlSetSamplingCycle(0);
-
 
130
	sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
-
 
131
	sceUtilityLoadNetModule(PSP_NET_MODULE_COMMON);
-
 
132
	sceUtilityLoadNetModule(PSP_NET_MODULE_INET);
-
 
133
	if(pspSdkInetInit()) {
-
 
134
		printf("Could not init the network\n");
-
 
135
		while(running) sceKernelDelayThread(50 * 1000);
-
 
136
		sceKernelExitGame();
-
 
137
	} else {
-
 
138
		printf("Network initialization successful\n");
-
 
139
	}
-
 
140
	if(sceWlanGetSwitchState() != 1) {
-
 
141
		printf("Turn the Wi-Fi switch on\n");
-
 
142
		while(sceWlanGetSwitchState() != 1) {
-
 
143
			sceKernelDelayThread(1000 * 1000);
-
 
144
		}
-
 
145
	} else {
-
 
146
		printf("Wi-Fi is turned on\n");
-
 
147
	}
-
 
148
	int i;
-
 
149
	int choice[100];
-
 
150
	int incr = 0;
-
 
151
	int last = 0;
-
 
152
	int cur = 0;
-
 
153
	for(i = 1; i < 100; i++) {
-
 
154
		choice[i - 1] = 0;
-
 
155
		netData name;
-
 
156
		netData data;
-
 
157
		if(sceUtilityCheckNetParam(i) != 0) continue;
-
 
158
		choice[incr++] = i;
-
 
159
		pspDebugScreenSetXY(0, 1 + 3 + incr - 1);
-
 
160
		if(incr == 1) printf("> ");
-
 
161
		pspDebugScreenSetXY(2, 1 + 3 + incr - 1);
-
 
162
		sceUtilityGetNetParam(i, 0, &name);
-
 
163
		sceUtilityGetNetParam(i, 1, &data);
-
 
164
		printf("SSID=%s", data.asString);
-
 
165
		sceUtilityGetNetParam(i, 4, &data);
-
 
166
		if(data.asString[0]) {
-
 
167
			sceUtilityGetNetParam(i, 5, &data);
-
 
168
			printf(" IPADDR=%s\n", data.asString);
-
 
169
		} else {
-
 
170
			printf(" DHCP\n");
-
 
171
		}
-
 
172
	}
-
 
173
	int press = 0;
-
 
174
	while(1) {
-
 
175
		if(!running) {
-
 
176
			sceKernelExitGame();
-
 
177
		}
-
 
178
		SceCtrlData c;
-
 
179
		sceCtrlReadBufferPositive(&c, 1);
-
 
180
		press = 0;
-
 
181
		if(c.Buttons & PSP_CTRL_DOWN) {
-
 
182
			if(cur < incr - 1) {
-
 
183
				cur++;
-
 
184
			}
-
 
185
			press = 1;
-
 
186
		} else if(c.Buttons & PSP_CTRL_UP) {
-
 
187
			if(cur > 0) {
-
 
188
				cur--;
-
 
189
			}
-
 
190
			press = -1;
-
 
191
		} else if(c.Buttons & PSP_CTRL_START) {
-
 
192
			break;
-
 
193
		}
-
 
194
		if(last != cur) {
-
 
195
			pspDebugScreenSetXY(0, 1 + 3 + last);
-
 
196
			printf("  ");
-
 
197
			pspDebugScreenSetXY(0, 1 + 3 + cur);
-
 
198
			printf("> ");
-
 
199
			last = cur;
-
 
200
		}
-
 
201
		if(press != 0) {
-
 
202
			while(1) {
-
 
203
				SceCtrlData c;
-
 
204
				sceCtrlReadBufferPositive(&c, 1);
-
 
205
				if(press == 1) {
-
 
206
					if(!(c.Buttons & PSP_CTRL_DOWN)) break;
-
 
207
				} else if(press == -1) {
-
 
208
					if(!(c.Buttons & PSP_CTRL_UP)) break;
-
 
209
				}
-
 
210
			}
-
 
211
		}
-
 
212
	}
-
 
213
	pspDebugScreenSetXY(0, 1 + 3 + incr + 1);
-
 
214
	int err = sceNetApctlConnect(choice[cur]);
-
 
215
	if(err != 0) {
-
 
216
		printf("Apctl initialization failure\n");
-
 
217
		while(running) sceKernelDelayThread(50 * 1000);
-
 
218
		sceKernelExitGame();
-
 
219
	} else {
-
 
220
		printf("Apctl initialization successful\n");
-
 
221
	}
-
 
222
	printf("Apctl connecting\n");
-
 
223
	while(1) {
-
 
224
		int state;
-
 
225
		err = sceNetApctlGetState(&state);
-
 
226
		if(err != 0) {
-
 
227
			printf("Apctl getting status failure\n");
-
 
228
			while(running) sceKernelDelayThread(50 * 1000);
-
 
229
			sceKernelExitGame();
-
 
230
		}
-
 
231
		if(state == 4) {
-
 
232
			break;
-
 
233
		}
-
 
234
		sceKernelDelayThread(50 * 1000);
-
 
235
	}
-
 
236
	union SceNetApctlInfo info;
-
 
237
	if(sceNetApctlGetInfo(8, &info) != 0) {
-
 
238
		printf("Got an unknown IP\n");
-
 
239
		while(running) sceKernelDelayThread(50 * 1000);
-
 
240
		sceKernelExitGame();
-
 
241
	}
-
 
242
	printf("Connected, My IP is %s\n", info.ip);
98
#endif
243
#endif
99
	int st = startup(argc, argv);
244
	int st = startup(argc, argv);
100
	if(st != -1) return st;
245
	if(st != -1) {
-
 
246
#ifdef _PSP
-
 
247
		printf("Error code %d\n", st);
-
 
248
		while(running) sceKernelDelayThread(50 * 1000);
-
 
249
		sceKernelExitGame();
-
 
250
#else
-
 
251
		return st;
-
 
252
#endif
-
 
253
	}
101
	tw_server_loop();
254
	tw_server_loop();
102
#endif
255
#endif
-
 
256
#ifdef _PSP
-
 
257
	sceKernelExitGame();
-
 
258
#endif
103
	return 0;
259
	return 0;
104
}
260
}
105
 
261
 
106
int startup(int argc, char** argv) {
262
int startup(int argc, char** argv) {
107
	int i;
263
	int i;
Line 121... Line 277...
121
						cm_do_log = true;
277
						cm_do_log = true;
122
					}
278
					}
123
				} else if(strcmp(argv[i], "--config") == 0 || strcmp(argv[i], "-C") == 0) {
279
				} else if(strcmp(argv[i], "--config") == 0 || strcmp(argv[i], "-C") == 0) {
124
					i++;
280
					i++;
125
					if(argv[i] == NULL) {
281
					if(argv[i] == NULL) {
126
						fprintf(stderr, "Missing argument\n");
282
						STDERR_LOG("Missing argument\n");
127
						return 1;
283
						return 1;
128
					}
284
					}
129
					confpath = argv[i];
285
					confpath = argv[i];
130
#ifndef _PSP
286
#ifndef _PSP
131
				} else if(strcmp(argv[i], "--logfile") == 0 || strcmp(argv[i], "-l") == 0) {
287
				} else if(strcmp(argv[i], "--logfile") == 0 || strcmp(argv[i], "-l") == 0) {
132
					i++;
288
					i++;
133
					if(argv[i] == NULL) {
289
					if(argv[i] == NULL) {
134
						fprintf(stderr, "Missing argument\n");
290
						STDERR_LOG("Missing argument\n");
135
						return 1;
291
						return 1;
136
					}
292
					}
137
					if(logfile != NULL && logfile != stderr) {
293
					if(logfile != NULL && logfile != stderr) {
138
						fclose(logfile);
294
						fclose(logfile);
139
					}
295
					}
140
					logfile = fopen(argv[i], "a");
296
					logfile = fopen(argv[i], "a");
141
					if(logfile == NULL) {
297
					if(logfile == NULL) {
142
						fprintf(stderr, "Failed to open logfile\n");
298
						STDERR_LOG("Failed to open logfile\n");
143
						return 1;
299
						return 1;
144
					}
300
					}
145
#endif
301
#endif
146
				} else if(strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "-V") == 0) {
302
				} else if(strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "-V") == 0) {
147
					printf("Tewi HTTPd Tewi/%s\n", tw_get_version());
303
					printf("Tewi HTTPd Tewi/%s\n", tw_get_version());
Line 155... Line 311...
155
#endif
311
#endif
156
					printf("--verbose | -v             : Verbose mode\n");
312
					printf("--verbose | -v             : Verbose mode\n");
157
					printf("--version | -V             : Version information\n");
313
					printf("--version | -V             : Version information\n");
158
					return 0;
314
					return 0;
159
				} else {
315
				} else {
160
					fprintf(stderr, "Unknown option: %s\n", argv[i]);
316
					STDERR_LOG("Unknown option: %s\n", argv[i]);
161
					return 1;
317
					return 1;
162
				}
318
				}
163
			}
319
			}
164
		}
320
		}
165
	}
321
	}
166
	tw_config_init();
322
	tw_config_init();
167
	if(tw_config_read(confpath) != 0) {
323
	if(tw_config_read(confpath) != 0) {
168
		fprintf(stderr, "Could not read the config\n");
324
		STDERR_LOG("Could not read the config\n");
169
		return 1;
325
		return 1;
170
	}
326
	}
171
	if(tw_server_init() != 0) {
327
	if(tw_server_init() != 0) {
172
		fprintf(stderr, "Could not initialize the server\n");
328
		STDERR_LOG("Could not initialize the server\n");
173
		return 1;
329
		return 1;
174
	}
330
	}
175
	sprintf(tw_server, "Tewi/%s (%s)%s", tw_get_version(), tw_get_platform(), config.extension == NULL ? "" : config.extension);
331
	sprintf(tw_server, "Tewi/%s (%s)%s", tw_get_version(), tw_get_platform(), config.extension == NULL ? "" : config.extension);
176
	char* r = cm_strcat(tw_server, " running...");
332
	char* r = cm_strcat(tw_server, " running...");
177
	cm_force_log(r);
333
	cm_force_log(r);