#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 <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) |
| 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 |
| #define | SEND(net, reply) writeit( net, &reply, sizeof( reply )); |
| sending macro. | |
| #define | ERROR(client, reply) { reply.error = htonl(-1); 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_PROGERR } |
| 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. | |
| 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) |
| 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*. | |
| void | daemonize (SERVER *serve) |
| Go daemon (unless we specified at compile time that we didn't want this). | |
| void | setup_serve (SERVER *serve) |
| Connect a server's socket. | |
| void | setup_servers (GArray *servers) |
| Connect our servers. | |
| int | serveloop (GArray *servers) |
| Loop through the available servers, and serve them. | |
| void | dousers (void) |
| Set up user-ID and/or group-ID. | |
| 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 BUFSIZE (1024*1024) |
Size of buffer that can hold requests.
Definition at line 142 of file nbd-server.c.
Referenced by mainloop().
| #define CFILE SYSCONFDIR "/nbd-server/config" |
| #define DEBUG | ( | a | ) |
Definition at line 127 of file nbd-server.c.
Referenced by mainloop(), readit(), serveloop(), setup_serve(), size_autodetect(), and writeit().
| #define DEBUG2 | ( | a, | |||
| b | ) |
Definition at line 128 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 143 of file nbd-server.c.
Referenced by copyonwrite_prepare(), expread(), and expwrite().
| #define ERROR | ( | client, | |||
| reply | ) | { reply.error = htonl(-1); SEND(client->net,reply); reply.error = 0; } |
| #define F_AUTOREADONLY 8 |
flag to tell us a file is set to autoreadonly
Definition at line 148 of file nbd-server.c.
Referenced by mainloop(), parse_cfile(), and setupexport().
| #define F_COPYONWRITE 4 |
flag to tell us a file is exported using copyonwrite
Definition at line 146 of file nbd-server.c.
Referenced by cmdline(), dump_section(), expread(), expwrite(), mainloop(), parse_cfile(), and serveconnection().
| #define F_MULTIFILE 2 |
flag to tell us a file is exported using -m
Definition at line 145 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 144 of file nbd-server.c.
Referenced by cmdline(), dump_section(), mainloop(), parse_cfile(), and setupexport().
| #define F_SPARSE 16 |
| #define LINELEN 256 |
Size of static buffer used to read the authorization file (yuck).
Definition at line 140 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 114 of file nbd-server.c.
Referenced by mainloop(), and serveloop().
| #define msg3 | ( | a, | |||
| b, | |||||
| c | ) | g_message(b,c) |
Definition at line 115 of file nbd-server.c.
Referenced by copyonwrite_prepare(), dousers(), serveloop(), setupexport(), and sigchld_handler().
| #define msg4 | ( | a, | |||
| b, | |||||
| c, | |||||
| d | ) | g_message(b,c,d) |
| #define MY_NAME "nbd_server" |
Definition at line 91 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 139 of file nbd-server.c.
Referenced by main(), mainloop(), 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 490 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 212 of file nbd-server.c.
| enum VIRT_STYLE |
Types of virtuatlization.
Definition at line 158 of file nbd-server.c.
| 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 242 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 378 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, pidftemplate, SERVER::port, SERVER::timeout, and usage().
Referenced by main().
| int copyonwrite_prepare | ( | CLIENT * | client | ) |
Definition at line 1218 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 1323 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 1311 of file nbd-server.c.
Referenced by setup_servers().
| void dousers | ( | void | ) |
| void dump_section | ( | SERVER * | serve, | |
| gchar * | section_header | |||
| ) |
Definition at line 347 of file nbd-server.c.
References SERVER::authname, SERVER::expected_size, SERVER::exportname, F_COPYONWRITE, F_MULTIFILE, F_READONLY, SERVER::flags, SERVER::port, and SERVER::timeout.
Referenced by cmdline().
| 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 930 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 971 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 786 of file nbd-server.c.
References FILE_INFO::fhandle, and FILE_INFO::startoff.
Referenced by rawexpread(), and rawexpwrite().
| 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 703 of file nbd-server.c.
Referenced by sigterm_handler().
| int main | ( | int | argc, | |
| char * | argv[] | |||
| ) |
Main entry point.
..
Definition at line 1529 of file nbd-server.c.
References CFILE, cmdline(), config_file_pos, daemonize(), dousers(), err(), CLIENT::exportsize, logging(), CLIENT::net, OFFT_MAX, parse_cfile(), pidftemplate, SERVER::port, serveconnection(), serveloop(), CLIENT::server, set_peername(), and setup_servers().
| int mainloop | ( | CLIENT * | client | ) |
Serve a file to a single client.
| client | The client we're going to serve to. |
Definition at line 1050 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, SERVER::timeout, 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 831 of file nbd-server.c.
References err().
Referenced by expread(), expwrite(), rawexpread(), and rawexpwrite().
| void negotiate | ( | CLIENT * | client | ) |
Do the initial negotiation.
| client | The client we're negotiating with. |
Definition at line 1020 of file nbd-server.c.
References cliserv_magic, err(), CLIENT::exportsize, htonll, INIT_PASSWD, and CLIENT::net.
| GArray* parse_cfile | ( | gchar * | f, | |
| GError ** | e | |||
| ) |
Parse the config file.
| f | the name of the config file | |
| e | a GError. |
Definition at line 521 of file nbd-server.c.
References SERVER::authname, CFILE_MISSING_GENERIC, CFILE_NOTFOUND, CFILE_VALUE_INVALID, SERVER::cidrlen, err(), SERVER::expected_size, SERVER::exportname, F_AUTOREADONLY, F_COPYONWRITE, F_MULTIFILE, F_READONLY, F_SPARSE, SERVER::flags, PARAM::flagval, PARAM_BOOL, PARAM_INT, PARAM_STRING, SERVER::port, rungroup, runuser, PARAM::target, SERVER::timeout, 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 889 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 909 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 847 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.
Definition at line 867 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 296 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 501 of file nbd-server.c.
References SERVER::authname, and SERVER::exportname.
| void serveconnection | ( | CLIENT * | client | ) |
Serve a connection.
| client | a connected client |
Definition at line 1243 of file nbd-server.c.
References copyonwrite_prepare(), F_COPYONWRITE, SERVER::flags, mainloop(), CLIENT::net, CLIENT::server, setmysockopt(), and setupexport().
Referenced by main(), and serveloop().
| int serveloop | ( | GArray * | servers | ) |
Loop through the available servers, and serve them.
Definition at line 1423 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.
| 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 1266 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.
| serve | the server we want to connect. |
Definition at line 1358 of file nbd-server.c.
References DEBUG, err(), SERVER::port, sigchld_handler(), sigterm_handler(), and SERVER::socket.
Referenced by setup_servers().
| void setup_servers | ( | GArray * | servers | ) |
Connect our servers.
Definition at line 1411 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.
| client | information on the client which we want to setup export for |
Definition at line 1151 of file nbd-server.c.
References DEBUG2, err(), SERVER::expected_size, CLIENT::export, CLIENT::exportname, CLIENT::exportsize, F_AUTOREADONLY, 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 676 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.
| s | the signal we're handling (must be SIGTERM, or something is severely wrong). |
Definition at line 716 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.
| fhandle | An open filedescriptor |
Definition at line 735 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 329 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.
| f | a file descriptor | |
| buf | a buffer containing data | |
| len | the number of bytes to be written |
Definition at line 314 of file nbd-server.c.
Referenced by mainloop().
| GHashTable* children |
Definition at line 150 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" |
| char pidfname[256] |
name of our PID file
Definition at line 151 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 152 of file nbd-server.c.
Referenced by cmdline(), daemonize(), and main().
| gchar* rungroup = NULL |
What group we're running as.
Definition at line 106 of file nbd-server.c.
Referenced by dousers(), and parse_cfile().
| gchar* runuser = NULL |
What user we're running as.
Definition at line 104 of file nbd-server.c.
Referenced by dousers(), and parse_cfile().
1.5.3