#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().
1.5.6