ReactOS  0.4.13-dev-687-g023794c
xdr_rec.c File Reference
#include <wintirpc.h>
#include <io.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <rpc/auth.h>
#include <rpc/svc_auth.h>
#include <rpc/svc.h>
#include <rpc/clnt.h>
#include <stddef.h>
#include "rpc_com.h"
Include dependency graph for xdr_rec.c:

Go to the source code of this file.

Classes

struct  rec_strm
 

Macros

#define LAST_FRAG   ((u_int32_t)(1 << 31))
 

Typedefs

typedef struct rec_strm RECSTREAM
 

Functions

static bool_t xdrrec_getlong (XDR *, long *)
 
static bool_t xdrrec_putlong (XDR *, const long *)
 
static bool_t xdrrec_getbytes (XDR *, char *, u_int)
 
static bool_t xdrrec_putbytes (XDR *, const char *, u_int)
 
static u_int xdrrec_getpos (XDR *)
 
static bool_t xdrrec_setpos (XDR *, u_int)
 
static int32_txdrrec_inline (XDR *, u_int)
 
static void xdrrec_destroy (XDR *)
 
static u_int fix_buf_size (u_int)
 
static bool_t flush_out (RECSTREAM *, bool_t)
 
static bool_t fill_input_buf (RECSTREAM *)
 
static bool_t get_input_bytes (RECSTREAM *, char *, u_int)
 
static bool_t set_input_fragment (RECSTREAM *)
 
static bool_t skip_input_bytes (RECSTREAM *, u_int)
 
static bool_t realloc_stream (RECSTREAM *, u_int)
 
void xdrrec_create (XDR *xdrs, u_int sendsize, u_int recvsize, int *void *, int *readit, int *writeit)
 
int32_txdrrec_getoutbase (XDR *xdrs)
 
void xdrrec_setlastfrag (XDR *xdrs)
 
bool_t xdrrec_skiprecord (XDR *xdrs)
 
bool_t xdrrec_eof (XDR *xdrs)
 
bool_t xdrrec_endofrecord (XDR *xdrs, bool_t sendnow)
 
bool_t __xdrrec_getrec (XDR *xdrs, enum xprt_stat *statp, bool_t expectdata)
 
bool_t __xdrrec_setnonblock (XDR *xdrs, int maxrec)
 
bool_t __xdrrec_setblock (XDR *xdrs)
 

Variables

static const struct xdr_ops xdrrec_ops
 

Macro Definition Documentation

◆ LAST_FRAG

#define LAST_FRAG   ((u_int32_t)(1 << 31))

Definition at line 124 of file xdr_rec.c.

Typedef Documentation

◆ RECSTREAM

Function Documentation

◆ __xdrrec_getrec()

bool_t __xdrrec_getrec ( XDR xdrs,
enum xprt_stat statp,
bool_t  expectdata 
)

Definition at line 581 of file xdr_rec.c.

585 {
586  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
587  int n;
588  u_int fraglen;
589 
590  if (!rstrm->in_haveheader) {
591  n = rstrm->readit(rstrm->tcp_handle, rstrm->in_hdrp,
592  (int)sizeof (rstrm->in_header) - rstrm->in_hdrlen);
593  if (n == 0) {
594  *statp = expectdata ? XPRT_DIED : XPRT_IDLE;
595  return FALSE;
596  }
597  if (n < 0) {
598  *statp = XPRT_DIED;
599  return FALSE;
600  }
601  rstrm->in_hdrp += n;
602  rstrm->in_hdrlen += n;
603  if (rstrm->in_hdrlen < sizeof (rstrm->in_header)) {
604  *statp = XPRT_MOREREQS;
605  return FALSE;
606  }
607  rstrm->in_header = ntohl(rstrm->in_header);
608  fraglen = (int)(rstrm->in_header & ~LAST_FRAG);
609  if (fraglen == 0 || fraglen > rstrm->in_maxrec ||
610  (rstrm->in_reclen + fraglen) > rstrm->in_maxrec) {
611  *statp = XPRT_DIED;
612  return FALSE;
613  }
614  rstrm->fbtbc = rstrm->in_header & (~LAST_FRAG);
615  rstrm->in_reclen += fraglen;
616  if (rstrm->in_reclen > rstrm->recvsize)
617  realloc_stream(rstrm, rstrm->in_reclen);
618  if (rstrm->in_header & LAST_FRAG) {
619  rstrm->in_header &= ~LAST_FRAG;
620  rstrm->last_frag = TRUE;
621  }
622  }
623 
624  do {
625  n = rstrm->readit(rstrm->tcp_handle,
626  rstrm->in_base + rstrm->in_received,
627  (rstrm->in_reclen - rstrm->in_received));
628 
629  /* this case is needed for non-block as socket returns TIMEDOUT and -1
630  * -2 is an error case and covered by the next if() statement */
631  if (n == -1) continue;
632 
633  if (n < 0) {
634  *statp = XPRT_DIED;
635  return FALSE;
636  }
637 
638  if (n == 0) {
639  *statp = expectdata ? XPRT_DIED : XPRT_IDLE;
640  return FALSE;
641  }
642 
643  rstrm->in_received += n;
644  if (rstrm->in_received == rstrm->in_reclen) {
645  rstrm->in_haveheader = FALSE;
646  rstrm->in_hdrp = (char *)(void *)&rstrm->in_header;
647  rstrm->in_hdrlen = 0;
648  if (rstrm->last_frag) {
649  rstrm->in_boundry = rstrm->in_base + rstrm->in_reclen;
650  rstrm->in_finger = rstrm->in_base;
651  rstrm->in_reclen = rstrm->in_received = 0;
652  *statp = XPRT_MOREREQS;
653  return TRUE;
654  }
655  }
656  } while (1);
657 
658  *statp = XPRT_MOREREQS;
659  return FALSE;
660 }
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
char * in_base
Definition: xdr_rec.c:142
char * tcp_handle
Definition: xdr_rec.c:127
Definition: svc.h:82
GLdouble n
Definition: glext.h:7729
Definition: svc.h:84
int(* readit)(void *, void *, int)
Definition: xdr_rec.c:140
#define LAST_FRAG
Definition: xdr_rec.c:124
bool_t in_haveheader
Definition: xdr_rec.c:151
u_int in_maxrec
Definition: xdr_rec.c:157
char * in_hdrp
Definition: xdr_rec.c:153
bool_t last_frag
Definition: xdr_rec.c:146
u_int in_received
Definition: xdr_rec.c:156
u_int fbtbc
Definition: xdr_rec.c:145
static bool_t realloc_stream(RECSTREAM *, u_int)
Definition: xdr_rec.c:826
u_int in_reclen
Definition: xdr_rec.c:155
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125
UINT32 u_int
Definition: types.h:82
u_int recvsize
Definition: xdr_rec.c:148
u_int in_hdrlen
Definition: xdr_rec.c:154
u_int32_t in_header
Definition: xdr_rec.c:152
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define ntohl(x)
Definition: module.h:203

