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