1 /* GNU Mailutils -- a suite of utilities for electronic mail
2 Copyright (C) 2010-2021 Free Software Foundation, Inc.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 3 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General
15 Public License along with this library. If not, see
16 <http://www.gnu.org/licenses/>. */
17
18 #ifdef HAVE_CONFIG_H
19 # include <config.h>
20 #endif
21
22 #include <errno.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #ifdef HAVE_STRINGS_H
26 # include <strings.h>
27 #endif
28
29 #include <mailutils/types.h>
30 #include <mailutils/errno.h>
31 #include <mailutils/sys/url.h>
32
33 int
mu_url_uplevel(mu_url_t url,mu_url_t * upurl)34 mu_url_uplevel (mu_url_t url, mu_url_t *upurl)
35 {
36 int rc;
37 char *p;
38 mu_url_t new_url;
39
40 if (url->_uplevel)
41 return url->_uplevel (url, upurl);
42
43 if (!url->path)
44 return MU_ERR_NOENT;
45 p = strrchr (url->path, '/');
46
47 rc = mu_url_dup (url, &new_url);
48 if (rc == 0)
49 {
50 if (!p || p == url->path)
51 {
52 free (new_url->path);
53 new_url->path = NULL;
54 }
55 else
56 {
57 size_t size = p - url->path;
58 new_url->path = realloc (new_url->path, size + 1);
59 if (!new_url->path)
60 {
61 mu_url_destroy (&new_url);
62 return ENOMEM;
63 }
64 memcpy (new_url->path, url->path, size);
65 new_url->path[size] = 0;
66 }
67 *upurl = new_url;
68 }
69 return rc;
70 }
71
72