Referenced by svc_vc_recv(), and xdrrec_skiprecord().

◆ __xdrrec_setblock()

bool_t __xdrrec_setblock ( XDR xdrs)

Definition at line 677 of file xdr_rec.c.

679 {
680  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
681 
682  rstrm->nonblock = FALSE;
683  return TRUE;
684 }
#define TRUE
Definition: types.h:120
bool_t nonblock
Definition: xdr_rec.c:150
void * x_private
Definition: xdr.h:125

Referenced by clnt_cb_thread().

◆ __xdrrec_setnonblock()

bool_t __xdrrec_setnonblock ( XDR xdrs,
int  maxrec 
)

Definition at line 663 of file xdr_rec.c.

666 {
667  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
668 
669  rstrm->nonblock = TRUE;
670  if (maxrec == 0)
671  maxrec = rstrm->recvsize;
672  rstrm->in_maxrec = maxrec;
673  return TRUE;
674 }
#define TRUE
Definition: types.h:120
u_int in_maxrec
Definition: xdr_rec.c:157
bool_t nonblock
Definition: xdr_rec.c:150
void * x_private
Definition: xdr.h:125
u_int recvsize
Definition: xdr_rec.c:148

Referenced by clnt_cb_thread(), and rendezvous_request().

◆ fill_input_buf()

static bool_t fill_input_buf ( RECSTREAM rstrm)
static

Definition at line 709 of file xdr_rec.c.

711 {
712  char *where;
713  u_int32_t i;
714  int len;
715 
716  if (rstrm->nonblock)
717  return FALSE;
718 
719  where = rstrm->in_base;
721  where += i;
722  len = (u_int32_t)(rstrm->in_size - i);
723  if ((len = (*(rstrm->readit))(rstrm->tcp_handle, where, len)) == -1)
724  return (FALSE);
725  rstrm->in_finger = where;
726  where += len;
727  rstrm->in_boundry = where;
728  return (TRUE);
729 }
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
char * in_base
Definition: xdr_rec.c:142
char * tcp_handle
Definition: xdr_rec.c:127
int(* readit)(void *, void *, int)
Definition: xdr_rec.c:140
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define PtrToUlong(u)
Definition: config.h:107
u_long in_size
Definition: xdr_rec.c:141
bool_t nonblock
Definition: xdr_rec.c:150
GLenum GLsizei len
Definition: glext.h:6722
unsigned int u_int32_t
Definition: rosdhcp.h:35
char * in_finger
Definition: xdr_rec.c:143
#define u_int32_t
Definition: icmp.c:53
#define BYTES_PER_XDR_UNIT
Definition: xdr.h:93

Referenced by get_input_bytes(), and skip_input_bytes().

◆ fix_buf_size()

static u_int fix_buf_size ( u_int  s)
static

Definition at line 813 of file xdr_rec.c.

815 {
816 
817  if (s < 100)
818  s = 4000;
819  return (RNDUP(s));
820 }
GLdouble s
Definition: gl.h:2039
#define RNDUP(x)
Definition: xdr.h:94

Referenced by xdrrec_create().

◆ flush_out()

static bool_t flush_out ( RECSTREAM rstrm,
bool_t  eor 
)
static

Definition at line 689 of file xdr_rec.c.

