[libvirt] [libvirt-php] add list function for storagepool

Lyre liyong at skybility.com
Thu Feb 24 07:45:52 UTC 2011


* add libvirt_list_active_storagepools & libvirt_list_inactive_storagepools
* modified EXTRA_DIST for necessary files
* generate libvirt-php.spec from .in file
* bug fix for memeory leak
---
 Makefile.am         |    2 +-
 configure.ac        |    1 +
 libvirt-php.spec    |   82 --------------------------
 libvirt-php.spec.in |   82 ++++++++++++++++++++++++++
 src/Makefile.am     |    2 +-
 src/libvirt.c       |  159 ++++++++++++++++++++++++++++++++++++++++++++++----
 src/libvirt_php.h   |    2 +
 tools/Makefile.am   |    2 +
 8 files changed, 235 insertions(+), 97 deletions(-)
 delete mode 100644 libvirt-php.spec
 create mode 100644 libvirt-php.spec.in

diff --git a/Makefile.am b/Makefile.am
index 2e73743..45f396b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,3 +1,3 @@
 SUBDIRS = tools src docs
 
-EXTRA_DIST = libvirt-php.spec
+EXTRA_DIST = libvirt-php.spec.in
diff --git a/configure.ac b/configure.ac
index f79317d..8d81b9d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -110,4 +110,5 @@ fi
 AC_SUBST([PHPIZE])
 AC_SUBST([PHPCONFIG])
 AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_FILES([$PACKAGE.spec])
 AC_OUTPUT
