2007-02-14 04:40:09 +03:00
/*
2009-09-16 15:37:26 +04:00
* libvirtd . h : daemon data structure definitions
2007-02-14 04:40:09 +03:00
*
2009-02-09 20:52:38 +03:00
* Copyright ( C ) 2006 - 2009 Red Hat , Inc .
2007-02-14 04:40:09 +03:00
* Copyright ( C ) 2006 Daniel P . Berrange
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
* Author : Daniel P . Berrange < berrange @ redhat . com >
*/
# ifndef QEMUD_INTERNAL_H__
# define QEMUD_INTERNAL_H__
2008-01-23 17:54:41 +03:00
# include <config.h>
2007-06-11 16:04:54 +04:00
# include <gnutls/gnutls.h>
# include <gnutls/x509.h>
Standardize use of header files, making internal.h primary.
* qemud/internal.h, qemud/qemud.h: Rename this file so it
doesn't conflict with src/internal.h.
* HACKING: Document how header files should be used.
* qemud/Makefile.am: Add src/ directory to includes.
* qemud/event.c, qemud/mdns.c, qemud/qemud.c, qemud/remote.c,
qemud/remote_protocol.c, qemud/remote_protocol.h,
qemud/remote_protocol.x, src/buf.c, src/libvirt.c,
src/nodeinfo.c, src/qemu_conf.c, src/qemu_driver.c,
src/stats_linux.c, src/storage_backend.c, src/storage_backend_fs.c,
src/storage_backend_iscsi.c, src/storage_backend_logical.c,
src/storage_conf.c, src/storage_driver.c, src/util.c,
src/util.h, src/virsh.c, src/virterror.c, src/xend_internal.c,
src/xml.c, tests/reconnect.c, tests/xmlrpctest.c,
tests/qparamtest.c: Standardize use of header files.
* docs/*, po/*: Rebuild docs.
2008-05-23 12:24:41 +04:00
# include "gnutls_1_0_compat.h"
2007-12-05 18:24:15 +03:00
# if HAVE_SASL
# include <sasl/sasl.h>
# endif
2007-02-14 04:40:09 +03:00
2009-08-06 16:54:08 +04:00
# if HAVE_POLKIT0
2007-12-05 21:21:27 +03:00
# include <dbus/dbus.h>
# endif
2007-11-26 14:54:29 +03:00
# ifdef HAVE_SYS_SYSLIMITS_H
# include <sys/syslimits.h>
# endif
# include <rpc/types.h>
# include <rpc/xdr.h>
2007-06-11 16:04:54 +04:00
# include "remote_protocol.h"
2008-12-22 15:53:26 +03:00
# include "logging.h"
2009-01-15 22:56:05 +03:00
# include "threads.h"
2007-02-14 04:40:09 +03:00
# ifdef __GNUC__
# ifdef HAVE_ANSIDECL_H
# include <ansidecl.h>
# endif
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 19:07:32 +04:00
# ifndef __GNUC_PREREQ
# if defined __GNUC__ && defined __GNUC_MINOR__
# define __GNUC_PREREQ(maj, min) \
( ( __GNUC__ < < 16 ) + __GNUC_MINOR__ > = ( ( maj ) < < 16 ) + ( min ) )
# else
# define __GNUC_PREREQ(maj,min) 0
# endif
# endif
/**
* ATTRIBUTE_UNUSED :
*
* Macro to flag conciously unused parameters to functions
*/
2007-02-14 04:40:09 +03:00
# ifndef ATTRIBUTE_UNUSED
2007-03-16 18:03:21 +03:00
# define ATTRIBUTE_UNUSED __attribute__((__unused__))
2007-02-14 04:40:09 +03:00
# endif
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 19:07:32 +04:00
/**
* ATTRIBUTE_FMT_PRINTF
*
* Macro used to check printf like functions , if compiling
* with gcc .
*
* We use gnulib which guarentees we always have GNU style
* printf format specifiers even on broken Win32 platforms
* hence we have to force ' gnu_printf ' for new GCC
*/
# ifndef ATTRIBUTE_FMT_PRINTF
# if __GNUC_PREREQ (4, 4)
# define ATTRIBUTE_FMT_PRINTF(fmtpos,argpos) __attribute__((__format__ (gnu_printf, fmtpos,argpos)))
# else
# define ATTRIBUTE_FMT_PRINTF(fmtpos,argpos) __attribute__((__format__ (printf, fmtpos,argpos)))
# endif
2007-03-15 20:24:56 +03:00
# endif
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 19:07:32 +04:00
# ifndef ATTRIBUTE_RETURN_CHECK
# if __GNUC_PREREQ (3, 4)
# define ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__))
2007-02-14 04:40:09 +03:00
# else
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 19:07:32 +04:00
# define ATTRIBUTE_RETURN_CHECK
# endif
# endif
# else
# ifndef ATTRIBUTE_UNUSED
2007-02-14 04:40:09 +03:00
# define ATTRIBUTE_UNUSED
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 19:07:32 +04:00
# endif
# ifndef ATTRIBUTE_FMT_PRINTF
# define ATTRIBUTE_FMT_PRINTF(...)
# endif
# ifndef ATTRIBUTE_RETURN_CHECK
# define ATTRIBUTE_RETURN_CHECK
# endif
2007-02-14 04:40:09 +03:00
# endif
2008-12-22 15:53:26 +03:00
# define qemudDebug DEBUG
2007-06-11 16:04:54 +04:00
2007-12-05 18:27:08 +03:00
/* Whether we're passing reads & writes through a sasl SSF */
enum qemud_sasl_ssf {
QEMUD_SASL_SSF_NONE = 0 ,
QEMUD_SASL_SSF_READ = 1 ,
QEMUD_SASL_SSF_WRITE = 2 ,
} ;
enum qemud_sock_type {
QEMUD_SOCK_TYPE_UNIX = 0 ,
QEMUD_SOCK_TYPE_TCP = 1 ,
QEMUD_SOCK_TYPE_TLS = 2 ,
2007-06-11 16:04:54 +04:00
} ;
2009-01-20 22:25:15 +03:00
struct qemud_client_message {
char buffer [ REMOTE_MESSAGE_MAX + REMOTE_MESSAGE_HEADER_XDR_LEN ] ;
unsigned int bufferLength ;
unsigned int bufferOffset ;
2009-07-10 16:06:36 +04:00
unsigned int async : 1 ;
2009-01-20 22:25:15 +03:00
2009-07-10 15:26:00 +04:00
remote_message_header hdr ;
2009-01-20 22:25:15 +03:00
struct qemud_client_message * next ;
} ;
2009-07-10 16:06:36 +04:00
struct qemud_client ;
2009-07-10 15:58:22 +04:00
/* Allow for filtering of incoming messages to a custom
* dispatch processing queue , instead of client - > dx .
*/
2009-07-10 16:06:36 +04:00
typedef int ( * qemud_client_filter_func ) ( struct qemud_client * client ,
struct qemud_client_message * msg , void * opaque ) ;
2009-07-10 15:58:22 +04:00
struct qemud_client_filter {
qemud_client_filter_func query ;
void * opaque ;
struct qemud_client_filter * next ;
} ;
2009-07-10 16:06:36 +04:00
struct qemud_client_stream {
virStreamPtr st ;
int procedure ;
int serial ;
unsigned int recvEOF : 1 ;
unsigned int closed : 1 ;
struct qemud_client_filter filter ;
struct qemud_client_message * rx ;
int tx ;
struct qemud_client_stream * next ;
} ;
2007-02-14 04:40:09 +03:00
/* Stores the per-client connection state */
struct qemud_client {
2009-01-15 22:56:05 +03:00
virMutex lock ;
2008-12-05 01:16:40 +03:00
2007-06-11 16:04:54 +04:00
int magic ;
2007-02-14 04:40:09 +03:00
int fd ;
2008-11-19 19:19:36 +03:00
int watch ;
2008-12-05 01:16:40 +03:00
int readonly : 1 ;
int closing : 1 ;
2007-06-11 16:04:54 +04:00
struct sockaddr_storage addr ;
socklen_t addrlen ;
2007-12-05 18:27:08 +03:00
int type ; /* qemud_sock_type */
gnutls_session_t tlssession ;
2007-12-05 18:24:15 +03:00
int auth ;
2009-01-20 22:25:15 +03:00
int handshake : 1 ; /* If we're in progress for TLS handshake */
2007-12-05 18:24:15 +03:00
# if HAVE_SASL
sasl_conn_t * saslconn ;
2007-12-05 18:27:08 +03:00
int saslSSF ;
const char * saslDecoded ;
unsigned int saslDecodedLength ;
unsigned int saslDecodedOffset ;
const char * saslEncoded ;
unsigned int saslEncodedLength ;
unsigned int saslEncodedOffset ;
2007-12-05 18:34:05 +03:00
char * saslUsername ;
2007-12-05 18:24:15 +03:00
# endif
2007-06-11 16:04:54 +04:00
2009-01-20 22:25:15 +03:00
/* Count of meages in 'dx' or 'tx' queue
* ie RPC calls in progress . Does not count
* async events which are not used for
* throttling calculations */
int nrequests ;
/* Zero or one messages being received. Zero if
* nrequests > = max_clients and throttling */
struct qemud_client_message * rx ;
/* Zero or many messages waiting for a worker
* to process them */
struct qemud_client_message * dx ;
/* Zero or many messages waiting for transmit
* back to client , including async events */
struct qemud_client_message * tx ;
2009-07-10 15:58:22 +04:00
/* Filters to capture messages that would otherwise
* end up on the ' dx ' queue */
struct qemud_client_filter * filters ;
2007-06-11 16:04:54 +04:00
2009-07-10 16:06:36 +04:00
/* Data streams */
struct qemud_client_stream * streams ;
2007-06-11 16:04:54 +04:00
/* This is only valid if a remote open call has been made on this
* connection , otherwise it will be NULL . Also if remote close is
* called , it will be set back to NULL if that succeeds .
*/
virConnectPtr conn ;
2008-12-05 01:16:40 +03:00
int refs ;
2007-06-11 16:04:54 +04:00
2007-02-14 04:40:09 +03:00
} ;
2007-06-11 16:04:54 +04:00
# define QEMUD_CLIENT_MAGIC 0x7788aaee
2007-02-14 04:40:09 +03:00
struct qemud_socket {
int fd ;
2008-11-19 19:19:36 +03:00
int watch ;
2007-02-14 04:40:09 +03:00
int readonly ;
2007-12-05 18:27:08 +03:00
int type ; /* qemud_sock_type */
2007-12-05 18:24:15 +03:00
int auth ;
2007-09-19 05:56:55 +04:00
int port ;
2007-02-14 04:40:09 +03:00
struct qemud_socket * next ;
} ;
2009-01-20 22:27:11 +03:00
struct qemud_worker {
pthread_t thread ;
int hasThread : 1 ;
int processingCall : 1 ;
int quitRequest : 1 ;
/* back-pointer to our server */
struct qemud_server * server ;
} ;
2007-02-14 04:40:09 +03:00
/* Main server state */
struct qemud_server {
2009-01-15 22:56:05 +03:00
virMutex lock ;
virCond job ;
2008-12-05 01:16:40 +03:00
2009-06-12 17:20:13 +04:00
int privileged ;
2008-12-05 01:16:40 +03:00
int nworkers ;
2009-01-20 22:27:11 +03:00
int nactiveworkers ;
struct qemud_worker * workers ;
2007-02-14 04:40:09 +03:00
int nsockets ;
struct qemud_socket * sockets ;
int nclients ;
2008-12-05 01:09:35 +03:00
struct qemud_client * * clients ;
2008-12-05 01:16:40 +03:00
2007-02-16 21:28:17 +03:00
int sigread ;
2009-02-09 20:52:38 +03:00
char * logDir ;
2007-02-16 21:28:17 +03:00
unsigned int shutdown : 1 ;
2007-09-19 05:56:55 +04:00
# ifdef HAVE_AVAHI
struct libvirtd_mdns * mdns ;
# endif
2007-12-05 18:34:05 +03:00
# if HAVE_SASL
char * * saslUsernameWhitelist ;
# endif
2009-08-06 16:54:08 +04:00
# if HAVE_POLKIT0
2007-12-05 21:21:27 +03:00
DBusConnection * sysbus ;
# endif
2007-02-14 04:40:09 +03:00
} ;
2007-03-16 18:03:21 +03:00
void qemudLog ( int priority , const char * fmt , . . . )
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 19:07:32 +04:00
ATTRIBUTE_FMT_PRINTF ( 2 , 3 ) ;
2007-02-16 21:30:55 +03:00
2007-02-14 18:58:06 +03:00
2007-06-11 16:04:54 +04:00
2009-01-20 22:25:15 +03:00
int qemudRegisterClientEvent ( struct qemud_server * server ,
2009-07-10 15:48:50 +04:00
struct qemud_client * client ) ;
void qemudUpdateClientEvent ( struct qemud_client * client ) ;
2008-10-23 17:18:18 +04:00
2009-01-20 22:25:15 +03:00
void qemudDispatchClientFailure ( struct qemud_client * client ) ;
void
qemudClientMessageQueuePush ( struct qemud_client_message * * queue ,
struct qemud_client_message * msg ) ;
2009-07-10 15:20:03 +04:00
struct qemud_client_message *
qemudClientMessageQueueServe ( struct qemud_client_message * * queue ) ;
2007-02-23 11:39:49 +03:00
2009-07-10 16:06:36 +04:00
void
qemudClientMessageRelease ( struct qemud_client * client ,
struct qemud_client_message * msg ) ;
2008-10-23 17:18:18 +04:00
2009-01-20 22:25:15 +03:00
# if HAVE_POLKIT
int qemudGetSocketIdentity ( int fd , uid_t * uid , pid_t * pid ) ;
# endif
2007-02-14 04:40:09 +03:00
# endif