692 {
693  u_int32_t eormask = (eor == TRUE) ? LAST_FRAG : 0;
695  PtrToUlong(rstrm->frag_header) - sizeof(u_int32_t));
696 
697  *(rstrm->frag_header) = htonl(len | eormask);
698  len = (u_int32_t)(PtrToUlong(rstrm->out_finger) -
699  PtrToUlong(rstrm->out_base));
700  if ((*(rstrm->writeit))(rstrm->tcp_handle, rstrm->out_base, (int)len)
701  != (int)len)
702  return (FALSE);
703  rstrm->frag_header = (u_int32_t *)(void *)rstrm->out_base;
704  rstrm->out_finger = (char *)rstrm->out_base + sizeof(u_int32_t);
705  return (TRUE);
706 }
#define TRUE
Definition: types.h:120
#define htonl(x)
Definition: module.h:212
char * tcp_handle
Definition: xdr_rec.c:127
char * out_base
Definition: xdr_rec.c:132
u_int32_t * frag_header
Definition: xdr_rec.c:135
#define LAST_FRAG
Definition: xdr_rec.c:124
char * out_finger
Definition: xdr_rec.c:133
#define PtrToUlong(u)
Definition: config.h:107
int(* writeit)(void *, void *, int)
Definition: xdr_rec.c:131
GLenum GLsizei len
Definition: glext.h:6722
unsigned int u_int32_t
Definition: rosdhcp.h:35
#define u_int32_t
Definition: icmp.c:53
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by xdrrec_endofrecord(), xdrrec_putbytes(), and xdrrec_putlong().

◆ get_input_bytes()

static bool_t get_input_bytes ( RECSTREAM rstrm,
char addr,
u_int  len 
)
static

Definition at line 732 of file xdr_rec.c.

736 {
737  size_t current;
738 
739  if (rstrm->nonblock) {
740  if (len > (u_int)(rstrm->in_boundry - rstrm->in_finger))
741  return FALSE;
742  memcpy(addr, rstrm->in_finger, (size_t)len);
743  rstrm->in_finger += len;
744  return TRUE;
745  }
746 
747  while (len > 0) {
748  current = (size_t)(PtrToLong(rstrm->in_boundry) -
749  PtrToLong(rstrm->in_finger));
750  if (current == 0) {
751  if (! fill_input_buf(rstrm))
752  return (FALSE);
753  continue;
754  }
755  current = (len < current) ? len : current;
756  memmove(addr, rstrm->in_finger, current);
757  rstrm->in_finger += current;
758  addr += current;
759  len -= current;
760  }
761  return (TRUE);
762 }
static bool_t fill_input_buf(RECSTREAM *)
Definition: xdr_rec.c:709
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
#define PtrToLong(p)
Definition: basetsd.h:84
__kernel_size_t size_t
Definition: linux.h:237
bool_t nonblock
Definition: xdr_rec.c:150
GLenum const GLvoid * addr
Definition: glext.h:9621
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
char * in_finger
Definition: xdr_rec.c:143
UINT32 u_int
Definition: types.h:82
struct task_struct * current
Definition: linux.c:32

Referenced by set_input_fragment(), and xdrrec_getbytes().

◆ realloc_stream()

static bool_t realloc_stream ( RECSTREAM rstrm,
u_int  size 
)
static

Definition at line 826 of file xdr_rec.c.

829 {
830  ptrdiff_t diff;
831  char *buf;
832 
833  if (size > rstrm->recvsize) {
834  buf = realloc(rstrm->in_base, (size_t)size);
835  if (buf == NULL)
836  return FALSE;
837  diff = buf - rstrm->in_base;
838  rstrm->in_finger += diff;
839  rstrm->in_base = buf;
840  rstrm->in_boundry = buf + size;
841  rstrm->recvsize = size;
842  rstrm->in_size = size;
843  }
844 
845  return TRUE;
846 }
#define realloc
Definition: debug_ros.c:6
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
char * in_base
Definition: xdr_rec.c:142
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
smooth NULL
Definition: ftsmooth.c:416
GLsizeiptr size
Definition: glext.h:5919
u_long in_size
Definition: xdr_rec.c:141
char * in_finger
Definition: xdr_rec.c:143
__kernel_ptrdiff_t ptrdiff_t
Definition: linux.h:247
u_int recvsize
Definition: xdr_rec.c:148

Referenced by __xdrrec_getrec().

◆ set_input_fragment()

static bool_t set_input_fragment ( RECSTREAM rstrm)
static

Definition at line 765 of file xdr_rec.c.

