]>
git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/29k-share/udi/udr.c
1 /* This module supports sending and receiving data objects over a
4 Copyright 1993 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 static char udr_c
[]="@(#)udr.c 2.8 Daniel Mann";
23 static char udr_c_AMD
[]="@(#)udr.c 2.3, AMD";
25 * All data is serialised into a character stream,
26 * and de-serialised back into the approproiate objects.
27 ********************************************************************** HISTORY
29 /* This is all unneeded on DOS machines. */
33 #include <sys/types.h>
35 /* This used to say sys/fcntl.h, but the only systems I know of that
36 require that are old (pre-4.3, at least) BSD systems, which we
37 probably don't need to worry about. */
40 #include <sys/socket.h>
45 extern char* malloc();
47 /* local type decs. and macro defs. not in a .h file ************* MACRO/TYPE
50 /* global dec/defs. which are not in a .h file ************* EXPORT DEC/DEFS
52 int udr_errno
; /* error occurs during UDR service */
54 /* local dec/defs. which are not in a .h file *************** LOCAL DEC/DEFS
57 /****************************************************************** UDR_CREATE
58 * Build UDR structure for character stream processing.
60 int udr_create(udrs
, sd
, size
)
66 if(!udrs
->buff
) udrs
->buff
= malloc(size
);
67 udrs
->getbytes
= udrs
->buff
; /* set the buffer to the start */
68 udrs
->putbytes
= udrs
->buff
;
69 udrs
->putend
= udrs
->buff
;
70 udrs
->udr_op
= -1; /* don't know the direction */
71 udrs
->previous_op
= -1; /* don't know the direction */
76 /******************************************************************** UDR_FREE
77 * Free USR structure and close socket.
87 /****************************************************************** UDR_SIGNAL
88 * Send a signal to the process at the other end of the socket,
89 * indicating that it should expect to recieve a new message shortly.
94 if(send(udrs
->sd
, "I", 1, MSG_OOB
) == -1)
95 { perror("ERROR, udr_signal(), send(...MSG_OOB)");
96 udr_errno
= UDIErrorIPCInternal
;
97 return -1; /* return error code */
102 /***************************************************************** UDR_SENDNOW
103 * used to flush the current character stream buffer to
104 * the associated socket. */
105 int udr_sendnow(udrs
)
108 int size
= (UDIUInt32
)(udrs
->putend
) - (UDIUInt32
)(udrs
->buff
);
109 if(udrs
->previous_op
== 0)
110 { udr_errno
= UDIErrorIPCInternal
;
113 udrs
->putbytes
= udrs
->buff
;
114 udrs
->putend
= udrs
->buff
;
115 if (write(udrs
->sd
, udrs
->buff
, size
) == -1)
116 { perror("ERROR, udr_sendnow(), write() call: ");
117 udr_errno
= UDIErrorIPCInternal
;
118 return -1; /* return error code */
123 /******************************************************************** UDR_WORK
124 * Function to send or recieve data from the buffers supporting
125 * socket communication. The buffer contains serialised objects
126 * sent/recieved over a socket connection.
128 int udr_work(udrs
, object_p
, size
)
135 if(udrs
->udr_op
!= udrs
->previous_op
)
136 { if(udrs
->previous_op
== 0)
137 { udr_errno
= UDIErrorIPCInternal
;
140 udrs
->previous_op
= udrs
->udr_op
;
141 udrs
->putbytes
= udrs
->buff
;
142 udrs
->getbytes
= udrs
->buff
;
145 if(udrs
->udr_op
== UDR_ENCODE
)
146 { /* write data into character stream buffer */
147 if( (UDIUInt32
)(udrs
->putbytes
) + size
>
148 (UDIUInt32
)(udrs
->buff
) + (UDIUInt32
)(udrs
->bufsize
) )
149 { udr_errno
= UDIErrorIPCInternal
;
152 memcpy(udrs
->putbytes
, (char*)object_p
, size
);
153 udrs
->putbytes
+= size
;
154 if(udrs
->putbytes
> udrs
->putend
) udrs
->putend
= udrs
->putbytes
;
156 else if(udrs
->udr_op
== UDR_DECODE
)
158 if( (UDIUInt32
)(udrs
->putbytes
)-(UDIUInt32
)(udrs
->getbytes
) < size
)
159 { /* need more data in character stream buffer */
160 remain
= (UDIUInt32
)(udrs
->bufsize
) -
161 ( (UDIUInt32
)(udrs
->putbytes
)-(UDIUInt32
)(udrs
->buff
) );
162 if( ((UDIUInt32
)(udrs
->bufsize
) + (UDIUInt32
)(udrs
->buff
)
163 - (UDIUInt32
)(udrs
->getbytes
)) < size
)
164 { udr_errno
= UDIErrorIPCInternal
;
167 cnt
= read(udrs
->sd
, (char*)udrs
->putbytes
, remain
);
168 if(cnt
== -1) perror("ERROR udr_work(), read() failure: ");
169 udrs
->putbytes
+= cnt
;
170 if( (UDIUInt32
)(udrs
->putbytes
)-(UDIUInt32
)(udrs
->getbytes
) < size
)
171 { udr_errno
= UDIErrorIPCInternal
;
172 return -1; /* return error code */
174 } /* read data from character stream buffer */
175 memcpy((char*)object_p
, udrs
->getbytes
, size
);
176 udrs
->getbytes
+= size
;
179 { udr_errno
= UDIErrorIPCInternal
;
185 /************************************************************* UDR_UDIResource
187 int udr_UDIResource(udrs
, object_p
)
189 UDIResource
* object_p
;
193 retval
= udr_CPUSpace(udrs
, &object_p
->Space
);
194 retval
= retval
| udr_CPUOffset(udrs
, &object_p
->Offset
);
198 /**************************************************************** UDR_UDIRange
200 int udr_UDIRange(udrs
, object_p
)
206 retval
= udr_CPUOffset(udrs
, &object_p
->Low
);
207 retval
= retval
| udr_CPUOffset(udrs
, &object_p
->High
);
211 /********************************************************** UDR_UDIMemoryRange
213 int udr_UDIMemoryRange(udrs
, object_p
)
215 UDIMemoryRange
* object_p
;
219 retval
= udr_CPUSpace(udrs
, &object_p
->Space
);
220 retval
= retval
| udr_CPUOffset(udrs
, &object_p
->Offset
);
221 retval
= retval
| udr_CPUSizeT(udrs
, &object_p
->Size
);
225 /****************************************************************** UDR_string
227 int udr_string(udrs
, sp
)
233 if(udrs
->udr_op
== UDR_ENCODE
)
236 { len
= strlen(sp
) + 1;
237 retval
= udr_UDIInt32(udrs
, &len
);
238 retval
= retval
| udr_work(udrs
, sp
, len
);
240 else /* deal with NULL pointer */
242 retval
= udr_UDIInt32(udrs
, &len
);
245 else if(udrs
->udr_op
== UDR_DECODE
)
247 retval
= udr_UDIInt32(udrs
, &len
);
249 retval
= retval
| udr_work(udrs
, sp
, len
);
250 else *sp
= '\0'; /* terminate string */
253 { udr_errno
= UDIErrorIPCInternal
;
259 /******************************************************************* UDR_BYTES
261 int udr_bytes(udrs
, ptr
, len
)
266 return udr_work(udrs
, ptr
, len
);
269 /********************************************************************* UDR_INT
271 int udr_int(udrs
, int_p
)
276 UDIInt32 udr_obj
; /* object of know size */
278 if(udrs
->udr_op
== UDR_ENCODE
)
280 udr_obj
= *int_p
; /* copy into know object size */
281 return udr_UDIInt32(udrs
, &udr_obj
);
283 else if(udrs
->udr_op
== UDR_DECODE
)
285 ret_val
= udr_UDIInt32(udrs
, &udr_obj
); /* get object of known size */
290 { udr_errno
= UDIErrorIPCInternal
;
295 /****************************************************************** UDR_INLINE
297 char* udr_inline(udrs
, size
)
301 if(udrs
->udr_op
!= udrs
->previous_op
)
302 { if(udrs
->previous_op
== 0)
303 { udr_errno
= UDIErrorIPCInternal
;
306 udrs
->previous_op
= udrs
->udr_op
;
307 udrs
->putbytes
= udrs
->buff
;
308 udrs
->getbytes
= udrs
->buff
;
310 if(udrs
->udr_op
== UDR_ENCODE
)
312 if(udrs
->putbytes
+ size
> udrs
->bufsize
+ udrs
->buff
)
314 udrs
->putbytes
+= size
;
315 return udrs
->putbytes
- size
;
317 else if(udrs
->udr_op
== UDR_DECODE
)
319 if(udrs
->getbytes
+ size
> udrs
->bufsize
+ udrs
->buff
)
321 udrs
->getbytes
+= size
;
322 return udrs
->getbytes
- size
;
325 { udr_errno
= UDIErrorIPCInternal
;
330 /****************************************************************** UDR_GETPOS
332 char* udr_getpos(udrs
)
335 if(udrs
->udr_op
== UDR_ENCODE
)
337 return udrs
->putbytes
;
339 else if(udrs
->udr_op
== UDR_DECODE
)
341 return udrs
->getbytes
;
344 { udr_errno
= UDIErrorIPCInternal
;
349 /****************************************************************** UDR_SETPOS
351 int udr_setpos(udrs
, pos
)
355 if( ((UDIUInt32
)pos
> (UDIUInt32
)(udrs
->buff
) + (UDIUInt32
)(udrs
->bufsize
))
356 || ((UDIUInt32
)pos
< (UDIUInt32
)(udrs
->buff
) ) )
357 { udr_errno
= UDIErrorIPCInternal
;
360 if(udrs
->udr_op
== UDR_ENCODE
)
362 udrs
->putbytes
= pos
;
365 else if(udrs
->udr_op
== UDR_DECODE
)
367 udrs
->getbytes
= pos
;
371 { udr_errno
= UDIErrorIPCInternal
;
376 /***************************************************************** UDR_READNOW
377 * Try and ensure "size" bytes are available in the
378 * receive buffer character stream.
380 int udr_readnow(udrs
, size
)
386 if(udrs
->udr_op
== UDR_ENCODE
)
388 udr_errno
= UDIErrorIPCInternal
;
391 else if(udrs
->udr_op
== UDR_DECODE
)
393 if( (UDIUInt32
)(udrs
->putbytes
)-(UDIUInt32
)(udrs
->getbytes
) < size
)
394 { /* need more data in character stream buffer */
395 remain
= (UDIUInt32
)(udrs
->bufsize
) -
396 ( (UDIUInt32
)(udrs
->putbytes
)-(UDIUInt32
)(udrs
->buff
) );
397 cnt
= read(udrs
->sd
, (char*)udrs
->putbytes
, remain
);
398 if(cnt
== -1) perror("ERROR udr_work(), read() failure: ");
399 udrs
->putbytes
+= cnt
;
400 if( (UDIUInt32
)(udrs
->putbytes
)-(UDIUInt32
)(udrs
->getbytes
) < size
)
401 { fprintf(stderr
,"ERROR, udr_readnow() too few bytes in stream\n");
402 return -1; /* return error code */
407 { udr_errno
= UDIErrorIPCInternal
;
413 /******************************************************************* UDR_ALIGN
415 int udr_align(udrs
, size
)
422 align
= udr_getpos(udrs
);
423 offset
= size
- ((int)align
& (size
-1));
424 offset
= offset
& (size
-1);
425 if(offset
) udr_setpos(udrs
, align
+ offset
);
427 #endif /* __GO32__ */