diff --git a/libvirt-php.spec b/libvirt-php.spec
deleted file mode 100644
index 51a9add..0000000
--- a/libvirt-php.spec
+++ /dev/null
@@ -1,82 +0,0 @@
-%define		req_libvirt_version 0.6.2
-
-%if 0%{?suse_version} 
-%define		php_confdir %{_sysconfdir}/php5/conf.d
-%define		php_extdir 	%{_libdir}/php5/extensions
-%else
-%define		php_confdir %{_sysconfdir}/php.d 
-%define		php_extdir  %{_libdir}/php/modules
-%endif
-
-Name:		libvirt-php
-Version:	0.4
-Release:	1%{?dist}%{?extra_release}
-Summary:	PHP language binding for Libvirt
-
-%if 0%{?suse_version}  
-Group:		Development/Libraries/PHP
-%else
-Group:		Development/Libraries
-%endif
-License:	PHP
-URL:		http://libvirt.org/
-Source0:	http://libvirt.org/sources/libvirt-php-%{version}.tar.gz
-BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root
-
-BuildRequires:	php-devel
-BuildRequires:	libvirt-devel >= %{req_libvirt_version}
-BuildRequires:	libxml2-devel
-%if 0%{?suse_version}  
-BuildRequires:	xhtml-dtd
-%else
-BuildRequires:	xhtml1-dtds
-%endif
-Requires:	libvirt >= %{req_libvirt_version}
-%if 0%{?suse_version}  
-Requires:	php5
-%else
-Requires:	php
-%endif
-
-%description
-PHP language bindings for Libvirt API. 
-For more details see: http://phplibvirt.cybersales.cz/ http://www.libvirt.org/ http://www.php.net/
-
-%package -n libvirt-php-doc
-Summary:	Document of libvirt-php
-Group:		Development/Libraries/PHP
-Requires:	libvirt-php = %{version}
-
-%description -n libvirt-php-doc
-PHP language bindings for Libvirt API. 
-For more details see: http://phplibvirt.cybersales.cz/ http://www.libvirt.org/ http://www.php.net/
-
-This package contain the document for libvirt-php.
-
-%prep
-%setup -q -n libvirt-php-%{version}
-
-%build
-%configure
-./configure --with-html-dir=%{_datadir}/doc --with-html-subdir=%{name}-%{version}/html
-make %{?_smp_mflags}
-
-%install
-make install DESTDIR=%{buildroot}
-
-%clean
-rm -rf %{buildroot}
-
-%files
-%defattr(-,root,root,-)
-%{php_extdir}/libvirt-php.so
-%config(noreplace) %{php_confdir}/libvirt-php.ini
-
-%files -n libvirt-php-doc
-%defattr(-,root,root,-)
-%doc
-%dir %{_datadir}/doc/%{name}-%{version}
-%{_datadir}/doc/%{name}-%{version}/html
-
-%changelog
-
diff --git a/libvirt-php.spec.in b/libvirt-php.spec.in
new file mode 100644
index 0000000..465532c
--- /dev/null
+++ b/libvirt-php.spec.in
@@ -0,0 +1,82 @@
+%define		req_libvirt_version 0.6.2
+
+%if 0%{?suse_version} 
+%define		php_confdir %{_sysconfdir}/php5/conf.d
+%define		php_extdir 	%{_libdir}/php5/extensions
+%else
+%define		php_confdir %{_sysconfdir}/php.d 
+%define		php_extdir  %{_libdir}/php/modules
+%endif
+
+Name:		@PACKAGE@
+Version:	@VERSION@
+Release:	1%{?dist}%{?extra_release}
+Summary:	PHP language binding for Libvirt
+
+%if 0%{?suse_version}  
+Group:		Development/Libraries/PHP
+%else
+Group:		Development/Libraries
+%endif
+License:	PHP
+URL:		http://libvirt.org/
+Source0:	http://libvirt.org/sources/libvirt-php-%{version}.tar.gz
+BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root
+
+BuildRequires:	php-devel
+BuildRequires:	libvirt-devel >= %{req_libvirt_version}
+BuildRequires:	libxml2-devel
+%if 0%{?suse_version}  
+BuildRequires:	xhtml-dtd
+%else
+BuildRequires:	xhtml1-dtds
+%endif
+Requires:	libvirt >= %{req_libvirt_version}
+%if 0%{?suse_version}  
+Requires:	php5
+%else
+Requires:	php
+%endif
+
+%description
+PHP language bindings for Libvirt API. 
+For more details see: http://phplibvirt.cybersales.cz/ http://www.libvirt.org/ http://www.php.net/
+
+%package -n libvirt-php-doc
+Summary:	Document of libvirt-php
+Group:		Development/Libraries/PHP
+Requires:	libvirt-php = %{version}
+
+%description -n libvirt-php-doc
+PHP language bindings for Libvirt API. 
+For more details see: http://phplibvirt.cybersales.cz/ http://www.libvirt.org/ http://www.php.net/
+
+This package contain the document for libvirt-php.
+
+%prep
+%setup -q -n libvirt-php-%{version}
+
+%build
+%configure
+./configure --with-html-dir=%{_datadir}/doc --with-html-subdir=%{name}-%{version}/html
+make %{?_smp_mflags}
+
+%install
+make install DESTDIR=%{buildroot}
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{php_extdir}/libvirt-php.so
+%config(noreplace) %{php_confdir}/libvirt-php.ini
+
+%files -n libvirt-php-doc
+%defattr(-,root,root,-)
+%doc
+%dir %{_datadir}/doc/%{name}-%{version}
+%{_datadir}/doc/%{name}-%{version}/html
+
+%changelog
+
diff --git a/src/Makefile.am b/src/Makefile.am
index d301ae2..9c7101d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,7 +3,7 @@ PHPEDIR=$(shell php-config --extension-dir)
 PHPCDIR=$(shell php-config --configure-options | sed -n 's|.*--with-config-file-scan-dir=\([^ ]*\).*|\1|p')
 DEFINES=-DHAVE_CONFIG_H
 
-EXTRA_DIST = libvirt.c php_libvirt.h
+EXTRA_DIST = libvirt.c libvirt_php.h
 
 all-am: build clean-temp
 
