Пример #1
0
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, "%[&lt;GRASS extension package&gt;] ", &tmp );
    if ( strcmp( "&lt;GRASS extension package&gt;", 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;
}
Пример #2
0
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 &&gt; %s ; \t\t\t\t\t\tcp -f %s %s/etc/dm/menu.tcl &&gt; %s ; chmod a+r %s/etc/dm/menu.tcl &&gt; %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 );
    }
  }
}
Пример #3
0
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 &&gt; %s ; cp -f ../entries-gisman %s/etc/dm/gem-entries/%s &&gt; %s ; \t\t\t\t\tcp -f %s/etc/dm/menu.tcl %s/etc/dm/menu.tcl.gem.bak &&gt; %s ; \t\t\t\t\tcp -f %s %s/etc/dm/menu.tcl &&gt; %s ; chmod a+r %s/etc/dm/menu.tcl &&gt; %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 );
  }
}