/* setup: Program for GRASS user to first use. Sets environment * variables: LOCATION_NAME MAPSET GISDBASE */ /* these defines come from the Gmakefile, but are defined here to allow * debugging with saber */ #ifndef D_LOCATION_NAME #define D_LOCATION_NAME "spearfish" #endif #ifndef D_GISDBASE #define D_GISDBASE "/data" #endif #ifndef GRASS_VERSION_NUMBER #define GRASS_VERSION_NUMBER "" #endif static char *intro[] = { " PLEASE SET SESSION INFORMATION", "", "DATABASE: A directory (folder) on disk to contain all GRASS maps and data.", "", "LOCATION: This is the name of a geographic location. It is defined by a", " co-ordinate system and a rectangular boundary.", "", "MAPSET: Each GRASS session runs under a particular MAPSET. This consists of", " a rectangular REGION and a set of maps. Every LOCATION contains at", " least a MAPSET called PERMANENT, which is readable by all sessions.", "", " The REGION defaults to the entire area of the chosen LOCATION.", " You may change it later with the command: g.region", "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ", 0}; static char *loc_text= "LOCATION: (enter list for a list of locations)"; static char *map_text= "MAPSET: (or mapsets within a location)"; #include #include #include #include #include #include #include #include #include "local_proto.h" int main (int argc, char *argv[]) { char version[80]; char gisdbase[70]; char location_name[41] ; char location[1024] ; char mapset[41] ; int line; int yes; struct Cell_head window; char *GISDBASE; char *LOCATION_NAME; char *MAPSET; int repeat ; /* GISBASE * comes from the unix environment and must be set * make sure it is NOT in the .gisrc file * note: G_getenv() make a special case of this variable */ G_no_gisinit(); umask(0); G_unsetenv ("GISBASE"); /* this cleans the variable */ G_getenv ("GISBASE") ; /* this reads it from the unix environment */ /* Gather all existing variables **********************************************/ GISDBASE = G__getenv("GISDBASE") ; LOCATION_NAME = G__getenv("LOCATION_NAME") ; MAPSET = G__getenv("MAPSET") ; if (!MAPSET) MAPSET = G_whoami() ; if (!LOCATION_NAME) LOCATION_NAME = D_LOCATION_NAME ; if (!GISDBASE) GISDBASE = D_GISDBASE ; strcpy (mapset, MAPSET); strcpy (location_name, LOCATION_NAME); strcpy (gisdbase, GISDBASE); G__setenv ("GISDBASE", gisdbase) ; sprintf (version, " GRASS %s", GRASS_VERSION_NUMBER); for (repeat = 1; repeat ; hit_return()) { V_clear() ; V_line (0, version); for (line = 1; intro[line]; line++) V_line (line, intro[line]); line++; V_line (line, loc_text); V_ques (location_name, 's', line++, 12, 25); V_line (line, map_text); V_ques (mapset, 's', line++, 12, 25); line++; V_line (line, "DATABASE:"); V_ques (gisdbase, 's', line++, 10, sizeof(gisdbase) - 1); V_intrpt_ok(); if (!V_call()) exit(1) ; G_strip (gisdbase); if (*gisdbase == 0) { fprintf (stderr, "No DATABASE specified\n"); strcpy (gisdbase, D_GISDBASE); continue; } if (*gisdbase != '/') { char temp[200]; fprintf (stderr, "DATABASE <%s> - must start with /\n", gisdbase); sprintf (temp, " '%s'", gisdbase); strcpy (gisdbase, temp); continue; } if (access (gisdbase,0) != 0) { fprintf (stderr, "DATABASE <%s> - not found\n", gisdbase); continue; } G__setenv ("GISDBASE", gisdbase) ; /* take only first word of responses */ first_word (location_name); first_word (mapset); if (*location_name && (G_legal_filename(location_name) < 0)) { fprintf (stderr, "LOCATION <%s> - illegal name\n", location_name); continue; } if (*mapset && (G_legal_filename(mapset) < 0)) { fprintf (stderr, "MAPSET <%s> - illegal name\n", mapset); continue; } if (*location_name == 0 || strcmp (location_name, "list") == 0) { list_locations (gisdbase); *location_name = 0; continue; } sprintf (location,"%s/%s",gisdbase,location_name); if (access (location,0) != 0) { fprintf (stderr, "LOCATION <%s> - doesn't exist\n", location_name); list_locations (gisdbase); if (!can_make_location (gisdbase, location_name)) continue; fprintf (stderr, "\nWould you like to create location <%s> ? ", location_name); if (G_yes("", 1)) { if(make_location (gisdbase, location_name)) { G__setenv ("LOCATION_NAME", location_name); G__setenv ("MAPSET", "PERMANENT"); G__write_env(); if (system("g.setproj")) { G_get_default_window (&window); if(E_edit_cellhd(&window, -1) < 0) fprintf(stderr, "WARNING: You did not provide default region for %s!\n", location_name); G__put_window (&window, "", "DEFAULT_WIND"); G__put_window (&window, "", "WIND"); fprintf (stderr, "LOCATION <%s> created\n", location_name); fprintf (stderr, "\nBut the PROJECTION information files were not created!\n"); fprintf (stderr, "You must run g.setproj successfully before projection software will work%c%c%c\n", 7,7,7); continue; } else { G_get_default_window (&window); if(E_edit_cellhd(&window, -1) < 0) fprintf(stderr, "WARNING: You did not provide default region for %s!\n", location_name); G__put_window (&window, "", "DEFAULT_WIND"); G__put_window (&window, "", "WIND"); fprintf (stderr, "LOCATION <%s> created!\n", location_name); continue; } } fprintf (stderr, "LOCATION <%s> NOT created\n", location_name); } continue; } G__setenv ("LOCATION_NAME", location_name); if (*mapset == 0 || strcmp (mapset, "list") == 0) { list_mapsets (location_name, location); *mapset = 0; continue; } G__setenv ("MAPSET", mapset) ; repeat = 0 ; switch (mapset_permissions(mapset) ) { case -1: if(strcmp(mapset, G_whoami()) == 0) { yes = 1; } else { repeat = 1 ; fprintf(stderr, "\n\nMapset <<%s>> is not available\n", mapset) ; list_mapsets (location_name, location); fprintf(stderr, "\nWould you like to create < %s > as a new mapset? ", mapset ) ; yes = G_yes("", 1); } if (yes && (make_mapset(location, mapset) == 0)) repeat = 0 ; break ; case 0: fprintf(stderr, "\n\nSorry, no access to <<%s>>.\n", mapset) ; list_mapsets (location_name, location); repeat = 1 ; break ; case 1: mapset_message(mapset); if (!mapset_question(mapset)) repeat = 1; break ; } if (!repeat) break; } G__write_env() ; exit(0); } int list_locations (char *gisdbase) { char buf[1024]; fprintf(stderr, "\nAvailable locations:\n") ; fprintf(stderr, "----------------------\n") ; sprintf(buf, "ls -C '%s'", gisdbase) ; system(buf) ; fprintf(stderr, "----------------------\n") ; return 0; } int list_mapsets (char *location_name, char *location) { char buf[1024]; FILE *fd, *popen(); int any, ok, any_ok; int len, tot_len; sprintf (buf, "ls '%s'", location); fprintf (stderr, "\nMapsets in location <%s>\n", location_name); fprintf (stderr, "----------------------\n") ; fd = popen (buf, "r"); any = 0; any_ok = 0; tot_len = 0; if (fd) { while (fscanf (fd, "%s", buf) == 1) { any = 1; len = strlen (buf)+1; len /= 20; len = (len+1)*20; tot_len += len; if (tot_len > 75) { fprintf (stderr, "\n"); tot_len = len; } if(ok = (mapset_permissions(buf) == 1)) any_ok = 1; fprintf (stderr, "%s%-*s", ok?"(+)":" ", len, buf); } pclose (fd); if (tot_len) fprintf (stderr, "\n"); if (any_ok) fprintf (stderr, "\nnote: you only have access to mapsets marked with (+)\n"); else if (any) fprintf (stderr, "\nnote: you do not have access to any of these mapsets\n"); } fprintf(stderr, "----------------------\n") ; return 0; } int first_word (char *buf) { char temp[80]; *temp = 0; sscanf (buf, "%s", temp); strcpy (buf, temp); return 0; } int hit_return (void) { char buf[80]; fprintf (stderr, "\nHit RETURN -->"); G_gets(buf); return 0; }