All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Barabash <alexander_barabash@mentor.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/1] Support abstract socket namespace in AF_UNIX socket family.
Date: Tue, 8 Jan 2013 12:55:13 +0200	[thread overview]
Message-ID: <50EBFB11.5060703@mentor.com> (raw)
In-Reply-To: <87sj6ddr2k.fsf@codemonkey.ws>

Hi,

On 01/07/2013 04:07 PM, Anthony Liguori wrote:
> Alexander Barabash <alexander_barabash@mentor.com> writes:
>
>> The abstract socket namespace is a nonportable Linux extension.
>> The sockets' names in this namespace have no connection
>> with file system pathnames. To specify a named AF_UNIX socket
>> in the abstract socket namespace, start the socket's path option
>> with a backslash followed by zero: \0.
>>
>> Signed-off-by: Alexander Barabash <alexander_barabash@mentor.com>
> Magic interpretation of path names is a bad thing in general.
>
> I think it would be better to add a flag 'abstract=on' which
> indicates to use the abstract namespace.  As an example:
>
> qemu -chardev foo,path=bar,abstract=on
>
> vs:
>
> qemu -chardev foo,path="\\\\0bar"
>
> I think the former is quite a bit more user friendly.
OK

>
> Regards,
>
> Anthony Liguori
Regards,
Alex
>
>> ---
>>   qemu-sockets.c |   58 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
>>   1 file changed, 55 insertions(+), 3 deletions(-)
>>
>> diff --git a/qemu-sockets.c b/qemu-sockets.c
>> index 3537bf3..70c8ad5 100644
>> --- a/qemu-sockets.c
>> +++ b/qemu-sockets.c
>> @@ -663,11 +663,50 @@ int inet_nonblocking_connect(const char *str,
>>   
>>   #ifndef _WIN32
>>   
>> +/*
>> + * The abstract socket namespace is a nonportable Linux extension.
>> + * The sockets' names in this namespace have no connection
>> + * with file system pathnames. To specify a named AF_UNIX socket
>> + * in the abstract socket namespace, start the socket's path option
>> + * with a backslash followed by zero: \0.
>> + */
>> +static
>> +char *get_abstract_namespace_path(const char *path, int *abstract_path_length)
>> +{
>> +    char *abstract_path;
>> +    char *inp;
>> +    char *outp;
>> +    char c;
>> +
>> +    *abstract_path_length = 0;
>> +    if ((path == NULL) || (path[0] != '\\') || (path[1] != '0')) {
>> +        return NULL;
>> +    }
>> +    abstract_path = g_strdup(path + 2);
>> +    for (inp = abstract_path, outp = abstract_path; (c = *inp); ++inp, ++outp) {
>> +        if (c == '\\') {
>> +            c = *++inp;
>> +            if (c == '\\') {
>> +                *outp = c;
>> +            } else if (c == '0') {
>> +                *outp = '\0';
>> +            }
>> +        } else {
>> +            *outp = c;
>> +        }
>> +    }
>> +    *abstract_path_length = outp - abstract_path;
>> +    return abstract_path;
>> +}
>> +
>>   int unix_listen_opts(QemuOpts *opts, Error **errp)
>>   {
>>       struct sockaddr_un un;
>>       const char *path = qemu_opt_get(opts, "path");
>> +    int abstract_path_length;
>> +    char *abstract_path;
>>       int sock, fd;
>> +    socklen_t addrlen = sizeof(un);
>>   
>>       sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
>>       if (sock < 0) {
>> @@ -675,9 +714,18 @@ int unix_listen_opts(QemuOpts *opts, Error **errp)
>>           return -1;
>>       }
>>   
>> +    abstract_path = get_abstract_namespace_path(path, &abstract_path_length);
>> +
>>       memset(&un, 0, sizeof(un));
>>       un.sun_family = AF_UNIX;
>> -    if (path && strlen(path)) {
>> +    if (abstract_path != NULL) {
>> +        if (abstract_path_length > sizeof(un.sun_path) - 1) {
>> +            abstract_path_length = sizeof(un.sun_path) - 1;
>> +        }
>> +        memcpy(un.sun_path + 1, abstract_path, abstract_path_length);
>> +        addrlen =
>> +            offsetof(struct sockaddr_un, sun_path) + 1 + abstract_path_length;
>> +    } else if (path && strlen(path)) {
>>           snprintf(un.sun_path, sizeof(un.sun_path), "%s", path);
>>       } else {
>>           char *tmpdir = getenv("TMPDIR");
>> @@ -694,8 +742,10 @@ int unix_listen_opts(QemuOpts *opts, Error **errp)
>>           qemu_opt_set(opts, "path", un.sun_path);
>>       }
>>   
>> -    unlink(un.sun_path);
>> -    if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) {
>> +    if (abstract_path == NULL) {
>> +        unlink(un.sun_path);
>> +    }
>> +    if (bind(sock, (struct sockaddr *) &un, addrlen) < 0) {
>>           error_set_errno(errp, errno, QERR_SOCKET_BIND_FAILED);
>>           goto err;
>>       }
>> @@ -704,10 +754,12 @@ int unix_listen_opts(QemuOpts *opts, Error **errp)
>>           goto err;
>>       }
>>   
>> +    g_free(abstract_path);
>>       return sock;
>>   
>>   err:
>>       closesocket(sock);
>> +    g_free(abstract_path);
>>       return -1;
>>   }
>>   
>> -- 
>> 1.7.9.5

  reply	other threads:[~2013-01-08 10:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-07 13:15 [Qemu-devel] [PATCH 1/1] Support abstract socket namespace in AF_UNIX socket family Alexander Barabash
2013-01-07 14:07 ` Anthony Liguori
2013-01-08 10:55   ` Alexander Barabash [this message]
2013-01-08 18:53   ` [Qemu-devel] [PATCH v2 1/1] chardev: " Alexander Barabash

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50EBFB11.5060703@mentor.com \
    --to=alexander_barabash@mentor.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.