source: asp3_tinet_ecnl_arm/trunk/ntshell/src/ntshell_main.c@ 387

Last change on this file since 387 was 387, checked in by coas-nagasima, 5 years ago

ファイルディスクリプタ処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 9.1 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2017 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * サンプルプログラム(1)の本体
40 */
41
42#include "shellif.h"
43#include <kernel.h>
44#include <t_stdlib.h>
45#include <sil.h>
46#include <setjmp.h>
47#include <string.h>
48#include "syssvc/serial.h"
49#include "syssvc/syslog.h"
50#include "target_syssvc.h"
51#include "kernel_cfg.h"
52#include "ffarch.h"
53#include "ff.h"
54#include "core/ntshell.h"
55#include "core/ntlibc.h"
56#include "util/ntstdio.h"
57#include "usrcmd.h"
58#include "util/ntopt.h"
59#include "ntshell_main.h"
60#include "fdtable.h"
61
62char command[NTOPT_TEXT_MAXLEN];
63
64extern uint8_t mac_addr[6];
65const struct utsname host_name = {
66 "TOPPERS/ASP3",
67 TARGET_NAME,
68 "3.2.0",
69 "3.2.0",
70 TARGET_NAME,
71 "toppers.jp"
72};
73
74int shell_uname(struct utsname *uts)
75{
76 memcpy(uts, &host_name, sizeof(host_name));
77 return 0;
78}
79
80void stdio_open(ID portid);
81static int usrcmd_ntopt_callback(long *args, void *extobj);
82
83int ntshell_exit_code;
84volatile int ntshell_state;
85jmp_buf process_exit;
86
87void ntshell_task_init(ID portid)
88{
89 stdio_open(portid);
90}
91
92/*
93 * ntshellタスク
94 */
95void ntshell_task(intptr_t exinf)
96{
97 ntshell_state = 1;
98
99 if (setjmp(process_exit) == 0) {
100 ntshell_exit_code = ntopt_parse(command, usrcmd_ntopt_callback, NULL);
101 }
102
103 fflush(stdout);
104 clean_fd();
105
106 ntshell_state = 2;
107}
108
109void ntshell_change_netif_link(uint8_t link_up, uint8_t up)
110{
111 FLGPTN flgptn;
112 T_RTSK rtsk;
113 ER ret;
114
115 ret = ref_tsk(NTSHELL_TASK, &rtsk);
116 if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT))
117 return;
118
119 FD_SET(0, (fd_set *)&flgptn);
120
121 set_flg(FLG_SELECT_WAIT, flgptn);
122}
123
124static int usrcmd_ntopt_callback(long *args, void *extobj)
125{
126 const cmd_table_t *p = cmd_table_info.table;
127 int result = 0;
128 int found = 0;
129
130 if (*args == 0)
131 return result;
132
133 if (strcmp((const char *)args[1], "help") == 0) {
134 found = 1;
135 result = usrcmd_help(args[0], (char **)&args[1]);
136 }
137 else for (int i = 0; i < cmd_table_info.count; i++) {
138 if (strcmp((const char *)args[1], p->cmd) == 0) {
139 found = 1;
140 result = p->func(args[0], (char **)&args[1]);
141 break;
142 }
143 p++;
144 }
145
146 if ((found == 0) && (((const char *)args[1])[0] != '\0'))
147 printf("Unknown command found.\n");
148
149 return result;
150}
151
152int usrcmd_help(int argc, char **argv)
153{
154 const cmd_table_t *p = cmd_table_info.table;
155 for (int i = 0; i < cmd_table_info.count; i++) {
156 fwrite(p->cmd, strlen(p->cmd), 1, stdout);
157 fwrite("\t:", strlen("\t:"), 1, stdout);
158 puts(p->desc);
159 p++;
160 }
161 return 0;
162}
163
164void shell_abort()
165{
166 ntshell_exit_code = -1;
167 longjmp(process_exit, 1);
168}
169
170void shell_exit(int exitcd)
171{
172 ntshell_exit_code = exitcd;
173 longjmp(process_exit, 1);
174}
175
176void shell_exit_group(int exitcd)
177{
178 ntshell_exit_code = exitcd;
179 longjmp(process_exit, 1);
180}
181
182int execute_command(int wait)
183{
184 T_RTSK rtsk;
185 ER ret;
186
187 ret = ter_tsk(NTSHELL_TASK);
188 if ((ret != E_OK) && (ret != E_OBJ)) {
189 syslog(LOG_ERROR, "ter_tsk => %d", ret);
190 }
191
192 tslp_tsk(100000);
193
194 clean_fd();
195
196 ntshell_state = 0;
197 ret = act_tsk(NTSHELL_TASK);
198 if (ret != E_OK) {
199 syslog(LOG_ERROR, "act_tsk => %d", ret);
200 }
201
202 if (wait == 0)
203 return 0;
204
205 do {
206 tslp_tsk(100000);
207
208 ret = ref_tsk(NTSHELL_TASK, &rtsk);
209 if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT))
210 ntshell_state = 3;
211 } while(ntshell_state == 1);
212
213 return ntshell_exit_code;
214}
215
216int cmd_execute(const char *text, void *extobj)
217{
218 ntlibc_strlcpy(command, text, sizeof(command));
219 return execute_command(1);
220}
221
222int shell_clock_getres(clockid_t clk_id, struct timespec *res)
223{
224 if ((clk_id != CLOCK_REALTIME) && (clk_id != CLOCK_MONOTONIC))
225 return -EINVAL;
226
227 memset(&res->tv_sec, 0xFF, sizeof(res->tv_sec));
228 res->tv_nsec = 0;
229
230 return 0;
231}
232
233int shell_clock_gettime(clockid_t clk_id, struct timespec *tp)
234{
235 SYSTIM now = 0;
236
237 if ((clk_id != CLOCK_REALTIME) && (clk_id != CLOCK_MONOTONIC))
238 return -EINVAL;
239
240 get_tim(&now);
241 tp->tv_sec = now / 1000000;
242 tp->tv_nsec = (now % 1000000) * 1000;
243
244 return 0;
245}
246
247int shell_clock_settime(clockid_t clk_id, const struct timespec *tp)
248{
249 if ((clk_id != CLOCK_REALTIME) && (clk_id != CLOCK_MONOTONIC))
250 return -EINVAL;
251
252 SYSTIM time;
253 ER ret;
254
255 time = (tp->tv_sec * 1000000ll) + (tp->tv_nsec / 1000ll);
256
257 ret = set_tim(time);
258 if (ret != E_OK) {
259 return -EPERM;
260 }
261
262 return 0;
263}
264
265sigset_t g_sigmask;
266
267int shell_sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict old)
268{
269 if (old != NULL)
270 memcpy(old, &g_sigmask, sizeof(sigset_t));
271
272 switch (how) {
273 case SIG_BLOCK:
274 for (int i = 0; i < sizeof(g_sigmask.__bits) / sizeof(g_sigmask.__bits[0]); i++) {
275 g_sigmask.__bits[i] |= set->__bits[i];
276 }
277 break;
278 case SIG_UNBLOCK:
279 for (int i = 0; i < sizeof(g_sigmask.__bits) / sizeof(g_sigmask.__bits[0]); i++) {
280 g_sigmask.__bits[i] &= ~set->__bits[i];
281 }
282 break;
283 case SIG_SETMASK:
284 memcpy(&g_sigmask, set, sizeof(sigset_t));
285 break;
286 default:
287 return -EINVAL;
288 }
289
290 return 0;
291}
292
293// musl-1.1.18\src\internal\ksigaction.h
294struct k_sigaction {
295 void(*handler)(int);
296 unsigned long flags;
297 void(*restorer)(void);
298 unsigned mask[2];
299};
300
301struct k_sigaction sigtable[7];
302
303int shell_sigaction(int sig, const struct k_sigaction *__restrict sa,
304 struct k_sigaction *__restrict old, size_t size)
305{
306 struct k_sigaction *sat;
307
308 switch(sig){
309 case SIGALRM:
310 sat = &sigtable[0];
311 break;
312 case SIGFPE:
313 sat = &sigtable[1];
314 break;
315 case SIGILL:
316 sat = &sigtable[2];
317 break;
318 case SIGSEGV:
319 sat = &sigtable[3];
320 break;
321 case SIGBUS:
322 sat = &sigtable[4];
323 break;
324 case SIGABRT:
325 sat = &sigtable[5];
326 break;
327 case SIGPIPE:
328 sat = &sigtable[6];
329 break;
330 default:
331 return -EINVAL;
332 }
333
334 if (old != NULL)
335 memcpy(old, sat, offsetof(struct k_sigaction, mask) + size);
336
337 memcpy(sat, sa, offsetof(struct k_sigaction, mask) + size);
338
339 return 0;
340}
341
342int shell_madvise(void *a, size_t b, int c)
343{
344 return 0;
345}
346
347int shell_gettid()
348{
349 ID tskid;
350 ER ret;
351
352 ret = get_tid(&tskid);
353 if (ret != E_OK)
354 return -1;
355
356 return tskid;
357}
358
359int shell_tkill(int tid, int sig)
360{
361 if ((tid == NTSHELL_TASK) && (sig == SIGABRT)) {
362 shell_abort();
363 }
364
365 no_implement("tkill");
366 return -1;
367}
368
369int shell_kill(int pid, int sig)
370{
371 DebugBreak();
372 return -1;
373}
374
375int shell_gettimeofday(struct timeval *tv, void *tzvp)
376{
377 SYSTIM time;
378 if (!tv) return 0;
379 get_tim(&time);
380 tv->tv_sec = time / 1000000;
381 tv->tv_usec = time - (tv->tv_sec * 1000000);
382 return 0;
383}
384
385int shell_nanosleep(const struct timespec *req, struct timespec *rem)
386{
387 ER ret;
388 TMO tmo;
389 SYSTIM prev, now, diff;
390
391 if ((req == NULL) || (req->tv_nsec < 0) || (req->tv_nsec >= 1000000000))
392 return -EINVAL;
393
394 get_tim(&prev);
395
396 tmo = req->tv_sec * 1000000 + req->tv_nsec / 1000;
397 ret = tslp_tsk(tmo);
398 if (ret == E_OK) {
399 if (rem != NULL) {
400 get_tim(&now);
401 diff = now - prev;
402 rem->tv_sec = diff / 1000000ll;
403 rem->tv_nsec = (diff - (rem->tv_sec * 1000000ll)) * 1000ll;
404 }
405 return 0;
406 }
407 else if (ret == E_TMOUT) {
408 if (rem != NULL) {
409 rem->tv_sec = 0;
410 rem->tv_nsec = 0;
411 }
412 return 0;
413 }
414
415 return -EFAULT;
416}
Note: See TracBrowser for help on using the repository browser.