diff mbox

exportfs: Return non-zero exit value on error

Message ID 1380756584-13335-1-git-send-email-tasleson@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Tony Asleson Oct. 2, 2013, 11:29 p.m. UTC
To improve error handling when scripting exportfs it's useful
to have non-zero exit codes when the requested operation did not
succeed.

This patch also returns a non-zero exit code if you request to
unexport a non-existant share.

Signed-off-by: Tony Asleson <tasleson@redhat.com>
---
 support/export/hostname.c |  2 ++
 utils/exportfs/exportfs.c | 37 +++++++++++++++++++++++++++----------
 2 files changed, 29 insertions(+), 10 deletions(-)

Comments

Steve Dickson Oct. 22, 2013, 8:30 a.m. UTC | #1
On 02/10/13 19:29, Tony Asleson wrote:
> To improve error handling when scripting exportfs it's useful
> to have non-zero exit codes when the requested operation did not
> succeed.
> 
> This patch also returns a non-zero exit code if you request to
> unexport a non-existant share.
> 
> Signed-off-by: Tony Asleson <tasleson@redhat.com>
Committed! 

steved.

> ---
>  support/export/hostname.c |  2 ++
>  utils/exportfs/exportfs.c | 37 +++++++++++++++++++++++++++----------
>  2 files changed, 29 insertions(+), 10 deletions(-)
> 
> diff --git a/support/export/hostname.c b/support/export/hostname.c
> index 3e949a1..e53d692 100644
> --- a/support/export/hostname.c
> +++ b/support/export/hostname.c
> @@ -175,10 +175,12 @@ host_addrinfo(const char *hostname)
>  	case 0:
>  		return ai;
>  	case EAI_SYSTEM:
> +		export_errno = errno;
>  		xlog(D_GENERAL, "%s: failed to resolve %s: (%d) %m",
>  				__func__, hostname, errno);
>  		break;
>  	default:
> +		export_errno = EINVAL;
>  		xlog(D_GENERAL, "%s: failed to resolve %s: %s",
>  				__func__, hostname, gai_strerror(error));
>  		break;
> diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
> index 52fc03d..318deb3 100644
> --- a/utils/exportfs/exportfs.c
> +++ b/utils/exportfs/exportfs.c
> @@ -35,8 +35,8 @@
>  #include "xlog.h"
>  
>  static void	export_all(int verbose);
> -static void	exportfs(char *arg, char *options, int verbose);
> -static void	unexportfs(char *arg, int verbose);
> +static int	exportfs(char *arg, char *options, int verbose);
> +static int	unexportfs(char *arg, int verbose);
>  static void	exports_update(int verbose);
>  static void	dump(int verbose, int export_format);
>  static void	error(nfs_export *exp, int err);
> @@ -187,8 +187,12 @@ main(int argc, char **argv)
>  		if (f_all)
>  			export_all(f_verbose);
>  		else
> -			for (i = optind; i < argc ; i++)
> -				exportfs(argv[i], options, f_verbose);
> +			for (i = optind; i < argc ; i++) {
> +				if(!exportfs(argv[i], options, f_verbose)) {
> +					/* Only flag a generic EINVAL if no errno is set */
> +					export_errno = (export_errno) ? export_errno : EINVAL;
> +				}
> +			}
>  	}
>  	/* If we are unexporting everything, then
>  	 * don't care about what should be exported, as that
> @@ -201,8 +205,12 @@ main(int argc, char **argv)
>  		if (!f_reexport)
>  			xtab_export_read();
>  		if (!f_export)
> -			for (i = optind ; i < argc ; i++)
> -				unexportfs(argv[i], f_verbose);
> +			for (i = optind ; i < argc ; i++) {
> +				if (!unexportfs(argv[i], f_verbose)) {
> +					/* Only flag a generic EINVAL if no errno is set */
> +					export_errno = (export_errno) ? export_errno : EINVAL;
> +				}
> +			}
>  		if (!new_cache)
>  			rmtab_read();
>  	}
> @@ -296,9 +304,10 @@ export_all(int verbose)
>  }
>  
>  
> -static void
> +static int
>  exportfs(char *arg, char *options, int verbose)
>  {
> +	int rc = 0;
>  	struct exportent *eep;
>  	nfs_export	*exp = NULL;
>  	struct addrinfo	*ai = NULL;
> @@ -311,7 +320,8 @@ exportfs(char *arg, char *options, int verbose)
>  
>  	if (!path || *path != '/') {
>  		xlog(L_ERROR, "Invalid exporting option: %s", arg);
> -		return;
> +		export_errno = EINVAL;
> +		return rc;
>  	}
>  
>  	if ((htype = client_gettype(hname)) == MCL_FQDN) {
> @@ -339,13 +349,16 @@ exportfs(char *arg, char *options, int verbose)
>  	exp->m_warned = 0;
>  	validate_export(exp);
>  
> +	rc = 1;
>  out:
>  	freeaddrinfo(ai);
> +	return rc;
>  }
>  
> -static void
> +static int
>  unexportfs(char *arg, int verbose)
>  {
> +	int rc = 0;
>  	nfs_export	*exp;
>  	struct addrinfo *ai = NULL;
>  	char		*path;
> @@ -357,7 +370,8 @@ unexportfs(char *arg, int verbose)
>  
>  	if (!path || *path != '/') {
>  		xlog(L_ERROR, "Invalid unexporting option: %s", arg);
> -		return;
> +		export_errno = EINVAL;
> +		return rc;
>  	}
>  
>  	if ((htype = client_gettype(hname)) == MCL_FQDN) {
> @@ -397,9 +411,11 @@ unexportfs(char *arg, int verbose)
>  #endif
>  		exp->m_xtabent = 0;
>  		exp->m_mayexport = 0;
> +		rc = 1;
>  	}
>  
>  	freeaddrinfo(ai);
> +	return rc;
>  }
>  
>  static int can_test(void)
> @@ -728,6 +744,7 @@ error(nfs_export *exp, int err)
>  {
>  	xlog(L_ERROR, "%s:%s: %s", exp->m_client->m_hostname,
>  		exp->m_export.e_path, strerror(err));
> +	export_errno = (export_errno) ? export_errno : err;
>  }
>  
>  static void
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Steve Dickson Oct. 22, 2013, 8:36 a.m. UTC | #2
On 22/10/13 04:30, Steve Dickson wrote:
> 
> 
> On 02/10/13 19:29, Tony Asleson wrote:
>> To improve error handling when scripting exportfs it's useful
>> to have non-zero exit codes when the requested operation did not
>> succeed.
>>
>> This patch also returns a non-zero exit code if you request to
>> unexport a non-existant share.
>>
>> Signed-off-by: Tony Asleson <tasleson@redhat.com>
> Committed! 
Unfortunately I did not see Neil's patch before I committed this patch....
So I'm going to revert this patch in favor of Neil's... 

steved.

> 
> steved.
> 
>> ---
>>  support/export/hostname.c |  2 ++
>>  utils/exportfs/exportfs.c | 37 +++++++++++++++++++++++++++----------
>>  2 files changed, 29 insertions(+), 10 deletions(-)
>>
>> diff --git a/support/export/hostname.c b/support/export/hostname.c
>> index 3e949a1..e53d692 100644
>> --- a/support/export/hostname.c
>> +++ b/support/export/hostname.c
>> @@ -175,10 +175,12 @@ host_addrinfo(const char *hostname)
>>  	case 0:
>>  		return ai;
>>  	case EAI_SYSTEM:
>> +		export_errno = errno;
>>  		xlog(D_GENERAL, "%s: failed to resolve %s: (%d) %m",
>>  				__func__, hostname, errno);
>>  		break;
>>  	default:
>> +		export_errno = EINVAL;
>>  		xlog(D_GENERAL, "%s: failed to resolve %s: %s",
>>  				__func__, hostname, gai_strerror(error));
>>  		break;
>> diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
>> index 52fc03d..318deb3 100644
>> --- a/utils/exportfs/exportfs.c
>> +++ b/utils/exportfs/exportfs.c
>> @@ -35,8 +35,8 @@
>>  #include "xlog.h"
>>  
>>  static void	export_all(int verbose);
>> -static void	exportfs(char *arg, char *options, int verbose);
>> -static void	unexportfs(char *arg, int verbose);
>> +static int	exportfs(char *arg, char *options, int verbose);
>> +static int	unexportfs(char *arg, int verbose);
>>  static void	exports_update(int verbose);
>>  static void	dump(int verbose, int export_format);
>>  static void	error(nfs_export *exp, int err);
>> @@ -187,8 +187,12 @@ main(int argc, char **argv)
>>  		if (f_all)
>>  			export_all(f_verbose);
>>  		else
>> -			for (i = optind; i < argc ; i++)
>> -				exportfs(argv[i], options, f_verbose);
>> +			for (i = optind; i < argc ; i++) {
>> +				if(!exportfs(argv[i], options, f_verbose)) {
>> +					/* Only flag a generic EINVAL if no errno is set */
>> +					export_errno = (export_errno) ? export_errno : EINVAL;
>> +				}
>> +			}
>>  	}
>>  	/* If we are unexporting everything, then
>>  	 * don't care about what should be exported, as that
>> @@ -201,8 +205,12 @@ main(int argc, char **argv)
>>  		if (!f_reexport)
>>  			xtab_export_read();
>>  		if (!f_export)
>> -			for (i = optind ; i < argc ; i++)
>> -				unexportfs(argv[i], f_verbose);
>> +			for (i = optind ; i < argc ; i++) {
>> +				if (!unexportfs(argv[i], f_verbose)) {
>> +					/* Only flag a generic EINVAL if no errno is set */
>> +					export_errno = (export_errno) ? export_errno : EINVAL;
>> +				}
>> +			}
>>  		if (!new_cache)
>>  			rmtab_read();
>>  	}
>> @@ -296,9 +304,10 @@ export_all(int verbose)
>>  }
>>  
>>  
>> -static void
>> +static int
>>  exportfs(char *arg, char *options, int verbose)
>>  {
>> +	int rc = 0;
>>  	struct exportent *eep;
>>  	nfs_export	*exp = NULL;
>>  	struct addrinfo	*ai = NULL;
>> @@ -311,7 +320,8 @@ exportfs(char *arg, char *options, int verbose)
>>  
>>  	if (!path || *path != '/') {
>>  		xlog(L_ERROR, "Invalid exporting option: %s", arg);
>> -		return;
>> +		export_errno = EINVAL;
>> +		return rc;
>>  	}
>>  
>>  	if ((htype = client_gettype(hname)) == MCL_FQDN) {
>> @@ -339,13 +349,16 @@ exportfs(char *arg, char *options, int verbose)
>>  	exp->m_warned = 0;
>>  	validate_export(exp);
>>  
>> +	rc = 1;
>>  out:
>>  	freeaddrinfo(ai);
>> +	return rc;
>>  }
>>  
>> -static void
>> +static int
>>  unexportfs(char *arg, int verbose)
>>  {
>> +	int rc = 0;
>>  	nfs_export	*exp;
>>  	struct addrinfo *ai = NULL;
>>  	char		*path;
>> @@ -357,7 +370,8 @@ unexportfs(char *arg, int verbose)
>>  
>>  	if (!path || *path != '/') {
>>  		xlog(L_ERROR, "Invalid unexporting option: %s", arg);
>> -		return;
>> +		export_errno = EINVAL;
>> +		return rc;
>>  	}
>>  
>>  	if ((htype = client_gettype(hname)) == MCL_FQDN) {
>> @@ -397,9 +411,11 @@ unexportfs(char *arg, int verbose)
>>  #endif
>>  		exp->m_xtabent = 0;
>>  		exp->m_mayexport = 0;
>> +		rc = 1;
>>  	}
>>  
>>  	freeaddrinfo(ai);
>> +	return rc;
>>  }
>>  
>>  static int can_test(void)
>> @@ -728,6 +744,7 @@ error(nfs_export *exp, int err)
>>  {
>>  	xlog(L_ERROR, "%s:%s: %s", exp->m_client->m_hostname,
>>  		exp->m_export.e_path, strerror(err));
>> +	export_errno = (export_errno) ? export_errno : err;
>>  }
>>  
>>  static void
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
NeilBrown Oct. 28, 2013, 10:35 p.m. UTC | #3
On Tue, 22 Oct 2013 04:36:24 -0400 Steve Dickson <SteveD@redhat.com> wrote:

> 
> 
> On 22/10/13 04:30, Steve Dickson wrote:
> > 
> > 
> > On 02/10/13 19:29, Tony Asleson wrote:
> >> To improve error handling when scripting exportfs it's useful
> >> to have non-zero exit codes when the requested operation did not
> >> succeed.
> >>
> >> This patch also returns a non-zero exit code if you request to
> >> unexport a non-existant share.
> >>
> >> Signed-off-by: Tony Asleson <tasleson@redhat.com>
> > Committed! 
> Unfortunately I did not see Neil's patch before I committed this patch....
> So I'm going to revert this patch in favor of Neil's... 
> 
> steved.

Hi Steve,

it doesn't look like you achieved the result you were after.

commit 956aeff2e24304e938846f81f4b9db34cbf18a32
is Tony's original patch.
commit efe3c8d6cb4fc35909a64c0535087676a189fa5f
reverts it.

commit 232eb7ad09f9fd2ae4918699f850e4f8cadc2632
apples Tony's original patch again, but is credited
to me with my patch description.

So something is a bit messed up.
That is why my subsequent
       exportfs: report failure if asked to unexport something not exported.

didn't apply.

NeilBrown
Steve Dickson Nov. 4, 2013, 3:33 p.m. UTC | #4
On 28/10/13 18:35, NeilBrown wrote:
> On Tue, 22 Oct 2013 04:36:24 -0400 Steve Dickson <SteveD@redhat.com> wrote:
> 
>>
>>
>> On 22/10/13 04:30, Steve Dickson wrote:
>>>
>>>
>>> On 02/10/13 19:29, Tony Asleson wrote:
>>>> To improve error handling when scripting exportfs it's useful
>>>> to have non-zero exit codes when the requested operation did not
>>>> succeed.
>>>>
>>>> This patch also returns a non-zero exit code if you request to
>>>> unexport a non-existant share.
>>>>
>>>> Signed-off-by: Tony Asleson <tasleson@redhat.com>
>>> Committed! 
>> Unfortunately I did not see Neil's patch before I committed this patch....
>> So I'm going to revert this patch in favor of Neil's... 
>>
>> steved.
> 
> Hi Steve,
> 
> it doesn't look like you achieved the result you were after.
> 
> commit 956aeff2e24304e938846f81f4b9db34cbf18a32
> is Tony's original patch.
> commit efe3c8d6cb4fc35909a64c0535087676a189fa5f
> reverts it.
> 
> commit 232eb7ad09f9fd2ae4918699f850e4f8cadc2632
> apples Tony's original patch again, but is credited
> to me with my patch description.
> 
> So something is a bit messed up.
> That is why my subsequent
>        exportfs: report failure if asked to unexport something not exported.
> 
> didn't apply.
Yea... I had a tough week last week... Let me sort this out and do the right
thing... 

steved.

> 
> NeilBrown
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/support/export/hostname.c b/support/export/hostname.c
index 3e949a1..e53d692 100644
--- a/support/export/hostname.c
+++ b/support/export/hostname.c
@@ -175,10 +175,12 @@  host_addrinfo(const char *hostname)
 	case 0:
 		return ai;
 	case EAI_SYSTEM:
+		export_errno = errno;
 		xlog(D_GENERAL, "%s: failed to resolve %s: (%d) %m",
 				__func__, hostname, errno);
 		break;
 	default:
+		export_errno = EINVAL;
 		xlog(D_GENERAL, "%s: failed to resolve %s: %s",
 				__func__, hostname, gai_strerror(error));
 		break;
diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
index 52fc03d..318deb3 100644
--- a/utils/exportfs/exportfs.c
+++ b/utils/exportfs/exportfs.c
@@ -35,8 +35,8 @@ 
 #include "xlog.h"
 
 static void	export_all(int verbose);
-static void	exportfs(char *arg, char *options, int verbose);
-static void	unexportfs(char *arg, int verbose);
+static int	exportfs(char *arg, char *options, int verbose);
+static int	unexportfs(char *arg, int verbose);
 static void	exports_update(int verbose);
 static void	dump(int verbose, int export_format);
 static void	error(nfs_export *exp, int err);
@@ -187,8 +187,12 @@  main(int argc, char **argv)
 		if (f_all)
 			export_all(f_verbose);
 		else
-			for (i = optind; i < argc ; i++)
-				exportfs(argv[i], options, f_verbose);
+			for (i = optind; i < argc ; i++) {
+				if(!exportfs(argv[i], options, f_verbose)) {
+					/* Only flag a generic EINVAL if no errno is set */
+					export_errno = (export_errno) ? export_errno : EINVAL;
+				}
+			}
 	}
 	/* If we are unexporting everything, then
 	 * don't care about what should be exported, as that
@@ -201,8 +205,12 @@  main(int argc, char **argv)
 		if (!f_reexport)
 			xtab_export_read();
 		if (!f_export)
-			for (i = optind ; i < argc ; i++)
-				unexportfs(argv[i], f_verbose);
+			for (i = optind ; i < argc ; i++) {
+				if (!unexportfs(argv[i], f_verbose)) {
+					/* Only flag a generic EINVAL if no errno is set */
+					export_errno = (export_errno) ? export_errno : EINVAL;
+				}
+			}
 		if (!new_cache)
 			rmtab_read();
 	}
@@ -296,9 +304,10 @@  export_all(int verbose)
 }
 
 
-static void
+static int
 exportfs(char *arg, char *options, int verbose)
 {
+	int rc = 0;
 	struct exportent *eep;
 	nfs_export	*exp = NULL;
 	struct addrinfo	*ai = NULL;
@@ -311,7 +320,8 @@  exportfs(char *arg, char *options, int verbose)
 
 	if (!path || *path != '/') {
 		xlog(L_ERROR, "Invalid exporting option: %s", arg);
-		return;
+		export_errno = EINVAL;
+		return rc;
 	}
 
 	if ((htype = client_gettype(hname)) == MCL_FQDN) {
@@ -339,13 +349,16 @@  exportfs(char *arg, char *options, int verbose)
 	exp->m_warned = 0;
 	validate_export(exp);
 
+	rc = 1;
 out:
 	freeaddrinfo(ai);
+	return rc;
 }
 
-static void
+static int
 unexportfs(char *arg, int verbose)
 {
+	int rc = 0;
 	nfs_export	*exp;
 	struct addrinfo *ai = NULL;
 	char		*path;
@@ -357,7 +370,8 @@  unexportfs(char *arg, int verbose)
 
 	if (!path || *path != '/') {
 		xlog(L_ERROR, "Invalid unexporting option: %s", arg);
-		return;
+		export_errno = EINVAL;
+		return rc;
 	}
 
 	if ((htype = client_gettype(hname)) == MCL_FQDN) {
@@ -397,9 +411,11 @@  unexportfs(char *arg, int verbose)
 #endif
 		exp->m_xtabent = 0;
 		exp->m_mayexport = 0;
+		rc = 1;
 	}
 
 	freeaddrinfo(ai);
+	return rc;
 }
 
 static int can_test(void)
@@ -728,6 +744,7 @@  error(nfs_export *exp, int err)
 {
 	xlog(L_ERROR, "%s:%s: %s", exp->m_client->m_hostname,
 		exp->m_export.e_path, strerror(err));
+	export_errno = (export_errno) ? export_errno : err;
 }
 
 static void