[CRIU] [PATCH 3/2] libcriu: Ability to fetch arguments from notifications
Pavel Emelyanov
xemul at parallels.com
Thu Jun 26 04:11:04 PDT 2014
On 06/26/2014 03:07 PM, Andrew Vagin wrote:
> On Thu, Jun 26, 2014 at 02:06:44PM +0400, Pavel Emelyanov wrote:
>> After a bit more thinking I found a way to fetch arguments
>> from notifications -- pass opaque value into callback and
>> provide a set of calls for exploring one.
>>
>> With this we can
>>
>> a) provide more data if service supplies additional fields
>> in the future
>> b) not check the action name to decide whether or not the
>> requested argument is available
>>
>> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
>> ---
>> lib/criu.c | 11 ++++++++---
>> lib/criu.h | 15 ++++++++++++++-
>> 2 files changed, 22 insertions(+), 4 deletions(-)
>>
>> diff --git a/lib/criu.c b/lib/criu.c
>> index a827671..7653ff1 100644
>> --- a/lib/criu.c
>> +++ b/lib/criu.c
>> @@ -19,7 +19,7 @@ const char *criu_lib_version = CRIU_VERSION;
>>
>> static char *service_address = CR_DEFAULT_SERVICE_ADDRESS;
>> static CriuOpts *opts;
>> -static int (*notify)(char *action);
>> +static int (*notify)(char *action, criu_notify_arg_t na);
>> static int saved_errno;
>>
>> void criu_set_service_address(char *path)
>> @@ -47,13 +47,18 @@ int criu_init_opts(void)
>> return 0;
>> }
>>
>> -void criu_set_notify(int (*cb)(char *action))
>> +void criu_set_notify(int (*cb)(char *action, criu_notify_arg_t na))
>
> Could we change names on criu_set_callback? IMHO it sounds better.
IMHO no. It's unclear on what this callback is called back :)
I will add _cb suffix.
>> {
>> notify = cb;
>> opts->has_notify_scripts = true;
>> opts->notify_scripts = true;
>> }
>>
>> +int criu_notify_pid(criu_notify_arg_t na)
>
> criu_callback_pid
>
>> +{
>> + return na->has_pid ? na->pid : 0;
>> +}
>> +
>> void criu_set_pid(int pid)
>> {
>> opts->has_pid = true;
>> @@ -275,7 +280,7 @@ again:
>>
>> if ((*resp)->type == CRIU_REQ_TYPE__NOTIFY) {
>> if (notify)
>> - ret = notify((*resp)->notify->script);
>> + ret = notify((*resp)->notify->script, (*resp)->notify);
>>
>> ret = send_notify_ack(fd, ret);
>> if (!ret)
>> diff --git a/lib/criu.h b/lib/criu.h
>> index c994fd6..7950206 100644
>> --- a/lib/criu.h
>> +++ b/lib/criu.h
>> @@ -42,7 +42,20 @@ void criu_set_log_level(int log_level);
>> void criu_set_log_file(char *log_file);
>> void criu_set_cpu_cap(unsigned int cap);
>> int criu_set_exec_cmd(int argc, char *argv[]);
>> -void criu_set_notify(int (*cb)(char *action));
>> +
>> +/*
>> + * The criu_notify_arg_t na argument is an opaque
>> + * value that callbacks (cb-s) should pass into
>> + * criu_notify_xxx() calls to fetch arbitrary values
>> + * from notification. If the value is not available
>> + * some non-existing one is reported.
>> + */
>> +
>> +typedef struct _CriuNotify *criu_notify_arg_t;
>> +void criu_set_notify(int (*cb)(char *action, criu_notify_arg_t na));
>> +
>> +/* Get pid of root task. 0 if not available */
>> +int criu_notify_pid(criu_notify_arg_t na);
>>
>> /* Here is a table of return values and errno's of functions
>> * from the list down below.
>> --
>> 1.8.4.2
>>
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
> .
>
More information about the CRIU
mailing list