767 {
769 
770  if (rstrm->nonblock)
771  return FALSE;
772  if (! get_input_bytes(rstrm, (char *)(void *)&header, sizeof(header)))
773  return (FALSE);
774  header = ntohl(header);
775  rstrm->last_frag = ((header & LAST_FRAG) == 0) ? FALSE : TRUE;
776  /*
777  * Sanity check. Try not to accept wildly incorrect
778  * record sizes. Unfortunately, the only record size
779  * we can positively identify as being 'wildly incorrect'
780  * is zero. Ridiculously large record sizes may look wrong,
781  * but we don't have any way to be certain that they aren't
782  * what the client actually intended to send us.
783  */
784  if (header == 0)
785  return(FALSE);
786  rstrm->fbtbc = header & (~LAST_FRAG);
787  return (TRUE);
788 }
#define TRUE
Definition: types.h:120
#define LAST_FRAG
Definition: xdr_rec.c:124
bool_t last_frag
Definition: xdr_rec.c:146
bool_t nonblock
Definition: xdr_rec.c:150
u_int fbtbc
Definition: xdr_rec.c:145
unsigned int u_int32_t
Definition: rosdhcp.h:35
static bool_t get_input_bytes(RECSTREAM *, char *, u_int)
Definition: xdr_rec.c:732
struct CFHEADER header
Definition: fdi.c:109
#define ntohl(x)
Definition: module.h:203

Referenced by xdrrec_eof(), xdrrec_getbytes(), and xdrrec_skiprecord().

◆ skip_input_bytes()

static bool_t skip_input_bytes ( RECSTREAM rstrm,
u_int  cnt 
)
static

Definition at line 791 of file xdr_rec.c.

794 {
796 
797  while (cnt > 0) {
798  current = (u_int32_t)(PtrToUlong(rstrm->in_boundry) -
799  PtrToUlong(rstrm->in_finger));
800  if (current == 0) {
801  if (! fill_input_buf(rstrm))
802  return (FALSE);
803  continue;
804  }
805  current = (u_int32_t)((cnt < current) ? cnt : current);
806  rstrm->in_finger += current;
807  cnt -= current;
808  }
809  return (TRUE);
810 }
static bool_t fill_input_buf(RECSTREAM *)
Definition: xdr_rec.c:709
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
#define PtrToUlong(u)
Definition: config.h:107
unsigned int u_int32_t
Definition: rosdhcp.h:35
char * in_finger
Definition: xdr_rec.c:143
#define u_int32_t
Definition: icmp.c:53
struct task_struct * current
Definition: linux.c:32

Referenced by xdrrec_eof(), and xdrrec_skiprecord().

◆ xdrrec_create()

void xdrrec_create ( XDR xdrs,
u_int  sendsize,
u_int  recvsize,
int void *,
int readit,
int writeit 
)

Definition at line 179 of file xdr_rec.c.

188 {
189  RECSTREAM *rstrm = mem_alloc(sizeof(RECSTREAM));
190 
191  if (rstrm == NULL) {
192  //warnx("xdrrec_create: out of memory");
193  /*
194  * This is bad. Should rework xdrrec_create to
195  * return a handle, and in this case return NULL
196  */
197  return;
198  }
199  rstrm->sendsize = sendsize = fix_buf_size(sendsize);
200  rstrm->out_base = mem_alloc(rstrm->sendsize);
201  if (rstrm->out_base == NULL) {
202  //warnx("xdrrec_create: out of memory");
203  mem_free(rstrm, sizeof(RECSTREAM));
204  return;
205  }
206  rstrm->recvsize = recvsize = fix_buf_size(recvsize);
207  rstrm->in_base = mem_alloc(recvsize);
208  if (rstrm->in_base == NULL) {
209  //warnx("xdrrec_create: out of memory");
210  mem_free(rstrm->out_base, sendsize);
211  mem_free(rstrm, sizeof(RECSTREAM));
212  return;
213  }
214  /*
215  * now the rest ...
216  */
217  xdrs->x_ops = &xdrrec_ops;
218  xdrs->x_private = rstrm;
219  rstrm->tcp_handle = tcp_handle;
220  rstrm->readit = readit;
221  rstrm->writeit = writeit;
222  rstrm->out_finger = rstrm->out_boundry = rstrm->out_base;
223  rstrm->frag_header = (u_int32_t *)(void *)rstrm->out_base;
224  rstrm->out_finger += sizeof(u_int32_t);
225  rstrm->out_boundry += sendsize;
226  rstrm->frag_sent = FALSE;
227  rstrm->in_size = recvsize;
228  rstrm->in_boundry = rstrm->in_base;
229  rstrm->in_finger = (rstrm->in_boundry += recvsize);
230  rstrm->fbtbc = 0;
231  rstrm->last_frag = TRUE;
232  rstrm->in_haveheader = FALSE;
233  rstrm->in_hdrlen = 0;
234  rstrm->in_hdrp = (char *)(void *)&rstrm->in_header;
235  rstrm->nonblock = FALSE;
236  rstrm->in_reclen = 0;
237  rstrm->in_received = 0;
238 }
#define TRUE
Definition: types.h:120
static const struct xdr_ops xdrrec_ops
Definition: xdr_rec.c:100
char * in_boundry
Definition: xdr_rec.c:144
char * in_base
Definition: xdr_rec.c:142
char * tcp_handle
Definition: xdr_rec.c:127
char * out_base
Definition: xdr_rec.c:132
int(* readit)(void *, void *, int)
Definition: xdr_rec.c:140
u_int32_t * frag_header
Definition: xdr_rec.c:135
char * out_finger
Definition: xdr_rec.c:133
#define mem_alloc(bsize)
Definition: types.h:123
bool_t in_haveheader
Definition: xdr_rec.c:151
smooth NULL
Definition: ftsmooth.c:416
bool_t frag_sent
Definition: xdr_rec.c:136
u_int sendsize
Definition: xdr_rec.c:147
int(* writeit)(void *, void *, int)
Definition: xdr_rec.c:131
u_long in_size
Definition: xdr_rec.c:141
char * in_hdrp
Definition: xdr_rec.c:153
bool_t last_frag
Definition: xdr_rec.c:146
char * out_boundry
Definition: xdr_rec.c:134
bool_t nonblock
Definition: xdr_rec.c:150
u_int in_received
Definition: xdr_rec.c:156
u_int fbtbc
Definition: xdr_rec.c:145
unsigned int u_int32_t
Definition: rosdhcp.h:35
u_int in_reclen
Definition: xdr_rec.c:155
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125
const struct __rpc_xdr::xdr_ops * x_ops
#define mem_free(ptr, bsize)
Definition: types.h:124
#define u_int32_t
Definition: icmp.c:53
u_int recvsize
Definition: xdr_rec.c:148
static u_int fix_buf_size(u_int)
Definition: xdr_rec.c:813
u_int in_hdrlen
Definition: xdr_rec.c:154
u_int32_t in_header
Definition: xdr_rec.c:152

Referenced by clnt_vc_create(), and makefd_xprt().

◆ xdrrec_destroy()

static void xdrrec_destroy ( XDR xdrs)
static

Definition at line 469 of file xdr_rec.c.

471 {
472  RECSTREAM *rstrm = (RECSTREAM *)xdrs->x_private;
473 
474  mem_free(rstrm->out_base, rstrm->sendsize);
475  mem_free(rstrm->in_base, rstrm->recvsize);
476  mem_free(rstrm, sizeof(RECSTREAM));
477 }
char * in_base
Definition: xdr_rec.c:142
char * out_base
Definition: xdr_rec.c:132
u_int sendsize
Definition: xdr_rec.c:147
void * x_private
Definition: xdr.h:125
#define mem_free(ptr, bsize)
Definition: types.h:124
u_int recvsize
Definition: xdr_rec.c:148

◆ xdrrec_endofrecord()

bool_t xdrrec_endofrecord ( XDR xdrs,
bool_t  sendnow 
)

Definition at line 555 of file xdr_rec.c.

558 {
559  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
560  u_long len; /* fragment length */
561 
562  if (sendnow || rstrm->frag_sent ||
563  (PtrToUlong(rstrm->out_finger) + sizeof(u_int32_t) >=
564  PtrToUlong(rstrm->out_boundry))) {
565  rstrm->frag_sent = FALSE;
566  return (flush_out(rstrm, TRUE));
567  }
568  len = PtrToUlong(rstrm->out_finger) - PtrToUlong(rstrm->frag_header) -
569  sizeof(u_int32_t);
570  *(rstrm->frag_header) = htonl((u_int32_t)len | LAST_FRAG);
571  rstrm->frag_header = (u_int32_t *)(void *)rstrm->out_finger;
572  rstrm->out_finger += sizeof(u_int32_t);
573  return (TRUE);
574 }
#define TRUE
Definition: types.h:120
unsigned long u_long
Definition: linux.h:269
#define htonl(x)
Definition: module.h:212
u_int32_t * frag_header
Definition: xdr_rec.c:135
#define LAST_FRAG
Definition: xdr_rec.c:124
char * out_finger
Definition: xdr_rec.c:133
bool_t frag_sent
Definition: xdr_rec.c:136
#define PtrToUlong(u)
Definition: config.h:107
char * out_boundry
Definition: xdr_rec.c:134
GLenum GLsizei len
Definition: glext.h:6722
unsigned int u_int32_t
Definition: rosdhcp.h:35
void * x_private
Definition: xdr.h:125
static bool_t flush_out(RECSTREAM *, bool_t)
Definition: xdr_rec.c:689
#define u_int32_t
Definition: icmp.c:53

Referenced by clnt_cb_thread(), and svc_vc_reply().

◆ xdrrec_eof()

bool_t xdrrec_eof ( XDR xdrs)

Definition at line 531 of file xdr_rec.c.

533 {
534  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
535 
536  while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) {
537  if (! skip_input_bytes(rstrm, rstrm->fbtbc))
538  return (TRUE);
539  rstrm->fbtbc = 0;
540  if ((! rstrm->last_frag) && (! set_input_fragment(rstrm)))
541  return (TRUE);
542  }
543  if (rstrm->in_finger == rstrm->in_boundry)
544  return (TRUE);
545  return (FALSE);
546 }
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
static bool_t skip_input_bytes(RECSTREAM *, u_int)
Definition: xdr_rec.c:791
static bool_t set_input_fragment(RECSTREAM *)
Definition: xdr_rec.c:765
bool_t last_frag
Definition: xdr_rec.c:146
u_int fbtbc
Definition: xdr_rec.c:145
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125

Referenced by svc_vc_stat().

◆ xdrrec_getbytes()

static bool_t xdrrec_getbytes ( XDR xdrs,
char addr,
u_int  len 
)
static

Definition at line 295 of file xdr_rec.c.

