#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/ioctl.h>
#include <sys/param.h>
#include <sys/mount.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 | 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)+sizeof(struct nbd_reply)) |
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 | F_SYNC 64 |
Whether to fsync() after a write. | |
#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, CFILE_INCORRECT_PORT } |
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) |
SERVER * | cmdline (int argc, char *argv[]) |
Parse the command line. | |
void | remove_server (gpointer s) |
Remove a SERVER from memory. | |
SERVER * | dup_serve (SERVER *s) |
duplicate server | |
int | append_serve (SERVER *s, GArray *a) |
append new server to array | |
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. | |
CLIENT * | negotiate (int net, CLIENT *client, GArray *servers) |
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 | dosockopts (int socket) |
int | setup_serve (SERVER *serve) |
Connect a server's socket. | |
void | open_modern (void) |
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. | |
gboolean | do_oldstyle = FALSE |
whether to export using the old negotiation protocol (port-based) | |
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 | |
int | modernsock = 0 |
Socket for the modern handler. | |
char * | modern_listen |
listenaddr value for modernsock |
#define BUFSIZE ((1024*1024)+sizeof(struct nbd_reply)) |
Size of buffer that can hold requests.
Definition at line 153 of file nbd-server.c.
Referenced by mainloop().
#define CFILE SYSCONFDIR "/nbd-server/config" |
#define DEBUG | ( | a | ) |
Definition at line 138 of file nbd-server.c.
Referenced by mainloop(), readit(), serveloop(), setup_serve(), size_autodetect(), and writeit().
#define DEBUG2 | ( | a, | |||
b | ) |
Definition at line 139 of file nbd-server.c.
Referenced by expread(), setupexport(), sigchld_handler(), and size_autodetect().
#define DEBUG3 | ( | a, | |||
b, | |||||
c | ) |
#define DEBUG4 | ( | a, | |||
b, | |||||
c, | |||||
d | ) |
#define DIFFPAGESIZE 4096 |
diff file uses those chunks
Definition at line 154 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; } |
#define F_AUTOREADONLY 8 |
flag to tell us a file is set to autoreadonly
Definition at line 159 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 157 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 156 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 155 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 161 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 160 of file nbd-server.c.
Referenced by expwrite(), and parse_cfile().
#define F_SYNC 64 |
Whether to fsync() after a write.
Definition at line 162 of file nbd-server.c.
Referenced by parse_cfile(), and rawexpwrite().
#define LINELEN 256 |
Size of static buffer used to read the authorization file (yuck).
Definition at line 151 of file nbd-server.c.
Referenced by authorized_client().
#define msg2 | ( | a, | |||
b | ) | g_message(b) |
Logging macros, now nothing goes to syslog unless you say ISSERVER.
Definition at line 125 of file nbd-server.c.
Referenced by mainloop(), and serveloop().
#define msg3 | ( | a, | |||
b, | |||||
c | ) | g_message(b,c) |
Definition at line 126 of file nbd-server.c.
Referenced by copyonwrite_prepare(), serveloop(), setupexport(), and sigchld_handler().
#define msg4 | ( | a, | |||
b, | |||||
c, | |||||
d | ) | g_message(b,c,d) |
#define MY_NAME "nbd_server" |
Definition at line 96 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 150 of file nbd-server.c.
Referenced by main(), mainloop(), negotiate(), serveloop(), and size_autodetect().
#define SEND | ( | net, | |||
reply | ) | writeit( net, &reply, sizeof( reply )); |
#define SYSCONFDIR "/etc" |
enum CFILE_ERRORS |
Error codes for config file parsing.
Definition at line 544 of file nbd-server.c.
enum PARAM_TYPE |
Type of configuration file values.
PARAM_INT | This parameter is an integer. |
PARAM_STRING | This parameter is a string. |
PARAM_BOOL | This parameter is a boolean. |
Definition at line 239 of file nbd-server.c.
enum VIRT_STYLE |
Types of virtuatlization.
Definition at line 178 of file nbd-server.c.
int append_serve | ( | SERVER * | s, | |
GArray * | a | |||
) |
append new server to array
s | server | |
a | server array |
Definition at line 626 of file nbd-server.c.
References dup_serve(), err(), SERVER::listenaddr, SERVER::port, and SERVER::socket_family.
Referenced by main(), and parse_cfile().
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.
opts | The client who's trying to connect. |
Definition at line 269 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.
Definition at line 408 of file nbd-server.c.
References SERVER::authname, config_file_pos, default_authname, do_oldstyle, dump_section(), SERVER::expected_size, SERVER::exportname, F_COPYONWRITE, F_MULTIFILE, F_READONLY, SERVER::flags, SERVER::listenaddr, SERVER::max_connections, pidftemplate, SERVER::port, usage(), VIRT_IPLIT, and SERVER::virtstyle.
Referenced by main().
int copyonwrite_prepare | ( | CLIENT * | client | ) |
Definition at line 1547 of file nbd-server.c.
References CLIENT::clientname, CLIENT::difffile, CLIENT::difffilename, DIFFPAGESIZE, CLIENT::difmap, err(), CLIENT::exportname, CLIENT::exportsize, and msg3.
Referenced by serveconnection().
void daemonize | ( | SERVER * | serve | ) |
Go daemon (unless we specified at compile time that we didn't want this).
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 1989 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*.
data | a pointer to pid_t which should be freed |
Definition at line 1706 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
command | the command to be ran. Read from the config file | |
file | the file name we're about to export |
Definition at line 1571 of file nbd-server.c.
Referenced by serveconnection().
void dosockopts | ( | int | socket | ) |
Definition at line 1830 of file nbd-server.c.
References err().
Referenced by open_modern(), and setup_serve().
void dousers | ( | void | ) |
void dump_section | ( | SERVER * | serve, | |
gchar * | section_header | |||
) |
Definition at line 379 of file nbd-server.c.
References SERVER::authname, SERVER::expected_size, SERVER::exportname, F_COPYONWRITE, F_MULTIFILE, F_READONLY, SERVER::flags, SERVER::listenaddr, and SERVER::port.
Referenced by cmdline().
duplicate server
s | the old server we want to duplicate |
Definition at line 581 of file nbd-server.c.
References SERVER::authname, SERVER::cidrlen, SERVER::expected_size, SERVER::exportname, SERVER::flags, SERVER::listenaddr, SERVER::max_connections, SERVER::port, SERVER::postrun, SERVER::prerun, SERVER::servename, SERVER::socket, and SERVER::socket_family.
Referenced by append_serve().
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.
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 |
Definition at line 1150 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.
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. |
Definition at line 1191 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.
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) |
Definition at line 1001 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 | |||
) |
void killchild | ( | gpointer | key, | |
gpointer | value, | |||
gpointer | user_data | |||
) |
Kill a child.
Called from sigterm_handler::g_hash_table_foreach.
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 919 of file nbd-server.c.
Referenced by sigterm_handler().
int main | ( | int | argc, | |
char * | argv[] | |||
) |
Main entry point.
..
Definition at line 2095 of file nbd-server.c.
References append_serve(), CFILE, CFILE_NOTFOUND, cmdline(), config_file_pos, daemonize(), dousers(), err(), CLIENT::exportsize, glib_message_syslog_redirect(), logging(), CLIENT::net, OFFT_MAX, parse_cfile(), pidftemplate, SERVER::port, serveconnection(), serveloop(), CLIENT::server, set_peername(), setup_servers(), and SERVER::socket_family.
int mainloop | ( | CLIENT * | client | ) |
Serve a file to a single client.
client | The client we're going to serve to. |
Definition at line 1354 of file nbd-server.c.
References BUFSIZE, DEBUG, CLIENT::difffile, CLIENT::difffilename, CLIENT::difmap, err(), ERROR, nbd_reply::error, CLIENT::exportsize, expread(), expwrite(), F_AUTOREADONLY, F_COPYONWRITE, F_READONLY, SERVER::flags, nbd_request::from, nbd_request::handle, nbd_reply::handle, nbd_request::len, nbd_request::magic, nbd_reply::magic, msg2, NBD_CMD_DISC, NBD_CMD_WRITE, NBD_REPLY_MAGIC, NBD_REQUEST_MAGIC, negotiate(), CLIENT::net, ntohll(), OFFT_MAX, readit(), SEND, CLIENT::server, nbd_request::type, and writeit().
Referenced by serveconnection().
void myseek | ( | int | handle, | |
off_t | a | |||
) |
seek to a position in a file, with error handling.
handle | a filedescriptor | |
a | position to seek to |
Definition at line 1046 of file nbd-server.c.
References err().
Referenced by expread(), expwrite(), rawexpread(), and rawexpwrite().
Do the initial negotiation.
client | The client we're negotiating with. |
Definition at line 1240 of file nbd-server.c.
References cliserv_magic, err(), err_nonfatal(), CLIENT::exportsize, F_READONLY, SERVER::flags, htonll, INIT_PASSWD, CLIENT::modern, NBD_FLAG_HAS_FLAGS, NBD_FLAG_READ_ONLY, NBD_OPT_EXPORT_NAME, CLIENT::net, ntohll(), OFFT_MAX, opts_magic, SERVER::servename, and CLIENT::server.
void open_modern | ( | void | ) |
Definition at line 1921 of file nbd-server.c.
References dosockopts(), err(), modern_listen, modernsock, and NBD_DEFAULT_PORT.
Referenced by setup_servers().
GArray* parse_cfile | ( | gchar * | f, | |
GError ** | e | |||
) |
Parse the config file.
f | the name of the config file | |
e | a GError. |
Definition at line 696 of file nbd-server.c.
References append_serve(), SERVER::authname, CFILE_INCORRECT_PORT, CFILE_MISSING_GENERIC, CFILE_NO_EXPORTS, CFILE_NOTFOUND, CFILE_VALUE_INVALID, CFILE_VALUE_UNSUPPORTED, SERVER::cidrlen, do_oldstyle, err(), SERVER::expected_size, SERVER::exportname, F_COPYONWRITE, F_MULTIFILE, F_READONLY, F_SDP, F_SPARSE, F_SYNC, SERVER::flags, PARAM::flagval, SERVER::listenaddr, SERVER::max_connections, modern_listen, NBD_DEFAULT_PORT, PARAM_BOOL, PARAM_INT, PARAM_STRING, SERVER::port, SERVER::postrun, SERVER::prerun, PARAM::required, rungroup, runuser, SERVER::servename, SERVER::socket_family, 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.
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 |
Definition at line 1109 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.
Definition at line 1129 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.
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 |
Definition at line 1062 of file nbd-server.c.
References DEBUG4, CLIENT::export, F_SYNC, SERVER::flags, get_filepos(), myseek(), and CLIENT::server.
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.
Definition at line 1087 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.
f | a file descriptor | |
buf | a buffer | |
len | the number of bytes to be read |
Definition at line 323 of file nbd-server.c.
Referenced by mainloop().
void remove_server | ( | gpointer | s | ) |
Remove a SERVER from memory.
Used from the hash table
Definition at line 560 of file nbd-server.c.
References SERVER::authname, SERVER::exportname, SERVER::listenaddr, SERVER::postrun, and SERVER::prerun.
void serve_err | ( | SERVER * | serve, | |
const char * | msg | |||
) |
Definition at line 2026 of file nbd-server.c.
References err(), SERVER::exportname, and SERVER::port.
void serveconnection | ( | CLIENT * | client | ) |
Serve a connection.
client | a connected client |
Definition at line 1591 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 1713 of file nbd-server.c.
References authorized_client(), children, DEBUG, err(), err_nonfatal(), CLIENT::exportsize, SERVER::max_connections, modernsock, msg2, msg3, negotiate(), 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.
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 1618 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().
int setup_serve | ( | SERVER * | serve | ) |
Connect a server's socket.
serve | the server we want to connect. |
Definition at line 1860 of file nbd-server.c.
References DEBUG, do_oldstyle, dosockopts(), err(), F_SDP, SERVER::flags, SERVER::listenaddr, SERVER::port, SERVER::servename, SERVER::socket, and SERVER::socket_family.
Referenced by setup_servers().
void setup_servers | ( | GArray * | servers | ) |
Connect our servers.
Definition at line 1956 of file nbd-server.c.
References children, destroy_pid_t(), err(), open_modern(), setup_serve(), sigchld_handler(), and sigterm_handler().
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.
client | information on the client which we want to setup export for |
Definition at line 1472 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.
s | the signal we're handling (must be SIGCHLD, or something is severely wrong) |
Definition at line 892 of file nbd-server.c.
References children, DEBUG2, and msg3.
Referenced by setup_servers().
void sigterm_handler | ( | int | s | ) |
Handle SIGTERM and dispatch it to our children.
s | the signal we're handling (must be SIGTERM, or something is severely wrong). |
Definition at line 932 of file nbd-server.c.
References children, killchild(), and pidfname.
Referenced by setup_servers().
off_t size_autodetect | ( | int | fhandle | ) |
Detect the size of a file.
fhandle | An open filedescriptor |
Definition at line 951 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 360 of file nbd-server.c.
void writeit | ( | int | f, | |
void * | buf, | |||
size_t | len | |||
) | [inline] |
Write data from a buffer into a filedescriptor.
f | a file descriptor | |
buf | a buffer containing data | |
len | the number of bytes to be written |
Definition at line 345 of file nbd-server.c.
Referenced by mainloop().
GHashTable* children |
Definition at line 163 of file nbd-server.c.
Referenced by serveloop(), setup_servers(), sigchld_handler(), and sigterm_handler().
gchar* config_file_pos |
char default_authname[] = SYSCONFDIR "/nbd-server/allow" |
gboolean do_oldstyle = FALSE |
whether to export using the old negotiation protocol (port-based)
Definition at line 117 of file nbd-server.c.
Referenced by cmdline(), parse_cfile(), and setup_serve().
char* modern_listen |
listenaddr value for modernsock
Definition at line 173 of file nbd-server.c.
Referenced by open_modern(), and parse_cfile().
int modernsock = 0 |
Socket for the modern handler.
Not used if a client was only specified on the command line; only port used if oldstyle is set to false (and then the command-line client isn't used, gna gna)
Definition at line 168 of file nbd-server.c.
Referenced by open_modern(), and serveloop().
char pidfname[256] |
name of our PID file
Definition at line 164 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 165 of file nbd-server.c.
Referenced by cmdline(), daemonize(), and main().
gchar* rungroup = NULL |
What group we're running as.
Definition at line 115 of file nbd-server.c.
Referenced by dousers(), and parse_cfile().
gchar* runuser = NULL |
What user we're running as.
Definition at line 113 of file nbd-server.c.
Referenced by dousers(), and parse_cfile().