GRASS GIS 8 Programmer's Manual 8.2.1(2023)-exported
make_mapset.c
Go to the documentation of this file.
1/*!
2 * \file lib/gis/make_mapset.c
3 *
4 * \brief GIS Library - Functions to create a new mapset within an
5 * existing location
6 *
7 * (C) 2006-2013 by the GRASS Development Team
8 *
9 * This program is free software under the GNU General Public License
10 * (>=v2). Read the file COPYING that comes with GRASS for details.
11 *
12 * \author Joel Pitt, joel.pitt@gmail.com
13 */
14
15#include <stdlib.h>
16#include <string.h>
17#include <unistd.h>
18#include <sys/stat.h>
19
20#include <grass/gis.h>
21#include <grass/glocale.h>
22
23/*!
24 * \brief Create a new mapset
25 *
26 * This function creates a new mapset in the given location,
27 * initializes default window and the current window.
28 *
29 * Calls G_fatal_error() if location doesn't exist.
30 *
31 * \param gisdbase_name full path of GISDBASE to create mapset in
32 * (NULL for the current GISDBASE)
33 * \param location_name name of location to create mapset in
34 * (NULL for the current location)
35 * \param mapset_name Name of the new mapset. Should not include
36 * the full path, the mapset will be created within
37 * the specified database and location.
38 *
39 * \return 0 on success
40 * \return -1 to indicate a system error (check errno).
41 * \return -2 illegal name
42 */
43int G_make_mapset(const char *gisdbase_name, const char *location_name,
44 const char *mapset_name)
45{
46 char path[GPATH_MAX];
47 struct Cell_head default_window;
48
49 /* Get location */
50 if (location_name == NULL)
51 location_name = G_location();
52
53 /* Get GISDBASE */
54 if (gisdbase_name == NULL)
55 gisdbase_name = G_gisdbase();
56
57 /* TODO: Should probably check that user specified location and gisdbase are valid */
58
59 /* check if mapset name is legal */
60 if (G_legal_filename(mapset_name) != 1)
61 return -2;
62
63 /* Check if location exists */
64 sprintf(path, "%s/%s", gisdbase_name, location_name);
65 if (access(path, F_OK ) == -1)
66 G_fatal_error(_("Location <%s> doesn't exist"), location_name);
67
68 /* Make the mapset */
69 sprintf(path, "%s/%s/%s", gisdbase_name, location_name, mapset_name);
70 if (G_mkdir(path) != 0) {
71 perror("G_make_mapset");
72 return -1;
73 }
75
76 /* Get PERMANENT default window */
77 G_setenv_nogisrc("GISDBASE", gisdbase_name);
78 G_setenv_nogisrc("LOCATION_NAME", location_name);
79 G_setenv_nogisrc("MAPSET", "PERMANENT");
80 G_get_default_window(&default_window);
81
82 /* Change to the new mapset */
83 G_setenv_nogisrc("MAPSET", mapset_name);
84
85 /* Copy default window/regions to new mapset */
86 G_put_element_window(&default_window, "", "WIND");
87
88 /* And switch back to original environment */
90
91 return 0;
92}
93
#define NULL
Definition: ccmath.h:32
void G_switch_env(void)
Switch environments.
Definition: env.c:582
void G_setenv_nogisrc(const char *name, const char *value)
Set environment name to value (doesn't update .gisrc)
Definition: env.c:465
void G_create_alt_env(void)
Set up alternative environment variables.
Definition: env.c:561
void G_get_default_window(struct Cell_head *window)
Get the default region.
Definition: get_window.c:93
void G_fatal_error(const char *msg,...)
Print a fatal error message to stderr.
Definition: gis/error.c:160
const char * G_gisdbase(void)
Get name of top level database directory.
Definition: gisdbase.c:26
int G_legal_filename(const char *s)
Check for legal database file name.
Definition: legal_name.c:34
const char * G_location(void)
Get current location name.
Definition: location.c:32
int G_make_mapset(const char *gisdbase_name, const char *location_name, const char *mapset_name)
Create a new mapset.
Definition: make_mapset.c:43
int G_mkdir(const char *path)
Creates a new directory.
Definition: paths.c:27
int G_put_element_window(const struct Cell_head *window, const char *dir, const char *name)
Write the region.
Definition: put_window.c:74
Definition: path.h:16