299 {
300  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
301  u_int current;
302 
303  while (len > 0) {
304  current = (int)rstrm->fbtbc;
305  if (current == 0) {
306  if (rstrm->last_frag)
307  return (FALSE);
308  if (! set_input_fragment(rstrm))
309  return (FALSE);
310  continue;
311  }
312  current = (len < current) ? len : current;
313  if (! get_input_bytes(rstrm, addr, current))
314  return (FALSE);
315  addr += current;
316  rstrm->fbtbc -= current;
317  len -= current;
318  }
319  return (TRUE);
320 }
#define TRUE
Definition: types.h:120
static bool_t set_input_fragment(RECSTREAM *)
Definition: xdr_rec.c:765
if(!(yy_init))
Definition: macro.lex.yy.c:714
bool_t last_frag
Definition: xdr_rec.c:146
u_int fbtbc
Definition: xdr_rec.c:145
GLenum const GLvoid * addr
Definition: glext.h:9621
GLenum GLsizei len
Definition: glext.h:6722
static bool_t get_input_bytes(RECSTREAM *, char *, u_int)
Definition: xdr_rec.c:732
void * x_private
Definition: xdr.h:125
UINT32 u_int
Definition: types.h:82
struct task_struct * current
Definition: linux.c:32
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by xdrrec_getlong().

◆ xdrrec_getlong()

static bool_t xdrrec_getlong ( XDR xdrs,
long lp 
)
static

Definition at line 247 of file xdr_rec.c.

250 {
251  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
252  int32_t *buflp = (int32_t *)(void *)(rstrm->in_finger);
253  int32_t mylong;
254 
255  /* first try the inline, fast case */
256  if ((rstrm->fbtbc >= sizeof(int32_t)) &&
257  ((PtrToLong(rstrm->in_boundry) - PtrToLong(buflp)) >= sizeof(int32_t))) {
258  *lp = (long)ntohl((u_int32_t)(*buflp));
259  rstrm->fbtbc -= sizeof(int32_t);
260  rstrm->in_finger += sizeof(int32_t);
261  } else {
262  if (! xdrrec_getbytes(xdrs, (char *)(void *)&mylong,
263  sizeof(int32_t)))
264  return (FALSE);
265  *lp = (long)ntohl((u_int32_t)mylong);
266  }
267  return (TRUE);
268 }
#define TRUE
Definition: types.h:120
#define int32_t
Definition: nsiface.idl:56
char * in_boundry
Definition: xdr_rec.c:144
static bool_t xdrrec_getbytes(XDR *, char *, u_int)
Definition: xdr_rec.c:295
#define PtrToLong(p)
Definition: basetsd.h:84
u_int fbtbc
Definition: xdr_rec.c:145
unsigned int u_int32_t
Definition: rosdhcp.h:35
INT32 int32_t
Definition: types.h:71
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125
#define long
Definition: qsort.c:33
#define ntohl(x)
Definition: module.h:203

◆ xdrrec_getoutbase()

int32_t* xdrrec_getoutbase ( XDR xdrs)

Definition at line 415 of file xdr_rec.c.

