The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Data Structures | Functions
pipe.c File Reference

BIO abstractions for in-memory pipes. More...

#include <freeradius-devel/bio/bio_priv.h>
#include <freeradius-devel/bio/null.h>
#include <freeradius-devel/bio/mem.h>
#include <freeradius-devel/bio/pipe.h>
#include <pthread.h>
+ Include dependency graph for pipe.c:

Go to the source code of this file.

Data Structures

struct  fr_bio_pipe_t
 The pipe bio. More...
 

Functions

fr_bio_tfr_bio_pipe_alloc (TALLOC_CTX *ctx, fr_bio_pipe_cb_funcs_t *cb, size_t buffer_size)
 Allocate a thread-safe pipe which can be used for both reads and writes. More...
 
static int fr_bio_pipe_destructor (fr_bio_pipe_t *my)
 
static int fr_bio_pipe_eof (fr_bio_t *bio)
 Set EOF. More...
 
static ssize_t fr_bio_pipe_read (fr_bio_t *bio, void *packet_ctx, void *buffer, size_t size)
 Read from the pipe. More...
 
static void fr_bio_pipe_shutdown (fr_bio_t *bio)
 Shutdown callback. More...
 
static ssize_t fr_bio_pipe_write (fr_bio_t *bio, void *packet_ctx, void const *buffer, size_t size)
 Write to the pipe. More...
 

Detailed Description

BIO abstractions for in-memory pipes.

Id
a4cf06eec50227ddf42a428f14c9332cb4ed6b37

Definition in file pipe.c.


Data Structure Documentation

◆ fr_bio_pipe_t

struct fr_bio_pipe_t

The pipe bio.

Definition at line 35 of file pipe.c.

+ Collaboration diagram for fr_bio_pipe_t:
Data Fields
bool eof are we at EOF?
FR_BIO_COMMON
pthread_mutex_t mutex
fr_bio_t * next
fr_bio_pipe_cb_funcs_t signal inform us that the pipe is readable

Function Documentation

◆ fr_bio_pipe_alloc()

fr_bio_t* fr_bio_pipe_alloc ( TALLOC_CTX *  ctx,
fr_bio_pipe_cb_funcs_t cb,
size_t  buffer_size 
)

Allocate a thread-safe pipe which can be used for both reads and writes.

Due to talloc issues with multiple threads, if the caller wants a bi-directional pipe, this function will need to be called twice. That way a free in each context won't result in a race condition on two mutex locks.

For now, iqt's too difficult to emulate the pipe[2] behavior, where two identical "connected" things are returned, and either can be used for reading or for writing.

i.e. a pipe is really a mutex-protected memory buffer. One side should call write (and never read). The other side should call read (and never write).

The pipe should be freed only after both ends have set EOF.

Definition at line 172 of file pipe.c.

+ Here is the call graph for this function:

◆ fr_bio_pipe_destructor()

static int fr_bio_pipe_destructor ( fr_bio_pipe_t my)
static

Definition at line 48 of file pipe.c.

+ Here is the caller graph for this function:

◆ fr_bio_pipe_eof()

static int fr_bio_pipe_eof ( fr_bio_t bio)
static

Set EOF.

Either side can set EOF, in which case pending reads are still processed. Writes return EOF immediately. Readers return pending data, and then EOF.

Definition at line 143 of file pipe.c.

+ Here is the caller graph for this function:

◆ fr_bio_pipe_read()

static ssize_t fr_bio_pipe_read ( fr_bio_t bio,
void *  packet_ctx,
void *  buffer,
size_t  size 
)
static

Read from the pipe.

Once EOF is set, any pending data is read, and then EOF is returned.

Definition at line 59 of file pipe.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_bio_pipe_shutdown()

static void fr_bio_pipe_shutdown ( fr_bio_t bio)
static

Shutdown callback.

Definition at line 127 of file pipe.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_bio_pipe_write()

static ssize_t fr_bio_pipe_write ( fr_bio_t bio,
void *  packet_ctx,
void const *  buffer,
size_t  size 
)
static

Write to the pipe.

Once EOF is set, no further writes are possible.

Definition at line 96 of file pipe.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function: