nbd-server.c File Reference

#include "lfs.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <sys/param.h>
#include <signal.h>
#include <errno.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <netdb.h>
#include <syslog.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <strings.h>
#include <dirent.h>
#include <getopt.h>
#include <pwd.h>
#include <grp.h>
#include <glib.h>
#include "cliserv.h"

Go to the source code of this file.

Data Structures

struct  SERVER
 Variables associated with a server. More...
struct  FILE_INFO
 Variables associated with a client socket. More...
struct  CLIENT
struct  PARAM
 Configuration file values. More...

Defines

#define MY_NAME   "nbd_server"
#define SYSCONFDIR   "/etc"
 Default position of the config file.
#define CFILE   SYSCONFDIR "/nbd-server/config"
#define msg2(a, b)   g_message(b)
 Logging macros, now nothing goes to syslog unless you say ISSERVER.
#define msg3(a, b, c)   g_message(b,c)
#define msg4(a, b, c, d)   g_message(b,c,d)
#define DEBUG(a)
#define DEBUG2(a, b)
#define DEBUG3(a, b, c)
#define DEBUG4(a, b, c, d)
#define PACKAGE_VERSION   ""
#define OFFT_MAX   ~((off_t)1<<(sizeof(off_t)*8-1))
 The highest value a variable of type off_t can reach.
#define LINELEN   256
 Size of static buffer used to read the authorization file (yuck).
#define BUFSIZE   (1024*1024)
 Size of buffer that can hold requests.
#define DIFFPAGESIZE   4096
 diff file uses those chunks
#define F_READONLY   1
 flag to tell us a file is readonly
#define F_MULTIFILE   2
 flag to tell us a file is exported using -m
#define F_COPYONWRITE   4
 flag to tell us a file is exported using copyonwrite
#define F_AUTOREADONLY   8
 flag to tell us a file is set to autoreadonly
#define F_SPARSE   16
 flag to tell us copyronwrite should use a sparse file
#define F_SDP   32
 flag to tell us the export should be done using the Socket Direct Protocol for RDMA
#define SEND(net, reply)   writeit( net, &reply, sizeof( reply ));
 sending macro.
#define ERROR(client, reply, errcode)   { reply.error = htonl(errcode); SEND(client->net,reply); reply.error = 0; }
 error macro.

Enumerations

enum  VIRT_STYLE { VIRT_NONE = 0, VIRT_IPLIT, VIRT_IPHASH, VIRT_CIDR }
 

Types of virtuatlization.

More...
enum  PARAM_TYPE { PARAM_INT, PARAM_STRING, PARAM_BOOL }
 

Type of configuration file values.

More...
enum  CFILE_ERRORS {
  CFILE_NOTFOUND, CFILE_MISSING_GENERIC, CFILE_KEY_MISSING, CFILE_VALUE_INVALID,
  CFILE_VALUE_UNSUPPORTED, CFILE_PROGERR, CFILE_NO_EXPORTS
}
 

Error codes for config file parsing.

More...

Functions

int authorized_client (CLIENT *opts)
 Check whether a client is allowed to connect.
void readit (int f, void *buf, size_t len)
 Read data from a file descriptor into a buffer.
void writeit (int f, void *buf, size_t len)
 Write data from a buffer into a filedescriptor.
void usage ()
 Print out a message about how to use nbd-server.
void dump_section (SERVER *serve, gchar *section_header)
SERVERcmdline (int argc, char *argv[])
 Parse the command line.
void remove_server (gpointer s)
 Remove a SERVER from memory.
GArray * parse_cfile (gchar *f, GError **e)
 Parse the config file.
void sigchld_handler (int s)
 Signal handler for SIGCHLD.
void killchild (gpointer key, gpointer value, gpointer user_data)
 Kill a child.
void sigterm_handler (int s)
 Handle SIGTERM and dispatch it to our children.
off_t size_autodetect (int fhandle)
 Detect the size of a file.
int get_filepos (GArray *export, off_t a, int *fhandle, off_t *foffset, size_t *maxbytes)
 Get the file handle and offset, given an export offset.
void myseek (int handle, off_t a)
 seek to a position in a file, with error handling.
ssize_t rawexpwrite (off_t a, char *buf, size_t len, CLIENT *client)
 Write an amount of bytes at a given offset to the right file.
int rawexpwrite_fully (off_t a, char *buf, size_t len, CLIENT *client)
 Call rawexpwrite repeatedly until all data has been written.
ssize_t rawexpread (off_t a, char *buf, size_t len, CLIENT *client)
 Read an amount of bytes at a given offset from the right file.
int rawexpread_fully (off_t a, char *buf, size_t len, CLIENT *client)
 Call rawexpread repeatedly until all data has been read.
int expread (off_t a, char *buf, size_t len, CLIENT *client)
 Read an amount of bytes at a given offset from the right file.
int expwrite (off_t a, char *buf, size_t len, CLIENT *client)
 Write an amount of bytes at a given offset to the right file.
void negotiate (CLIENT *client)
 Do the initial negotiation.
int mainloop (CLIENT *client)
 Serve a file to a single client.
void setupexport (CLIENT *client)
 Set up client export array, which is an array of FILE_INFO.
int copyonwrite_prepare (CLIENT *client)
int do_run (gchar *command, gchar *file)
 Run a command.
void serveconnection (CLIENT *client)
 Serve a connection.
void set_peername (int net, CLIENT *client)
 Find the name of the file we have to serve.
void destroy_pid_t (gpointer data)
 Destroy a pid_t*.
int serveloop (GArray *servers)
 Loop through the available servers, and serve them.
void setup_serve (SERVER *serve)
 Connect a server's socket.
void setup_servers (GArray *servers)
 Connect our servers.
void daemonize (SERVER *serve)
 Go daemon (unless we specified at compile time that we didn't want this).
void serve_err (SERVER *serve, const char *msg) G_GNUC_NORETURN
void dousers (void)
 Set up user-ID and/or group-ID.
void glib_message_syslog_redirect (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
int main (int argc, char *argv[])
 Main entry point.

Variables

gchar * config_file_pos
 Where our config file actually is.
gchar * runuser = NULL
 What user we're running as.
gchar * rungroup = NULL
 What group we're running as.
GHashTable * children
char pidfname [256]
 name of our PID file
char pidftemplate [256]
 template to be used for the filename of the PID file
char default_authname [] = SYSCONFDIR "/nbd-server/allow"
 default name of allow file

Define Documentation

#define BUFSIZE   (1024*1024)

Size of buffer that can hold requests.

Definition at line 143 of file nbd-server.c.

Referenced by mainloop().

#define CFILE   SYSCONFDIR "/nbd-server/config"

Definition at line 99 of file nbd-server.c.

Referenced by main(), and usage().

#define DEBUG (  ) 

Definition at line 128 of file nbd-server.c.

Referenced by mainloop(), readit(), serveloop(), setup_serve(), size_autodetect(), and writeit().

#define DEBUG2 ( a,
 ) 

Definition at line 129 of file nbd-server.c.

Referenced by expread(), setupexport(), sigchld_handler(), and size_autodetect().

#define DEBUG3 ( a,
b,
 ) 

Definition at line 130 of file nbd-server.c.

Referenced by expread(), and expwrite().

#define DEBUG4 ( a,
b,
c,
 ) 

Definition at line 131 of file nbd-server.c.

Referenced by rawexpread(), and rawexpwrite().

#define DIFFPAGESIZE   4096

diff file uses those chunks

Definition at line 144 of file nbd-server.c.

Referenced by copyonwrite_prepare(), expread(), and expwrite().

#define ERROR ( client,
reply,
errcode   )     { reply.error = htonl(errcode); SEND(client->net,reply); reply.error = 0; }

error macro.

Definition at line 1081 of file nbd-server.c.

Referenced by mainloop().

#define F_AUTOREADONLY   8

flag to tell us a file is set to autoreadonly

Definition at line 149 of file nbd-server.c.

Referenced by mainloop(), and setupexport().

#define F_COPYONWRITE   4

flag to tell us a file is exported using copyonwrite

Definition at line 147 of file nbd-server.c.

Referenced by cmdline(), dump_section(), expread(), expwrite(), mainloop(), parse_cfile(), serveconnection(), and setupexport().

#define F_MULTIFILE   2

flag to tell us a file is exported using -m

Definition at line 146 of file nbd-server.c.

Referenced by cmdline(), dump_section(), parse_cfile(), and setupexport().

#define F_READONLY   1

flag to tell us a file is readonly

Definition at line 145 of file nbd-server.c.

Referenced by cmdline(), dump_section(), mainloop(), negotiate(), parse_cfile(), and setupexport().

#define F_SDP   32

flag to tell us the export should be done using the Socket Direct Protocol for RDMA

Definition at line 151 of file nbd-server.c.

Referenced by parse_cfile(), and setup_serve().

#define F_SPARSE   16

flag to tell us copyronwrite should use a sparse file

Definition at line 150 of file nbd-server.c.

Referenced by expwrite(), and parse_cfile().

#define LINELEN   256

Size of static buffer used to read the authorization file (yuck).

Definition at line 141 of file nbd-server.c.

Referenced by authorized_client().

#define msg2 ( a,
 )     g_message(b)

Logging macros, now nothing goes to syslog unless you say ISSERVER.

Definition at line 115 of file nbd-server.c.

Referenced by mainloop(), and serveloop().

#define msg3 ( a,
b,
 )     g_message(b,c)

Definition at line 116 of file nbd-server.c.

Referenced by copyonwrite_prepare(), serveloop(), setupexport(), and sigchld_handler().

#define msg4 ( a,
b,
c,
 )     g_message(b,c,d)

Definition at line 117 of file nbd-server.c.

Referenced by authorized_client(), and set_peername().

#define MY_NAME   "nbd_server"

Definition at line 92 of file nbd-server.c.

#define OFFT_MAX   ~((off_t)1<<(sizeof(off_t)*8-1))

The highest value a variable of type off_t can reach.

This is a signed integer, so set all bits except for the leftmost one.

Definition at line 140 of file nbd-server.c.

Referenced by main(), mainloop(), serveloop(), and size_autodetect().

#define PACKAGE_VERSION   ""

Definition at line 134 of file nbd-server.c.

#define SEND ( net,
reply   )     writeit( net, &reply, sizeof( reply ));

sending macro.

Definition at line 1079 of file nbd-server.c.

Referenced by mainloop().

#define SYSCONFDIR   "/etc"

Default position of the config file.

Definition at line 97 of file nbd-server.c.


Enumeration Type Documentation

Error codes for config file parsing.

Enumerator:
CFILE_NOTFOUND 

The configuration file is not found.

CFILE_MISSING_GENERIC 

The (required) group "generic" is missing.

CFILE_KEY_MISSING 

A (required) key is missing.

CFILE_VALUE_INVALID 

A value is syntactically invalid.

CFILE_VALUE_UNSUPPORTED 

A value is not supported in this build.

CFILE_PROGERR 

Programmer error.

CFILE_NO_EXPORTS 

A config file was specified that does not define any exports.

Definition at line 501 of file nbd-server.c.

enum PARAM_TYPE

Type of configuration file values.

Enumerator:
PARAM_INT 

This parameter is an integer.

PARAM_STRING 

This parameter is a string.

PARAM_BOOL 

This parameter is a boolean.

Definition at line 217 of file nbd-server.c.

enum VIRT_STYLE

Types of virtuatlization.

Enumerator:
VIRT_NONE 

No virtualization.

VIRT_IPLIT 

Literal IP address as part of the filename.

VIRT_IPHASH 

Replacing all dots in an ip address by a / before doing the same as in IPLIT.

VIRT_CIDR 

Every subnet in its own directory.