417 {
418  RECSTREAM *rstrm = (RECSTREAM *)xdrs->x_private;
419  int32_t *buf = NULL;
420 
421  switch (xdrs->x_op) {
422 
423  case XDR_ENCODE:
424  buf = rstrm->out_base;
425  break;
426 
427  case XDR_DECODE:
428  break;
429 
430  case XDR_FREE:
431  break;
432  }
433  return (buf);
434 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
char * out_base
Definition: xdr_rec.c:132
smooth NULL
Definition: ftsmooth.c:416
switch(r->id)
Definition: btrfs.c:2743
enum xdr_op x_op
Definition: xdr.h:104
Definition: xdr.h:85
INT32 int32_t
Definition: types.h:71
void * x_private
Definition: xdr.h:125
Definition: xdr.h:87
Definition: xdr.h:86

Referenced by authsspi_marshal().

◆ xdrrec_getpos()

static u_int xdrrec_getpos ( XDR xdrs)
static

Definition at line 349 of file xdr_rec.c.

351 {
352  RECSTREAM *rstrm = (RECSTREAM *)xdrs->x_private;
353  off_t pos = 0;
354 
355  //pos = lseek((int)(u_long)rstrm->tcp_handle, (off_t)0, 1);
356  //pos = _lseek((int)PtrToUlong(rstrm->tcp_handle), (off_t)0, 1);
357  if (pos != -1)
358  switch (xdrs->x_op) {
359 
360  case XDR_ENCODE:
361  pos += PtrToLong(rstrm->out_finger) - PtrToLong(rstrm->out_base);
362  break;
363 
364  case XDR_DECODE:
365  pos -= PtrToLong(rstrm->in_boundry) - PtrToLong(rstrm->in_finger);
366  break;
367 
368  default:
369  pos = (off_t) -1;
370  break;
371  }
372  return ((u_int) pos);
373 }
char * in_boundry
Definition: xdr_rec.c:144
__kernel_off_t off_t
Definition: linux.h:201
#define PtrToLong(p)
Definition: basetsd.h:84
char * out_base
Definition: xdr_rec.c:132
char * out_finger
Definition: xdr_rec.c:133
#define off_t
Definition: dosfsck.h:5
if(!(yy_init))
Definition: macro.lex.yy.c:714
enum xdr_op x_op
Definition: xdr.h:104
Definition: xdr.h:85
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125
UINT32 u_int
Definition: types.h:82
Definition: xdr.h:86

Referenced by xdrrec_setpos().

◆ xdrrec_inline()

static int32_t * xdrrec_inline ( XDR xdrs,
u_int  len 
)
static

Definition at line 437 of file xdr_rec.c.

440 {
441  RECSTREAM *rstrm = (RECSTREAM *)xdrs->x_private;
442  int32_t *buf = NULL;
443 
444  switch (xdrs->x_op) {
445 
446  case XDR_ENCODE:
447  if ((rstrm->out_finger + len) <= rstrm->out_boundry) {
448  buf = (int32_t *)(void *)rstrm->out_finger;
449  rstrm->out_finger += len;
450  }
451  break;
452 
453  case XDR_DECODE:
454  if ((len <= rstrm->fbtbc) &&
455  ((rstrm->in_finger + len) <= rstrm->in_boundry)) {
456  buf = (int32_t *)(void *)rstrm->in_finger;
457  rstrm->fbtbc -= len;
458  rstrm->in_finger += len;
459  }
460  break;
461 
462  case XDR_FREE:
463  break;
464  }
465  return (buf);
466 }
char * in_boundry
Definition: xdr_rec.c:144
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
char * out_finger
Definition: xdr_rec.c:133
smooth NULL
Definition: ftsmooth.c:416
switch(r->id)
Definition: btrfs.c:2743
char * out_boundry
Definition: xdr_rec.c:134
enum xdr_op x_op
Definition: xdr.h:104
u_int fbtbc
Definition: xdr_rec.c:145
Definition: xdr.h:85
GLenum GLsizei len
Definition: glext.h:6722
INT32 int32_t
Definition: types.h:71
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125
Definition: xdr.h:87
Definition: xdr.h:86

◆ xdrrec_putbytes()

static bool_t xdrrec_putbytes ( XDR xdrs,
const char addr,
u_int  len 
)
static

Definition at line 323 of file xdr_rec.c.

327 {
328  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
329  size_t current;
330 
331  while (len > 0) {
332  current = (size_t)(PtrToUlong(rstrm->out_boundry) -
333  PtrToUlong(rstrm->out_finger));
334  current = (len < current) ? len : current;
335  memmove(rstrm->out_finger, addr, current);
336  rstrm->out_finger += current;
337  addr += current;
338  len -= current;
339  if (rstrm->out_finger == rstrm->out_boundry) {
340  rstrm->frag_sent = TRUE;
341  if (! flush_out(rstrm, FALSE))
342  return (FALSE);
343  }
344  }
345  return (TRUE);
346 }
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define TRUE
Definition: types.h:120
char * out_finger
Definition: xdr_rec.c:133
bool_t frag_sent
Definition: xdr_rec.c:136
#define PtrToUlong(u)
Definition: config.h:107
__kernel_size_t size_t
Definition: linux.h:237
char * out_boundry
Definition: xdr_rec.c:134
GLenum const GLvoid * addr
Definition: glext.h:9621
GLenum GLsizei len
Definition: glext.h:6722
void * x_private
Definition: xdr.h:125
static bool_t flush_out(RECSTREAM *, bool_t)
Definition: xdr_rec.c:689
struct task_struct * current
Definition: linux.c:32

◆ xdrrec_putlong()

static bool_t xdrrec_putlong ( XDR xdrs,
const long lp 
)
static

Definition at line 271 of file xdr_rec.c.

274 {
275  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
276  int32_t *dest_lp = ((int32_t *)(void *)(rstrm->out_finger));
277 
278  if ((rstrm->out_finger += sizeof(int32_t)) > rstrm->out_boundry) {
279  /*
280  * this case should almost never happen so the code is
281  * inefficient
282  */
283  rstrm->out_finger -= sizeof(int32_t);
284  rstrm->frag_sent = TRUE;
285  if (! flush_out(rstrm, FALSE))
286  return (FALSE);
287  dest_lp = ((int32_t *)(void *)(rstrm->out_finger));
288  rstrm->out_finger += sizeof(int32_t);
289  }
290  *dest_lp = (int32_t)htonl((u_int32_t)(*lp));
291  return (TRUE);
292 }
#define TRUE
Definition: types.h:120
#define int32_t
Definition: nsiface.idl:56
#define htonl(x)
Definition: module.h:212
char * out_finger
Definition: xdr_rec.c:133
bool_t frag_sent
Definition: xdr_rec.c:136
char * out_boundry
Definition: xdr_rec.c:134
unsigned int u_int32_t
Definition: rosdhcp.h:35
INT32 int32_t
Definition: types.h:71
void * x_private
Definition: xdr.h:125
static bool_t flush_out(RECSTREAM *, bool_t)
Definition: xdr_rec.c:689

◆ xdrrec_setlastfrag()

void xdrrec_setlastfrag ( XDR xdrs)

Definition at line 488 of file xdr_rec.c.

490 {
491  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
492  rstrm->last_frag = 1;
493 }
bool_t last_frag
Definition: xdr_rec.c:146
void * x_private
Definition: xdr.h:125

Referenced by clnt_cb_thread().

◆ xdrrec_setpos()

static bool_t xdrrec_setpos ( XDR xdrs,
u_int  pos 
)
static

Definition at line 376 of file xdr_rec.c.

379 {
380  RECSTREAM *rstrm = (RECSTREAM *)xdrs->x_private;
381  u_int currpos = xdrrec_getpos(xdrs);
382  int delta = currpos - pos;
383  char *newpos;
384 
385  if ((int)currpos != -1)
386  switch (xdrs->x_op) {
387 
388  case XDR_ENCODE:
389  newpos = rstrm->out_finger - delta;
390  if ((newpos > (char *)(void *)(rstrm->frag_header)) &&
391  (newpos < rstrm->out_boundry)) {
392  rstrm->out_finger = newpos;
393  return (TRUE);
394  }
395  break;
396 
397  case XDR_DECODE:
398  newpos = rstrm->in_finger - delta;
399  if ((delta < (int)(rstrm->fbtbc)) &&
400  (newpos <= rstrm->in_boundry) &&
401  (newpos >= rstrm->in_base)) {
402  rstrm->in_finger = newpos;
403  rstrm->fbtbc -= delta;
404  return (TRUE);
405  }
406  break;
407 
408  case XDR_FREE:
409  break;
410  }
411  return (FALSE);
412 }
#define TRUE
Definition: types.h:120
char * in_boundry
Definition: xdr_rec.c:144
char * in_base
Definition: xdr_rec.c:142
static u_int xdrrec_getpos(XDR *)
Definition: xdr_rec.c:349
u_int32_t * frag_header
Definition: xdr_rec.c:135
char * out_finger
Definition: xdr_rec.c:133
char * out_boundry
Definition: xdr_rec.c:134
enum xdr_op x_op
Definition: xdr.h:104
u_int fbtbc
Definition: xdr_rec.c:145
Definition: xdr.h:85
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125
UINT32 u_int
Definition: types.h:82
Definition: xdr.h:87
Definition: xdr.h:86

◆ xdrrec_skiprecord()

bool_t xdrrec_skiprecord ( XDR xdrs)

Definition at line 496 of file xdr_rec.c.

498 {
499  RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
500  enum xprt_stat xstat;
501 
502  if (rstrm->nonblock) {
503  if (__xdrrec_getrec(xdrs, &xstat, FALSE))
504  return TRUE;
505 
506  if (rstrm->in_finger == rstrm->in_boundry &&
507  xstat == XPRT_MOREREQS) {
508  rstrm->fbtbc = 0;
509  return TRUE;
510  }
511  return FALSE;
512  }
513 
514  while (rstrm->fbtbc > 0 || (! rstrm->last_frag)) {
515  if (! skip_input_bytes(rstrm, rstrm->fbtbc))
516  return (FALSE);
517  rstrm->fbtbc = 0;
518  if ((! rstrm->last_frag) && (! set_input_fragment(rstrm)))
519  return (FALSE);
520  }
521  rstrm->last_frag = FALSE;
522  return (TRUE);
523 }
#define TRUE
Definition: types.h:120
xprt_stat
Definition: svc.h:81
char * in_boundry
Definition: xdr_rec.c:144
static bool_t skip_input_bytes(RECSTREAM *, u_int)
Definition: xdr_rec.c:791
static bool_t set_input_fragment(RECSTREAM *)
Definition: xdr_rec.c:765
bool_t __xdrrec_getrec(XDR *xdrs, enum xprt_stat *statp, bool_t expectdata)
Definition: xdr_rec.c:581
bool_t last_frag
Definition: xdr_rec.c:146
bool_t nonblock
Definition: xdr_rec.c:150
u_int fbtbc
Definition: xdr_rec.c:145
char * in_finger
Definition: xdr_rec.c:143
void * x_private
Definition: xdr.h:125

Referenced by clnt_cb_thread(), and svc_vc_recv().

Variable Documentation

◆ xdrrec_ops

const struct xdr_ops xdrrec_ops
static
Initial value:
= {
}
static bool_t xdrrec_getbytes(XDR *, char *, u_int)
Definition: xdr_rec.c:295
static bool_t xdrrec_putbytes(XDR *, const char *, u_int)
Definition: xdr_rec.c:323
static u_int xdrrec_getpos(XDR *)
Definition: xdr_rec.c:349
static int32_t * xdrrec_inline(XDR *, u_int)
Definition: xdr_rec.c:437
static bool_t xdrrec_setpos(XDR *, u_int)
Definition: xdr_rec.c:376
static void xdrrec_destroy(XDR *)
Definition: xdr_rec.c:469
static bool_t xdrrec_putlong(XDR *, const long *)
Definition: xdr_rec.c:271
static bool_t xdrrec_getlong(XDR *, long *)
Definition: xdr_rec.c:247

Definition at line 100 of file xdr_rec.c.

Referenced by xdrrec_create().