tools/livepatch: Exit with 2 if a timeout occurs

Exit with 0 for success.
Exit with 1 for an error.
Exit with 2 if the operation should be retried for any reason (e.g. a
timeout or because another operation was in progress).

This allows a program or script driving xen-livepatch to determine if
the operation should be retried without parsing the output.

Acked-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
This commit is contained in:
Ross Lagerwall authored and Konrad Rzeszutek Wilk committed 2016-12-14 15:27:19 -05:00
1 parent 0265fd753b
commit ca01e58212
1 file changed
+30 -7
+30 -7
View File
@@ -15,6 +15,7 @@
#include <xenstore.h>
#include <xen/errno.h>
#include <xen-tools/libs.h>
static xc_interface *xch;
@@ -309,17 +310,18 @@ int action_func(int argc, char *argv[], unsigned int idx)
rc = xc_livepatch_get(xch, name, &status);
if ( rc )
{
int saved_errno = errno;
fprintf(stderr, "Failed to get status of %s.\n"
"Error %d: %s\n",
name, errno, strerror(errno));
return -1;
name, saved_errno, strerror(saved_errno));
return saved_errno;
}
if ( status.rc == -XEN_EAGAIN )
{
fprintf(stderr,
"Cannot execute %s.\n"
"Operation already in progress.\n", action_options[idx].name);
return -1;
return EAGAIN;
}
if ( status.state == action_options[idx].expected )
@@ -339,7 +341,7 @@ int action_func(int argc, char *argv[], unsigned int idx)
printf("failed\n");
fprintf(stderr, "Error %d: %s\n",
saved_errno, strerror(saved_errno));
return -1;
return saved_errno;
}
}
else
@@ -364,7 +366,7 @@ int action_func(int argc, char *argv[], unsigned int idx)
{
printf("failed\n");
fprintf(stderr, "Operation didn't complete.\n");
return -1;
return EAGAIN;
}
if ( rc == 0 )
@@ -376,7 +378,7 @@ int action_func(int argc, char *argv[], unsigned int idx)
{
printf("failed\n");
fprintf(stderr, "Error %d: %s\n", -rc, strerror(-rc));
return -1;
return -rc;
}
else
{
@@ -488,7 +490,28 @@ int main(int argc, char *argv[])
xc_interface_close(xch);
return !!ret;
/*
* Exitcode 0 for success.
* Exitcode 1 for an error.
* Exitcode 2 if the operation should be retried for any reason (e.g. a
* timeout or because another operation was in progress).
*/
#define EXIT_TIMEOUT (EXIT_FAILURE + 1)
BUILD_BUG_ON(EXIT_SUCCESS != 0);
BUILD_BUG_ON(EXIT_FAILURE != 1);
BUILD_BUG_ON(EXIT_TIMEOUT != 2);
switch ( ret )
{
case 0:
return EXIT_SUCCESS;
case EAGAIN:
case EBUSY:
return EXIT_TIMEOUT;
default:
return EXIT_FAILURE;
}
}
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.