Definition at line 160 of file nbd-server.c.


Function Documentation

int authorized_client ( CLIENT opts  ) 

Check whether a client is allowed to connect.

Works with an authorization file which contains one line per machine, no wildcards.

Parameters:
opts The client who's trying to connect.
Returns:
0 - authorization refused, 1 - OK

Definition at line 247 of file nbd-server.c.

References SERVER::authname, CLIENT::clientname, LINELEN, msg4, and CLIENT::server.

Referenced by serveloop().

SERVER* cmdline ( int  argc,
char *  argv[] 
)

Parse the command line.

Parameters:
argc the argc argument to main()
argv the argv argument to main()

Definition at line 382 of file nbd-server.c.

References SERVER::authname, config_file_pos, default_authname, dump_section(), SERVER::expected_size, SERVER::exportname, F_COPYONWRITE, F_MULTIFILE, F_READONLY, SERVER::flags, SERVER::listenaddr, pidftemplate, SERVER::port, usage(), VIRT_IPLIT, and SERVER::virtstyle.

Referenced by main().

int copyonwrite_prepare ( CLIENT client  ) 
void daemonize ( SERVER serve  ) 

Go daemon (unless we specified at compile time that we didn't want this).

Parameters:
serve the first server of our configuration. If its port is zero, then do not daemonize, because we're doing inetd then. This parameter is only used to create a PID file of the form /var/run/nbd-server.<port>.pid; it's not modified in any way.

Definition at line 1564 of file nbd-server.c.

References err(), pidfname, pidftemplate, and SERVER::port.

Referenced by main().

void destroy_pid_t ( gpointer  data  ) 

Destroy a pid_t*.

Parameters:
data a pointer to pid_t which should be freed

Definition at line 1377 of file nbd-server.c.

Referenced by setup_servers().

int do_run ( gchar *  command,
gchar *  file 
)

Run a command.

This is used for the ``prerun'' and ``postrun'' config file options

Parameters:
command the command to be ran. Read from the config file
file the file name we're about to export

Definition at line 1285 of file nbd-server.c.

Referenced by serveconnection().

void dousers ( void   ) 

Set up user-ID and/or group-ID.

Definition at line 1610 of file nbd-server.c.

References rungroup, and runuser.

Referenced by main().

void dump_section ( SERVER serve,
gchar *  section_header 
)
int expread ( off_t  a,
char *  buf,
size_t  len,
CLIENT client 
)

Read an amount of bytes at a given offset from the right file.

This abstracts the read-side of the copyonwrite stuff, and calls rawexpread() with the right parameters to do the actual work.

Parameters:
a The offset where the read should start
buf A buffer to read into
len The size of buf
client The client we're going to read for
Returns:
0 on success, nonzero on failure

Definition at line 965 of file nbd-server.c.

References DEBUG2, DEBUG3, CLIENT::difffile, DIFFPAGESIZE, CLIENT::difmap, F_COPYONWRITE, SERVER::flags, myseek(), rawexpread_fully(), and CLIENT::server.

Referenced by mainloop().

int expwrite ( off_t  a,
char *  buf,
size_t  len,
CLIENT client 
)

Write an amount of bytes at a given offset to the right file.

This abstracts the write-side of the copyonwrite option, and calls rawexpwrite() with the right parameters to do the actual work.

Parameters:
a The offset where the write should start
buf The buffer to write from
len The length of buf
client The client we're going to write for.
Returns:
0 on success, nonzero on failure

Definition at line 1006 of file nbd-server.c.

References DEBUG3, CLIENT::difffile, CLIENT::difffilelen, DIFFPAGESIZE, CLIENT::difmap, F_COPYONWRITE, F_SPARSE, SERVER::flags, myseek(), rawexpread_fully(), rawexpwrite_fully(), and CLIENT::server.

Referenced by mainloop().

int get_filepos ( GArray *  export,
off_t  a,
int *  fhandle,
off_t *  foffset,
size_t *  maxbytes 
)

Get the file handle and offset, given an export offset.

Parameters:
export An array of export files
a The offset to get corresponding file/offset for
fhandle [out] File descriptor
foffset [out] Offset into fhandle
maxbytes [out] Tells how many bytes can be read/written from fhandle starting at foffset (0 if there is no limit)
Returns:
0 on success, -1 on failure

Definition at line 821 of file nbd-server.c.

References FILE_INFO::fhandle, and FILE_INFO::startoff.

Referenced by rawexpread(), and rawexpwrite().

void glib_message_syslog_redirect ( const gchar *  log_domain,
GLogLevelFlags  log_level,
const gchar *  message,
gpointer  user_data 
)

Definition at line 1638 of file nbd-server.c.

Referenced by main().

void killchild ( gpointer  key,
gpointer  value,
gpointer  user_data 
)

Kill a child.

Called from sigterm_handler::g_hash_table_foreach.

Parameters:
key the key
value the value corresponding to the above key
user_data a pointer which we always set to 1, so that we know what will happen next.

Definition at line 739 of file nbd-server.c.

Referenced by sigterm_handler().

int main ( int  argc,
char *  argv[] 
)
int mainloop ( CLIENT client  ) 

Serve a file to a single client.

Todo:
This beast needs to be split up in many tiny little manageable pieces. Preferably with a chainsaw.
Parameters:
client The client we're going to serve to.
Returns:
when the client disconnects

Definition at line 1091 of file nbd-server.c.

References BUFSIZE, DEBUG, CLIENT::difffile, CLIENT::difffilename, CLIENT::difmap, err(), ERROR, CLIENT::exportsize, expread(), expwrite(), F_AUTOREADONLY, F_COPYONWRITE, F_READONLY, SERVER::flags, msg2, negotiate(), CLIENT::net, ntohll(), OFFT_MAX, readit(), SEND, CLIENT::server, and writeit().

Referenced by serveconnection().

void myseek ( int  handle,
off_t  a 
)

seek to a position in a file, with error handling.

Parameters:
handle a filedescriptor
a position to seek to
Todo:
get rid of this; lastpoint is a global variable right now, but it shouldn't be. If we pass it on as a parameter, that makes things a *lot* easier.

Definition at line 866 of file nbd-server.c.

References err().

Referenced by expread(), expwrite(), rawexpread(), and rawexpwrite().

void negotiate ( CLIENT client  ) 

Do the initial negotiation.

Parameters:
client The client we're negotiating with.

Definition at line 1055 of file nbd-server.c.

References cliserv_magic, err(), CLIENT::exportsize, F_READONLY, SERVER::flags, htonll, INIT_PASSWD, NBD_FLAG_HAS_FLAGS, NBD_FLAG_READ_ONLY, CLIENT::net, and CLIENT::server.

GArray* parse_cfile ( gchar *  f,
GError **  e 
)

Parse the config file.

Parameters:
f the name of the config file
e a GError.
See also:
CFILE_ERRORS for what error values this function can return.
Returns:
a Array of SERVER* pointers, If the config file is empty or does not exist, returns an empty GHashTable; if the config file contains an error, returns NULL, and e is set appropriately

Definition at line 535 of file nbd-server.c.

References SERVER::authname, CFILE_MISSING_GENERIC, CFILE_NO_EXPORTS, CFILE_NOTFOUND, CFILE_VALUE_INVALID, CFILE_VALUE_UNSUPPORTED, SERVER::cidrlen, err(), SERVER::expected_size, SERVER::exportname, F_COPYONWRITE, F_MULTIFILE, F_READONLY, F_SDP, F_SPARSE, SERVER::flags, PARAM::flagval, SERVER::listenaddr, PARAM_BOOL, PARAM_INT, PARAM_STRING, SERVER::port, SERVER::postrun, SERVER::prerun, rungroup, runuser, PARAM::target, VIRT_CIDR, VIRT_IPHASH, VIRT_IPLIT, VIRT_NONE, and SERVER::virtstyle.

Referenced by main().

ssize_t rawexpread ( off_t  a,
char *  buf,
size_t  len,
CLIENT client 
)

Read an amount of bytes at a given offset from the right file.

This abstracts the read-side of the multiple files option.

Parameters:
a The offset where the read should start
buf A buffer to read into
len The size of buf
client The client we're serving for
Returns:
The number of bytes actually read, or -1 in case of an error.

Definition at line 924 of file nbd-server.c.

References DEBUG4, CLIENT::export, get_filepos(), and myseek().

Referenced by rawexpread_fully().

int rawexpread_fully ( off_t  a,
char *  buf,
size_t  len,
CLIENT client 
)

Call rawexpread repeatedly until all data has been read.

Returns:
0 on success, nonzero on failure

Definition at line 944 of file nbd-server.c.

References rawexpread().

Referenced by expread(), and expwrite().

ssize_t rawexpwrite ( off_t  a,
char *  buf,
size_t  len,
CLIENT client 
)

Write an amount of bytes at a given offset to the right file.

This abstracts the write-side of the multiple file option.

Parameters:
a The offset where the write should start
buf The buffer to write from
len The length of buf
client The client we're serving for
Returns:
The number of bytes actually written, or -1 in case of an error

Definition at line 882 of file nbd-server.c.

References DEBUG4, CLIENT::export, get_filepos(), and myseek().

Referenced by rawexpwrite_fully().

int rawexpwrite_fully ( off_t  a,
char *  buf,
size_t  len,
CLIENT client 
)

Call rawexpwrite repeatedly until all data has been written.

Returns:
0 on success, nonzero on failure

Definition at line 902 of file nbd-server.c.

References rawexpwrite().

Referenced by expwrite().

void readit ( int  f,
void *  buf,
size_t  len 
) [inline]

Read data from a file descriptor into a buffer.

Parameters:
f a file descriptor
buf a buffer
len the number of bytes to be read

Definition at line 301 of file nbd-server.c.

References DEBUG, and err().

Referenced by mainloop().

void remove_server ( gpointer  s  ) 

Remove a SERVER from memory.

Used from the hash table

Definition at line 515 of file nbd-server.c.

References SERVER::authname, and SERVER::exportname.

void serve_err ( SERVER serve,
const char *  msg 
)

Definition at line 1601 of file nbd-server.c.

References err(), SERVER::exportname, and SERVER::port.

void serveconnection ( CLIENT client  ) 

Serve a connection.

Todo:
allow for multithreading, perhaps use libevent. Not just yet, though; follow the road map.
Parameters:
client a connected client

Definition at line 1305 of file nbd-server.c.

References copyonwrite_prepare(), do_run(), CLIENT::exportname, F_COPYONWRITE, SERVER::flags, mainloop(), CLIENT::net, SERVER::postrun, SERVER::prerun, CLIENT::server, setmysockopt(), and setupexport().

Referenced by main(), and serveloop().

int serveloop ( GArray *  servers  ) 

Loop through the available servers, and serve them.

Never returns.

Definition at line 1384 of file nbd-server.c.

References authorized_client(), children, DEBUG, err(), CLIENT::exportsize, msg2, msg3, CLIENT::net, OFFT_MAX, serveconnection(), CLIENT::server, set_peername(), and SERVER::socket.

Referenced by main().

void set_peername ( int  net,
CLIENT client 
)

Find the name of the file we have to serve.

This will use g_strdup_printf to put the IP address of the client inside a filename containing "%s" (in the form as specified by the "virtstyle" option). That name is then written to client->exportname.

Parameters:
net A socket connected to an nbd client
client information about the client. The IP address in human-readable format will be written to a new char* buffer, the address of which will be stored in client->clientname.

Definition at line 1332 of file nbd-server.c.

References SERVER::cidrlen, CLIENT::clientname, err(), SERVER::exportname, CLIENT::exportname, msg4, CLIENT::server, VIRT_CIDR, VIRT_IPHASH, VIRT_IPLIT, VIRT_NONE, and SERVER::virtstyle.

Referenced by main(), and serveloop().

void setup_serve ( SERVER serve  ) 

Connect a server's socket.

Parameters:
serve the server we want to connect.

Definition at line 1480 of file nbd-server.c.

References DEBUG, err(), F_SDP, SERVER::flags, SERVER::listenaddr, SERVER::port, sigchld_handler(), sigterm_handler(), and SERVER::socket.

Referenced by setup_servers().

void setup_servers ( GArray *  servers  ) 

Connect our servers.

Definition at line 1547 of file nbd-server.c.

References children, destroy_pid_t(), and setup_serve().

Referenced by main().

void setupexport ( CLIENT client  ) 

Set up client export array, which is an array of FILE_INFO.

Also, split a single exportfile into multiple ones, if that was asked.

Parameters:
client information on the client which we want to setup export for

Definition at line 1190 of file nbd-server.c.

References DEBUG2, err(), SERVER::expected_size, CLIENT::export, CLIENT::exportname, CLIENT::exportsize, F_AUTOREADONLY, F_COPYONWRITE, F_MULTIFILE, F_READONLY, FILE_INFO::fhandle, SERVER::flags, msg3, CLIENT::server, size_autodetect(), and FILE_INFO::startoff.

Referenced by serveconnection().

void sigchld_handler ( int  s  ) 

Signal handler for SIGCHLD.

Parameters:
s the signal we're handling (must be SIGCHLD, or something is severely wrong)

Definition at line 712 of file nbd-server.c.

References children, DEBUG2, and msg3.

Referenced by setup_serve().

void sigterm_handler ( int  s  ) 

Handle SIGTERM and dispatch it to our children.

Parameters:
s the signal we're handling (must be SIGTERM, or something is severely wrong).

Definition at line 752 of file nbd-server.c.

References children, killchild(), and pidfname.

Referenced by setup_serve().

off_t size_autodetect ( int  fhandle  ) 

Detect the size of a file.

Parameters:
fhandle An open filedescriptor
Returns:
the size of the file, or OFFT_MAX if detection was impossible.

Definition at line 771 of file nbd-server.c.

References DEBUG, DEBUG2, err(), and OFFT_MAX.

Referenced by setupexport().

void usage (  ) 

Print out a message about how to use nbd-server.

Split out to a separate function so that we can call it from multiple places

Definition at line 334 of file nbd-server.c.

References CFILE, and VERSION.

Referenced by cmdline().

void writeit ( int  f,
void *  buf,
size_t  len 
) [inline]

Write data from a buffer into a filedescriptor.

Parameters:
f a file descriptor
buf a buffer containing data
len the number of bytes to be written

Definition at line 319 of file nbd-server.c.

References DEBUG, and err().

Referenced by mainloop().


Variable Documentation

GHashTable* children

Definition at line 152 of file nbd-server.c.

Referenced by serveloop(), setup_servers(), sigchld_handler(), and sigterm_handler().

Where our config file actually is.

Definition at line 102 of file nbd-server.c.

Referenced by cmdline(), and main().

char default_authname[] = SYSCONFDIR "/nbd-server/allow"

default name of allow file

Definition at line 155 of file nbd-server.c.

Referenced by cmdline().

char pidfname[256]

name of our PID file

Definition at line 153 of file nbd-server.c.

Referenced by daemonize(), and sigterm_handler().

char pidftemplate[256]

template to be used for the filename of the PID file

Definition at line 154 of file nbd-server.c.

Referenced by cmdline(), daemonize(), and main().

gchar* rungroup = NULL

What group we're running as.

Definition at line 107 of file nbd-server.c.

Referenced by dousers(), and parse_cfile().

gchar* runuser = NULL

What user we're running as.

Definition at line 105 of file nbd-server.c.

Referenced by dousers(), and parse_cfile().

Generated on Mon Jul 5 13:04:48 2010 for Network Block Device by  doxygen 1.6.3