summaryrefslogtreecommitdiffstats
path: root/c/src/librdbg/src/m68k/any/remdeb_svc.c
blob: 1827a53e3c22110feae22fc9bff39ca7fdcf8f1d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <rpc/types.h>
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bsp.h>
#include <rdbg/servrpc.h>
#include <rdbg/remdeb.h>
#define fprintf(a,b) printf(b)
/*HEADER_START*/
#define RTEMS_PORT 2071
#define RTEMS_BACK_PORT 2073
/*
 * Sun request values for the remote ptrace system call
 */

  /*
   * Memory data for read/write text or data. The size is in data. The target
   * addr is in the addr field.
   * Be careful before modifying because this value goes into internal
   * pipes and is allocated on stack too. Pipes and/or the stack could
   * become too small if this value gets incremented.
   */
#ifndef XRY_MAX_CMD_STR
#endif /* REMDEB_H */
  /*
   * now open_connex() routine which establishes a connection to server 
   */
#define DEBUGGER_IS_GDB 0x2     /* */
  /*
   * now close_connex() routine which detaches from server 
   */
  /*
   * now send_signal() routine which sends signals to processes like kill(2) 
   */
  /*
   * now wait_info() routine which returns results of polling the wait status
   * of a process/actor. It may return 0 if running, else pid or -1 
   */
  /*
   * now ptrace() routine. This matches the Sun UNIX ptrace as well as
   * some additions 
   */
  /*
   * now define the actual calls we support 
   */
const char *names[] = {
  "NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
  "name4", "name5", "name6", "name7",
  "name8", "name9", "CLOSE_CONNEX", "PTRACE",
  "name12", "WAIT_INFO", "name14", "name15",
  "name16", "GET_SIGNAL_NAMES", "name18"
};

void
remotedeb_2 (struct svc_req *rqstp, register SVCXPRT * transp)
{
  union {
    open_in open_connex_2_arg;
    signal_in send_signal_2_arg;
    close_in close_connex_2_arg;
    ptrace_in ptrace_2_arg;
    wait_in wait_info_2_arg;
  } argument;
  char *result;
  xdrproc_t _xdr_argument, _xdr_result;
  char *(*local) (char *, struct svc_req *);

  DPRINTF (("remotedeb_2: %s (%d)\n",
            (unsigned) rqstp->rq_proc <
            (unsigned) (sizeof names / sizeof names[0]) ?
            names[rqstp->rq_proc] : "???", (int) rqstp->rq_proc));

  switch (rqstp->rq_proc) {
  case NULLPROC:
    (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *) NULL);
    return;

  case OPEN_CONNEX:
    _xdr_argument = (xdrproc_t) xdr_open_in;
    _xdr_result = (xdrproc_t) xdr_open_out;
    local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc;
    break;

  case SEND_SIGNAL:
    _xdr_argument = (xdrproc_t) xdr_signal_in;
    _xdr_result = (xdrproc_t) xdr_signal_out;
    local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc;
    break;

  case CLOSE_CONNEX:
    _xdr_argument = (xdrproc_t) xdr_close_in;
    _xdr_result = (xdrproc_t) xdr_void;
    local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc;
    break;

  case PTRACE:
    _xdr_argument = (xdrproc_t) xdr_ptrace_in;
    _xdr_result = (xdrproc_t) xdr_ptrace_out;
    local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc;
    break;

  case WAIT_INFO:
    _xdr_argument = (xdrproc_t) xdr_wait_in;
    _xdr_result = (xdrproc_t) xdr_wait_out;
    local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc;
    break;

  case GET_SIGNAL_NAMES:
    _xdr_argument = (xdrproc_t) xdr_void;
    _xdr_result = (xdrproc_t) xdr_get_signal_names_out;
    local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc;
    break;

  default:
    svcerr_noproc (transp);
    return;
  }
  memset ((char *) &argument, 0, sizeof (argument));
  if (!svc_getargs (transp, _xdr_argument, (caddr_t) & argument)) {
    svcerr_decode (transp);
    return;
  }
  result = (*local) ((char *) &argument, rqstp);
  if (result != NULL && !svc_sendreply (transp, _xdr_result, result)) {
    svcerr_systemerr (transp);
  }
  if (!svc_freeargs (transp, _xdr_argument, (caddr_t) & argument)) {
    fprintf (stderr, "unable to free arguments");
    exit (1);
  }
  return;
}