diff --git a/src/libvirt.c b/src/libvirt.c
index 9293224..230aff2 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -109,6 +109,8 @@ static function_entry libvirt_functions[] = {
 	PHP_FE(libvirt_list_nodedevs, NULL)
 	PHP_FE(libvirt_list_networks,NULL)
 	PHP_FE(libvirt_list_storagepools,NULL)
+	PHP_FE(libvirt_list_active_storagepools,NULL)
+	PHP_FE(libvirt_list_inactive_storagepools,NULL)
 	PHP_FE(libvirt_storagepool_list_volumes,NULL)
 	PHP_FE(libvirt_list_active_domains, NULL)
 	PHP_FE(libvirt_list_active_domain_ids, NULL)
@@ -1994,10 +1996,11 @@ PHP_FUNCTION(libvirt_storagepool_get_info)
 	array_init(return_value);
 
 	// @todo: fix the long long returns
+	LONGLONG_INIT
 	add_assoc_long(return_value, "state", (long)poolInfo.state);
-	add_assoc_long(return_value, "capacity", poolInfo.capacity);
-	add_assoc_long(return_value, "allocation", poolInfo.allocation);
-	add_assoc_long(return_value, "available", poolInfo.available);
+	LONGLONG_ASSOC(return_value, "capacity", poolInfo.capacity);
+	LONGLONG_ASSOC(return_value, "allocation", poolInfo.allocation);
+	LONGLONG_ASSOC(return_value, "available", poolInfo.available);
 }
 
 /*
@@ -2426,18 +2429,110 @@ PHP_FUNCTION(libvirt_list_storagepools)
 	names=emalloc(expectedcount*sizeof(char *));
 	count=virConnectListStoragePools(conn->conn,names,expectedcount);
 
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
+
 	array_init(return_value);
 	for (i=0;i<count;i++)
 	{
 		add_next_index_string(return_value,  names[i],1);
 		free(names[i]);
 	}
+	efree(names);
+
+
+	expectedcount = virConnectNumOfDefinedStoragePools (conn->conn);
+	names= emalloc (expectedcount * sizeof(char *));
+	count = virConnectListDefinedStoragePools (conn->conn, names, expectedcount);
+	if ((count != expectedcount) || (count < 0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
+
+	for (i = 0; i < count; i++)
+	{
+		add_next_index_string (return_value, names[i], 1);
+		free (names[i]);
+	}
+	efree (names);
+}
 
+/*
+	Function name:	libvirt_list_active_storagepools
+	Description:	Function is used to list active storage pools on the connection
+	Arguments:		@res [resource]: libvirt connection resource
+	Returns:		libvirt storagepool names array for the connection
+*/
+PHP_FUNCTION(libvirt_list_active_storagepools)
+{
+	php_libvirt_connection *conn=NULL;
+	zval *zconn;
+	int count=-1;
+	int expectedcount=-1;
+	char **names;
+	int i;
+
+	GET_CONNECTION_FROM_ARGS("r",&zconn);
+
+	expectedcount=virConnectNumOfStoragePools(conn->conn);
+
+	names=emalloc(expectedcount*sizeof(char *));
+	count=virConnectListStoragePools(conn->conn,names,expectedcount);
+
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
+	array_init(return_value);
+	for (i=0;i<count;i++)
+	{
+		add_next_index_string(return_value,  names[i],1);
+		free(names[i]);
+	}
 	efree(names);
 }
 
 /*
+	Function name:	libvirt_list_inactive_storagepools
+	Description:	Function is used to list inactive storage pools on the connection
+	Arguments:		@res [resource]: libvirt connection resource
+	Returns:		libvirt storagepool names array for the connection
+*/
+PHP_FUNCTION(libvirt_list_inactive_storagepools)
+{
+	php_libvirt_connection *conn=NULL;
+	zval *zconn;
+	int count=-1;
+	int expectedcount=-1;
+	char **names;
+	int i;
+
+	GET_CONNECTION_FROM_ARGS("r",&zconn);
+
+	expectedcount = virConnectNumOfDefinedStoragePools (conn->conn);
+	names= emalloc (expectedcount * sizeof(char *));
+	count = virConnectListDefinedStoragePools (conn->conn, names, expectedcount);
+	if ((count != expectedcount) || (count < 0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
+
+	array_init(return_value);
+	for (i = 0; i < count; i++)
+	{
+		add_next_index_string (return_value, names[i], 1);
+		free (names[i]);
+	}
+	efree (names);
+}
+
+/*
 	Function name:	libvirt_list_domains
 	Description:	Function is used to list domains on the connection
 	Arguments:		@res [resource]: libvirt connection resource
@@ -2513,7 +2608,11 @@ PHP_FUNCTION(libvirt_list_domain_resources)
 
 	ids=emalloc(sizeof(int)*expectedcount);
 	count=virConnectListDomains (conn->conn,ids,expectedcount);
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (ids);
+		RETURN_FALSE;
+	}
 	array_init(return_value);
 	for (i=0;i<count;i++)
 	{
@@ -2535,7 +2634,11 @@ PHP_FUNCTION(libvirt_list_domain_resources)
 	expectedcount=virConnectNumOfDefinedDomains (conn->conn);
 	names=emalloc(expectedcount*sizeof(char *));
 	count=virConnectListDefinedDomains (conn->conn,names	,expectedcount);
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
 	for (i=0;i<count;i++)
 	{
 		domain=virDomainLookupByName	(conn->conn,names[i]);
@@ -2576,7 +2679,11 @@ PHP_FUNCTION(libvirt_list_active_domain_ids)
 
 	ids=emalloc(sizeof(int)*expectedcount);
 	count=virConnectListDomains (conn->conn,ids,expectedcount);
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (ids);
+		RETURN_FALSE;
+	}
 	array_init(return_value);
 	for (i=0;i<count;i++)
 	{
@@ -2608,7 +2715,12 @@ PHP_FUNCTION(libvirt_list_active_domains)
 
 	ids=emalloc(sizeof(int)*expectedcount);
 	count=virConnectListDomains (conn->conn,ids,expectedcount);
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (ids);
+		RETURN_FALSE;
+	}
+
 	array_init(return_value);
 	for (i=0;i<count;i++)
 	{
@@ -2616,7 +2728,12 @@ PHP_FUNCTION(libvirt_list_active_domains)
 		if (domain!=NULL) 
 		{
 			name=virDomainGetName(domain);
-			if (name==NULL) RETURN_FALSE;
+			if (name==NULL)
+			{
+				efree (ids);
+				RETURN_FALSE;
+			}
+
 			add_next_index_string(return_value, name, 1);
 		}
 	}
@@ -2645,7 +2762,11 @@ PHP_FUNCTION(libvirt_list_inactive_domains)
 
 	names=emalloc(expectedcount*sizeof(char *));
 	count=virConnectListDefinedDomains (conn->conn,names	,expectedcount);
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
 	for (i=0;i<count;i++)
 	{
 		add_next_index_string(return_value,  names[i],1);
@@ -2678,7 +2799,11 @@ PHP_FUNCTION(libvirt_list_networks)
 		expectedcount=virConnectNumOfNetworks(conn->conn);
 		names=emalloc(expectedcount*sizeof(char *));
 		count=virConnectListNetworks(conn->conn,names,expectedcount);
-		if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+		if ((count != expectedcount) || (count<0))
+		{
+			efree (names);
+			RETURN_FALSE;
+		}
 
 		for (i=0;i<count;i++)
 		{
@@ -2694,7 +2819,11 @@ PHP_FUNCTION(libvirt_list_networks)
 		expectedcount=virConnectNumOfDefinedNetworks(conn->conn);
 		names=emalloc(expectedcount*sizeof(char *));
 		count=virConnectListDefinedNetworks(conn->conn,names,expectedcount);
-		if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+		if ((count != expectedcount) || (count<0))
+		{
+			efree (names);
+			RETURN_FALSE;
+		}
 
 		for (i=0;i<count;i++)
 		{
@@ -2732,7 +2861,11 @@ PHP_FUNCTION(libvirt_list_nodedevs)
 	expectedcount=virNodeNumOfDevices(conn->conn, cap, 0);
 	names=emalloc(expectedcount*sizeof(char *));
 	count=virNodeListDevices(conn->conn, cap, names, expectedcount, 0);
-	if ((count != expectedcount) || (count<0)) RETURN_FALSE;
+	if ((count != expectedcount) || (count<0))
+	{
+		efree (names);
+		RETURN_FALSE;
+	}
 
 	array_init(return_value);
 	for (i=0;i<count;i++)
diff --git a/src/libvirt_php.h b/src/libvirt_php.h
index 8667217..3cdc305 100644
--- a/src/libvirt_php.h
+++ b/src/libvirt_php.h
@@ -168,6 +168,8 @@ PHP_FUNCTION(libvirt_list_active_domains);
 PHP_FUNCTION(libvirt_list_active_domain_ids);
 PHP_FUNCTION(libvirt_list_inactive_domains);
 PHP_FUNCTION(libvirt_list_storagepools);
+PHP_FUNCTION(libvirt_list_active_storagepools);
+PHP_FUNCTION(libvirt_list_inactive_storagepools);
 PHP_FUNCTION(libvirt_version);
 PHP_FUNCTION(libvirt_check_version);
 
diff --git a/tools/Makefile.am b/tools/Makefile.am
index b334717..e508371 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,3 +1,5 @@
+EXTRA_DIST = generate-api-docs.c
+
 all-am:
 	$(CC) -Wall -o generate-api-docs generate-api-docs.c
 	./generate-api-docs ../src/libvirt.c ../docs/api-reference.html.in
-- 
1.7.1





More information about the libvir-list mailing list