void check_extension( char *package, char *name, int *major, int *minor, int *revision ) { int error; char tmp[2048]; FILE *f; *(int*)&tmp[0] = 0; memset( &tmp[4], 0, 2044 ); fwrite( "Checking extension ...", 1, 22, stdout ); strcpy( tmp, package ); error = chdir( tmp ); if ( error < 0 ) { print_error( -2, "extension '%s' not accessible: %s\n", package, strerror( *(int*)(__errno_location( )) ) ); } f = (FILE*)fopen( "id", "r" ); if ( f == 0 ) print_error( -6, "'id' file not readable.\n" ); else { __isoc99_fscanf( f, "%[<GRASS extension package>] ", &tmp ); if ( strcmp( "<GRASS extension package>", tmp ) ) { fclose( f ); print_error( -6, "unknown file identifier.\n" ); } } fclose( f ); get_package_name( ".", name ); f = (FILE*)fopen( "version", "r" ); if ( f == 0 ) print_error( -6, "'version' file not readable.\n" ); else { nc_fgets_nb( tmp, 2048, f ); minor[0] = 0; revision[0] = 0; error = __isoc99_sscanf( tmp, "%i.%i.%i", major, minor, revision ); if ( error <= 0 ) { fclose( f ); print_error( -6, "invalid or missing version information.\n" ); } } print_done( ); chdir( ".." ); fclose( f ); return; }
int restore_entries_gisman( char *gisbase ) { int eax; char str[2048]; char menu[2048]; char file[2048]; char dir[2048]; char pkg_short_name[2048]; int len; char **line; int n_entries, n_lines, i; int line_no; FILE *f_gisman, *f_in, *f_out; DIR *dirp; struct dirent *ep; int num_restored; int n_files; sprintf( file, "%s/etc/dm/menu.tcl", gisbase ); f_in = (FILE*)fopen( file, "r" ); if ( f_in == 0 ) { if ( *(int*)(__errno_location( )) == 2 ) { return num_restored; } else { fclose( f_in ); print_error( -21, "checking for file '%s': %s\n", file[0], strerror( *(int*)(__errno_location( )) ) ); } } memcpy( TMP_GISMAN, "/tmp/grass.extensions.db.XXXXXX", 32 ); mkstemp( TMP_GISMAN ); f_out = (FILE*)fopen( TMP_GISMAN, "w+" ); if ( f_out == 0 ) { print_error( -21, "could not create temp file '%s': %s\n \t\t\tMake sure that directory /tmp exists on your system and you have write permission.\n", TMP_GISMAN[0], strerror( *(int*)(__errno_location( )) ) ); } atexit( &exit_db ); if ( VERBOSE ) sprintf( str, "cp -vf %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak ; \t\t\t\t\t\tcp -vf %s %s/etc/dm/menu.tcl ; chmod -v a+r %s/etc/dm/menu.tcl ;", gisbase, gisbase, TMP_GISMAN, gisbase, gisbase ); else sprintf( str, "cp -f %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak &> %s ; \t\t\t\t\t\tcp -f %s %s/etc/dm/menu.tcl &> %s ; chmod a+r %s/etc/dm/menu.tcl &> %s ;", gisbase, gisbase, TMP_NULL, TMP_GISMAN, gisbase, TMP_NULL, gisbase, TMP_NULL ); strcpy( GISMAN_CMD, str ); sprintf( dir, "%s/etc/dm/gem-entries", gisbase ); dirp = opendir( dir ); if ( dirp == 0 ) { } else { n_entries = 0; n_files = 0; while ( ep == 0 ) { sprintf( file, "%s/%s", dir, &ep->d_name[0] ); f_gisman = (FILE*)fopen( file, "r" ); if ( strcmp( &ep->d_name[0], "." ) == 0 || strcmp( &ep->d_name[0], ".." ) == 0 ) { fclose( f_gisman ); } else { if ( f_gisman == 0 ) { fclose( f_gisman ); } else { while ( fgets( str, 2048, f_gisman ) == 0 ) { n_entries++; } n_files++; fclose( f_gisman ); } } } closedir( &dirp ); n_lines = 0; for ( ; fgets( str, 2048, f_in ); n_lines++ ) { // n_lines++; } if ( n_lines == 0 ) { } else { rewind( f_in ); line = calloc( n_lines + ( n_entries * 2 ) + ( n_files * 5 ) + 1, sizeof( char* ) ); i = 0; for ( ; i < n_lines + ( n_entries * 2 ) + ( n_files * 5 ) + 1; i++ ) { line[ i ] = 0; // i++; } i = 0; for ( ; fgets( str, 2048, f_in ); i++ ) { line[ i ] = malloc( ( strlen( str ) + 1 ) * sizeof( char ) ); strcpy( line[ i ], str ); // i++; } line[ i ] = 0; check_ext_menu( line ); dirp = opendir( dir ); num_restored = 0; while ( ep == 0 ) { sprintf( file, "%s/%s", dir, &ep->d_name[0] ); if ( strcmp( &ep->d_name[0], "." ) ) { if ( strcmp( &ep->d_name[0], ".." ) == 0 ) { } else { f_gisman = (FILE*)fopen( file, "r" ); if ( f_gisman ) { i = 1; while ( nc_fgets_nb( str, 2048, f_gisman ) == 0 ) { if ( i == 1 ) { len = strrchr( str, ']' ) - strchr( str, '[' ); strncpy( menu, strchr( str, '[' ) + 1, len ); menu[ len + -1 ] = 0; line_no = new_submenu( pkg_short_name, str, line ); if ( line_no < 0 ) { break; } else { i++; num_restored++; } } else { line_no = new_item( str, menu, line, line_no ); if ( line_no < 0 ) break; else { i++; num_restored++; } } } fclose( f_gisman ); } } } else { } } closedir( &dirp ); i = 0; for ( ; line[ i ]; i++ ) { fprintf( f_out, line[ i ] ); // i++; } fflush( f_out ); fclose( f_in ); fclose( f_out ); i = 0; for ( ; i < n_lines + ( n_entries * 2 ) + ( n_files * 5 ) + 1; i++ ) { free( line[ i ] ); // i++; } free( line ); } } }
void register_entries_gisman( char *pkg_short_name, char *gisbase ) { char file[2048]; char str[2048]; char menu[2048]; int len; char **line; int n_entries, n_lines, i; int n_lines_org, n_lines_new; int line_no; FILE *f_gisman, *f_in, *f_out; memcpy( file, "../entries-gisman", 18 ); f_gisman = (FILE*)fopen( file, "r" ); if ( f_gisman == 0 ) { if ( *(int*)(__errno_location( )) == 2 ) { return; } else { fclose( f_gisman ); print_error( -21, "checking for file '%s': %s\n", file[0], strerror( *(int*)(__errno_location( )) ) ); } } sprintf( file, "%s/etc/dm/menu.tcl", gisbase ); f_in = (FILE*)fopen( file, "r" ); if ( f_in == 0 ) { if ( *(int*)(__errno_location( )) == 2 ) { } else { fclose( f_in ); print_error( -21, "checking for file '%s': %s\n", file[0], strerror( *(int*)(__errno_location( )) ) ); } } memcpy( TMP_GISMAN, "/tmp/grass.extensions.db.XXXXXX", 32 ); mkstemp( TMP_GISMAN ); f_out = (FILE*)fopen( TMP_GISMAN, "w+" ); if ( f_out == 0 ) { print_error( -21, "could not create temp file '%s': %s\n \t\t\tMake sure that directory /tmp exists on your system and you have write permission.\n", TMP_GISMAN[0], strerror( *(int*)(__errno_location( )) ) ); } atexit( &exit_db ); if ( VERBOSE ) sprintf( str, "mkdir --verbose %s/etc/dm/gem-entries ; cp -vf ../entries-gisman %s/etc/dm/gem-entries/%s ; \t\t\t\t\tcp -vf %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak ; \t\t\t\t\tcp -vf %s %s/etc/dm/menu.tcl ; chmod -v a+r %s/etc/dm/menu.tcl ;", gisbase, gisbase, pkg_short_name, gisbase, gisbase, TMP_GISMAN, gisbase, gisbase ); else sprintf( str, "mkdir %s/etc/dm/gem-entries &> %s ; cp -f ../entries-gisman %s/etc/dm/gem-entries/%s &> %s ; \t\t\t\t\tcp -f %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak &> %s ; \t\t\t\t\tcp -f %s %s/etc/dm/menu.tcl &> %s ; chmod a+r %s/etc/dm/menu.tcl &> %s ;", gisbase, TMP_NULL, gisbase, pkg_short_name, TMP_NULL, gisbase, gisbase, TMP_NULL, TMP_GISMAN, gisbase, TMP_NULL, gisbase, TMP_NULL ); strcpy( GISMAN_CMD, str ); n_entries = 0; for ( ; fgets( str, 2048, f_gisman ); n_entries++ ) { // n_entries++; } if ( n_entries == 0 ) { } else { rewind( f_gisman ); n_lines = 0; for ( ; fgets( str, 2048, f_in ); n_lines++ ) { // n_lines++; } if ( n_lines == 0 ) { return; } n_lines_org = n_lines; rewind( f_in ); line = calloc( n_lines + ( n_entries * 2 ) + 6, sizeof( char* ) ); i = 0; for ( ; i < n_lines + ( n_entries * 2 ) + 6; i++ ) { line[ i ] = 0; // i++; } i = 0; for ( ; fgets( str, 2048, f_in ); i++ ) { line[ i ] = malloc( ( strlen( str ) + 1 ) * sizeof( char ) ); strcpy( line[ i ], str ); // i++; } check_ext_menu( line ); i = 1; while ( nc_fgets_nb( str, 2048, f_gisman ) == 0 ) { if ( i == 1 ) { len = strrchr( str, ']' ) - strchr( str, '[' ); strncpy( menu, strchr( str, '[' ) + 1, len ); menu[ len + -1 ] = 0; line_no = new_submenu( pkg_short_name, str, line ); if ( line_no < 0 ) { print_warning( "no GIS Manager menu entries created.\n" ); break; } else { i++; } } else { line_no = new_item( str, menu, line, line_no ); if ( line_no < 0 ) { print_warning( "error creating GIS Manager menu entries.\n" ); break; } else { i++; } } } i = 0; for ( ; line[ i ]; i++ ) { fprintf( f_out, line[ i ] ); // i++; } fflush( f_out ); rewind( f_out ); n_lines_new = 0; for ( ; fgets( str, 2048, f_out ); n_lines_new++ ) { // n_lines_new++; } if ( n_lines_new == 0 || n_lines_new < n_lines_org ) { print_warning( "file truncation detected. Retaining orginal file 'menu.tcl'.\n" ); memcpy( GISMAN_CMD, "", 1 ); } fclose( f_in ); fclose( f_gisman ); fclose( f_out ); i = 0; for ( ; i < n_lines + ( n_entries * 2 ) + 6; i++ ) { free( line[ i ] ); // i++; } free( line ); } }