📄 callback.c
字号:
/* Remote target callback routines. Copyright 1995, 1996, 1997, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Cygnus Solutions. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* This file provides a standard way for targets to talk to the host OS level. */#ifdef HAVE_CONFIG_H#include "cconfig.h"#endif#include "ansidecl.h"#ifdef ANSI_PROTOTYPES#include <stdarg.h>#else#include <varargs.h>#endif#include <stdio.h>#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#ifdef HAVE_STRING_H#include <string.h>#else#ifdef HAVE_STRINGS_H#include <strings.h>#endif#endif#include <errno.h>#include <fcntl.h>#include <time.h>#include <sys/types.h>#include <sys/stat.h>#include "gdb/callback.h"#include "targ-vals.h"#ifdef HAVE_UNISTD_H#include <unistd.h>#endif/* ??? sim_cb_printf should be cb_printf, but until the callback support is broken out of the simulator directory, these are here to not require sim-utils.h. */void sim_cb_printf PARAMS ((host_callback *, const char *, ...));void sim_cb_eprintf PARAMS ((host_callback *, const char *, ...));extern CB_TARGET_DEFS_MAP cb_init_syscall_map[];extern CB_TARGET_DEFS_MAP cb_init_errno_map[];extern CB_TARGET_DEFS_MAP cb_init_open_map[];extern int system PARAMS ((const char *));static int os_init PARAMS ((host_callback *));static int os_shutdown PARAMS ((host_callback *));static int os_unlink PARAMS ((host_callback *, const char *));static long os_time PARAMS ((host_callback *, long *));static int os_system PARAMS ((host_callback *, const char *));static int os_rename PARAMS ((host_callback *, const char *, const char *));static int os_write_stdout PARAMS ((host_callback *, const char *, int));static void os_flush_stdout PARAMS ((host_callback *));static int os_write_stderr PARAMS ((host_callback *, const char *, int));static void os_flush_stderr PARAMS ((host_callback *));static int os_write PARAMS ((host_callback *, int, const char *, int));static int os_read_stdin PARAMS ((host_callback *, char *, int));static int os_read PARAMS ((host_callback *, int, char *, int));static int os_open PARAMS ((host_callback *, const char *, int));static int os_lseek PARAMS ((host_callback *, int, long, int));static int os_isatty PARAMS ((host_callback *, int));static int os_get_errno PARAMS ((host_callback *));static int os_close PARAMS ((host_callback *, int));static void os_vprintf_filtered PARAMS ((host_callback *, const char *, va_list));static void os_evprintf_filtered PARAMS ((host_callback *, const char *, va_list));static void os_error PARAMS ((host_callback *, const char *, ...));static int fdmap PARAMS ((host_callback *, int));static int fdbad PARAMS ((host_callback *, int));static int wrap PARAMS ((host_callback *, int));/* Set the callback copy of errno from what we see now. */static int wrap (p, val) host_callback *p; int val;{ p->last_errno = errno; return val;}/* Make sure the FD provided is ok. If not, return non-zero and set errno. */static int fdbad (p, fd) host_callback *p; int fd;{ if (fd < 0 || fd > MAX_CALLBACK_FDS || p->fd_buddy[fd] < 0) { p->last_errno = EINVAL; return -1; } return 0;}static int fdmap (p, fd) host_callback *p; int fd;{ return p->fdmap[fd];}static int os_close (p, fd) host_callback *p; int fd;{ int result; int i, next; result = fdbad (p, fd); if (result) return result; /* If this file descripter has one or more buddies (originals / duplicates from a dup), just remove it from the circular list. */ for (i = fd; (next = p->fd_buddy[i]) != fd; ) i = next; if (fd != i) p->fd_buddy[i] = p->fd_buddy[fd]; else result = wrap (p, close (fdmap (p, fd))); p->fd_buddy[fd] = -1; return result;}/* taken from gdb/util.c:notice_quit() - should be in a library */#if defined(__GO32__) || defined (_MSC_VER)static intos_poll_quit (p) host_callback *p;{#if defined(__GO32__) int kbhit (); int getkey (); if (kbhit ()) { int k = getkey (); if (k == 1) { return 1; } else if (k == 2) { return 1; } else { sim_cb_eprintf (p, "CTRL-A to quit, CTRL-B to quit harder\n"); } }#endif#if defined (_MSC_VER) /* NB - this will not compile! */ int k = win32pollquit(); if (k == 1) return 1; else if (k == 2) return 1;#endif return 0;}#else#define os_poll_quit 0#endif /* defined(__GO32__) || defined(_MSC_VER) */static int os_get_errno (p) host_callback *p;{ return cb_host_to_target_errno (p, p->last_errno);}static int os_isatty (p, fd) host_callback *p; int fd;{ int result; result = fdbad (p, fd); if (result) return result; result = wrap (p, isatty (fdmap (p, fd))); return result;}static int os_lseek (p, fd, off, way) host_callback *p; int fd; long off; int way;{ int result; result = fdbad (p, fd); if (result) return result; result = lseek (fdmap (p, fd), off, way); return result;}static int os_open (p, name, flags) host_callback *p; const char *name; int flags;{ int i; for (i = 0; i < MAX_CALLBACK_FDS; i++) { if (p->fd_buddy[i] < 0) { int f = open (name, cb_target_to_host_open (p, flags), 0644); if (f < 0) { p->last_errno = errno; return f; } p->fd_buddy[i] = i; p->fdmap[i] = f; return i; } } p->last_errno = EMFILE; return -1;}static int os_read (p, fd, buf, len) host_callback *p; int fd; char *buf; int len;{ int result; result = fdbad (p, fd); if (result) return result; result = wrap (p, read (fdmap (p, fd), buf, len)); return result;}static int os_read_stdin (p, buf, len) host_callback *p; char *buf; int len;{ return wrap (p, read (0, buf, len));}static int os_write (p, fd, buf, len) host_callback *p; int fd; const char *buf; int len;{ int result; int real_fd; result = fdbad (p, fd); if (result) return result; real_fd = fdmap (p, fd); switch (real_fd) { default: result = wrap (p, write (real_fd, buf, len)); break; case 1: result = p->write_stdout (p, buf, len); break; case 2: result = p->write_stderr (p, buf, len); break; } return result;}static int os_write_stdout (p, buf, len) host_callback *p ATTRIBUTE_UNUSED; const char *buf; int len;{ return fwrite (buf, 1, len, stdout);}static voidos_flush_stdout (p) host_callback *p ATTRIBUTE_UNUSED;{ fflush (stdout);}static int os_write_stderr (p, buf, len) host_callback *p ATTRIBUTE_UNUSED; const char *buf; int len;{ return fwrite (buf, 1, len, stderr);}static voidos_flush_stderr (p) host_callback *p ATTRIBUTE_UNUSED;{ fflush (stderr);}static int os_rename (p, f1, f2) host_callback *p; const char *f1; const char *f2;{ return wrap (p, rename (f1, f2));}static intos_system (p, s) host_callback *p; const char *s;{ return wrap (p, system (s));}static long os_time (p, t) host_callback *p; long *t;{ return wrap (p, time (t));}static int os_unlink (p, f1) host_callback *p; const char *f1;{ return wrap (p, unlink (f1));}static intos_stat (p, file, buf) host_callback *p; const char *file; struct stat *buf;{ /* ??? There is an issue of when to translate to the target layout. One could do that inside this function, or one could have the caller do it. It's more flexible to let the caller do it, though I'm not sure the flexibility will ever be useful. */ return wrap (p, stat (file, buf));}static intos_fstat (p, fd, buf) host_callback *p; int fd; struct stat *buf;{ if (fdbad (p, fd)) return -1; /* ??? There is an issue of when to translate to the target layout. One could do that inside this function, or one could have the caller do it. It's more flexible to let the caller do it, though I'm not sure the flexibility will ever be useful. */ return wrap (p, fstat (fdmap (p, fd), buf));}static int os_ftruncate (p, fd, len) host_callback *p; int fd; long len;{ int result; result = fdbad (p, fd); if (result) return result; result = wrap (p, ftruncate (fdmap (p, fd), len)); return result;}static intos_truncate (p, file, len) host_callback *p; const char *file; long len;{ return wrap (p, truncate (file, len));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -