X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fglocalvfs.c;h=00fec8e2ba0fec47b82072c9d21900128a9f84c7;hb=HEAD;hp=f2eaea2c71b1e5d3a4e7a1dc60899a2a069f8a0d;hpb=d85b722734a6fcfe94032f6113de9e5c190fd7c3;p=platform%2Fupstream%2Fglib.git diff --git a/gio/glocalvfs.c b/gio/glocalvfs.c index f2eaea2..00fec8e 100644 --- a/gio/glocalvfs.c +++ b/gio/glocalvfs.c @@ -2,10 +2,12 @@ * * Copyright (C) 2006-2007 Red Hat, Inc. * + * SPDX-License-Identifier: LGPL-2.1-or-later + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,9 +15,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: Alexander Larsson */ @@ -28,7 +28,8 @@ #include "gvfs.h" #include #include -#ifdef HAVE_PWD_H +#ifdef G_OS_UNIX +#include "glib-unix.h" #include #endif #include @@ -81,7 +82,10 @@ static GFile * g_local_vfs_get_file_for_path (GVfs *vfs, const char *path) { - return _g_local_file_new (path); + if (*path == '\0') + return _g_dummy_file_new (path); + else + return _g_local_file_new (path); } static GFile * @@ -90,14 +94,24 @@ g_local_vfs_get_file_for_uri (GVfs *vfs, { char *path; GFile *file; - char *stripped_uri, *hash; - + char *stripped_uri, *hash, *question_mark; + + /* As per https://url.spec.whatwg.org/#file-state, file: URIs can contain + * query and fragment sections. We ignore them in order to get only the file + * path. Compliance to this part of the WhatWG spec doesn’t necessarily mean + * we comply with the entire spec. */ if (strchr (uri, '#') != NULL) { stripped_uri = g_strdup (uri); hash = strchr (stripped_uri, '#'); *hash = 0; } + else if (strchr (uri, '?') != NULL) + { + stripped_uri = g_strdup (uri); + question_mark = strchr (stripped_uri, '?'); + *question_mark = 0; + } else stripped_uri = (char *)uri; @@ -131,7 +145,7 @@ g_local_vfs_parse_name (GVfs *vfs, GFile *file; char *filename; char *user_prefix; - const char *user_start, *user_end; + const char *user_end; char *rest; g_return_val_if_fail (G_IS_VFS (vfs), NULL); @@ -143,33 +157,40 @@ g_local_vfs_parse_name (GVfs *vfs, { if (*parse_name == '~') { +#ifdef G_OS_UNIX + const char *user_start; + user_start = parse_name + 1; +#endif parse_name ++; - user_start = parse_name; while (*parse_name != 0 && *parse_name != '/') parse_name++; user_end = parse_name; +#ifdef G_OS_UNIX if (user_end == user_start) user_prefix = g_strdup (g_get_home_dir ()); else { -#ifdef HAVE_PWD_H struct passwd *passwd_file_entry; char *user_name; - user_name = g_strndup (user_start, user_end - user_start); - passwd_file_entry = getpwnam (user_name); - g_free (user_name); - - if (passwd_file_entry != NULL && - passwd_file_entry->pw_dir != NULL) - user_prefix = g_strdup (passwd_file_entry->pw_dir); - else -#endif - user_prefix = g_strdup (g_get_home_dir ()); + user_name = g_strndup (user_start, user_end - user_start); + passwd_file_entry = g_unix_get_passwd_entry (user_name, NULL); + g_free (user_name); + + if (passwd_file_entry != NULL && + passwd_file_entry->pw_dir != NULL) + user_prefix = g_strdup (passwd_file_entry->pw_dir); + else + user_prefix = g_strdup (g_get_home_dir ()); + + g_free (passwd_file_entry); } +#else + user_prefix = g_strdup (g_get_home_dir ()); +#endif rest = NULL; if (*user_end != 0)