Beispiel #1
0
bool ConfigXml::writeConfigFile(const QString fileName)
{
    QXmlStreamWriter writer;
    QFile configFile(fileName);

    if (!configFile.open(QFile::Truncate | QFile::WriteOnly | QFile::Text)) {
        qDebug() << "Error: Cannot write file " << qPrintable(fileName) <<
                    ": " << qPrintable(configFile.errorString());
        return false;
    }

    writer.setDevice(&configFile);
    writer.setAutoFormatting(true);
    writer.writeStartDocument();
    writer.writeStartElement("config");

    writeEntries(&writer);

    writer.writeEndDocument();
    configFile.close();
    if (configFile.error()) {
        qDebug() << "Error: Cannot write file " << qPrintable(fileName) <<
                    ": " << qPrintable(configFile.errorString());
        return false;
    }
    return true;
}
Beispiel #2
0
void KConfigRawBackEnd::sync(bool bMerge)
{
  // write-sync is only necessary if there are dirty entries
  if ( !pConfig->isDirty() || pConfig->isReadOnly() ) return;

  _file.reset();
  KEntryMap aTempMap;
  getEntryMap(aTempMap, false, bMerge ? &_file : 0);

  if ( _stream==0 ) {
      _stream = fdopen(_fd, "w");
      if ( _stream==0 ) return;
  }
  ftruncate(_fd, 0);
  writeEntries(_stream, aTempMap);
  fflush(_stream);
}
Beispiel #3
0
void Foam::TableBase<Type>::writeData(Ostream& os) const
{
    os  << nl << indent << table_ << token::END_STATEMENT << nl;
    writeEntries(os);
}
/* antlarr: KDE 4.0:  make the first parameter "const QString &" */
bool KConfigINIBackEnd::writeConfigFile(QString filename, bool bGlobal, bool bMerge)
{
    // is the config object read-only?
    if(pConfig->isReadOnly())
        return true; // pretend we wrote it

    KEntryMap aTempMap;
    QFile *mergeFile = (bMerge ? new QFile(filename) : 0);
    bool bEntriesLeft = getEntryMap(aTempMap, bGlobal, mergeFile);
    delete mergeFile;
    if(bFileImmutable)
        return true; // pretend we wrote it

    // OK now the temporary map should be full of ALL entries.
    // write it out to disk.

    // Check if file exists:
    int fileMode = -1;
    bool createNew = true;

    KDE_struct_stat buf;
    if(KDE_stat(QFile::encodeName(filename), &buf) == 0)
    {
        if(buf.st_uid == getuid())
        {
            // Preserve file mode if file exists and is owned by user.
            fileMode = buf.st_mode & 0777;
        }
        else
        {
            // File is not owned by user:
            // Don't create new file but write to existing file instead.
            createNew = false;
        }
    }

    KSaveFile *pConfigFile = 0;
    FILE *pStream = 0;

    if(createNew)
    {
        pConfigFile = new KSaveFile(filename, 0600);

        if(pConfigFile->status() != 0)
        {
            delete pConfigFile;
            return bEntriesLeft;
        }

        if(!bGlobal && (fileMode == -1))
            fileMode = mFileMode;

        if(fileMode != -1)
        {
            fchmod(pConfigFile->handle(), fileMode);
        }

        pStream = pConfigFile->fstream();
    }
    else
    {
        // Open existing file.
        // We use open() to ensure that we call without O_CREAT.
        int fd = KDE_open(QFile::encodeName(filename), O_WRONLY | O_TRUNC);
        if(fd < 0)
        {
            return bEntriesLeft;
        }
        pStream = KDE_fdopen(fd, "w");
        if(!pStream)
        {
            close(fd);
            return bEntriesLeft;
        }
    }

    writeEntries(pStream, aTempMap);

    if(pConfigFile)
    {
        bool bEmptyFile = (ftell(pStream) == 0);
        if(bEmptyFile && ((fileMode == -1) || (fileMode == 0600)))
        {
            // File is empty and doesn't have special permissions: delete it.
            ::unlink(QFile::encodeName(filename));
            pConfigFile->abort();
        }
        else
        {
            // Normal case: Close the file
            pConfigFile->close();
        }
        delete pConfigFile;
    }
    else
    {
        fclose(pStream);
    }

    return bEntriesLeft;
}
Beispiel #5
0
int
main(int argc, char *argv[]) {
    int in;
    struct stat sb;
    uint8 *buf;
    index_header *h;
    struct options opts;
    char outnbuf[512];

    parse_arguments(argc, argv, &opts);

    in = open(opts.infile, O_RDONLY);
    if (in == -1) {
        fprintf(stderr, "Error: Could not open file %s: %s\n", opts.infile,
                strerror(errno));
        return EXIT_FAILURE;
    }

    if (fstat(in, &sb) == -1) {
        perror("stat() failed");
        return EXIT_FAILURE;
    }

    buf = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, in, 0);
    if (buf == MAP_FAILED) {
        perror("mmap() failed");
        return EXIT_FAILURE;
    }
    close(in);

    if (opts.sound && !opts.outfile) {
        char *pdot = strrchr(opts.infile, '.');
        opts.outfile = outnbuf;
        strcpy(outnbuf, opts.infile);
        if (pdot)
            outnbuf[pdot - opts.infile] = 0;

    }

    h = readIndex(buf);
    if (opts.print)
        printIndex(h, buf, stdout);

    if (opts.list) {
        listEntries(h, buf, stdout);
    }

    if (opts.sound && opts.outfile) {
        writeSoundEntries(h, buf, opts.outfile);

    } else if (opts.outfile) {
        FILE *out;
        out = fopen(opts.outfile, "wb+");
        if (out == NULL) {
            fprintf(stderr, "Could not open output file '%s': %s\n",
                    opts.outfile, strerror(errno));
            exit(EXIT_FAILURE);
        }
        writeEntries(h, buf, out);
        fclose(out);
    }

    // freeIndex(h);
    munmap(buf, sb.st_size);
    return EXIT_SUCCESS;
}
Beispiel #6
0
//
// writes the specified flash variable with the specified value
//
bool writeFlashVar( char const *name,
                    char const *value )
{
   bool worked = false ;
   readVars_t rv ;
   char const *devName = GetFlashDev();
   debugPrint( "opening flash device %s\n", devName );
   if( rv.worked() )
   {
      unsigned const nameLen = strlen( name );
      unsigned const dataLen = strlen( value );
      unsigned const avail = rv.maxSize() - rv.bytesUsed();
      unsigned int bDevice = IsDevice(devName);
      if (bDevice && ( avail > nameLen + dataLen + 2 ))
      {
         int fd = open( devName, O_WRONLY );
         if( 0 <= fd )
         {
            mtd_info_t meminfo;
            if( ioctl( fd, MEMGETINFO, (unsigned long)&meminfo) == 0)
            {
               if( meminfo.erasesize == rv.maxSize() )
               {
                  unsigned offset = meminfo.size-meminfo.erasesize+ rv.bytesUsed();
                  if( offset == (unsigned)lseek( fd, offset, SEEK_SET ) )
                  {
                     //
                     // build memory image of new entry
                     //
                     char *entryStart = (char *)rv.startChar() + rv.bytesUsed();
                     memcpy( entryStart, name, nameLen );
                     char *upd = entryStart + nameLen ;
                     *upd++ = '=' ;
                     memcpy( upd, value, dataLen );
                     upd += dataLen ;
                     *upd++ = '\n' ;
                     unsigned const entryLen = upd-entryStart ;
                     int const numWrote = write( fd, entryStart, entryLen );
                     if( (unsigned)numWrote == entryLen )
                     {
//                        printf( "wrote %u bytes of new entry\n", numWrote );
                     }
                     else
                        perror( "write" );
                  }
                  else
                     perror( "lseek2" );
               }
               else
                  fprintf( stderr, "erase size mismatch: rv %u, mi %u\n", rv.maxSize(), meminfo.erasesize );
            }
            else {
               perror( "MEMGETINFO" );
	    }

            close( fd );
         }
         else
            perror(devName);
      }
      else
      {
         fprintf( stderr, "Collapse vars\n" );
         
         // 
         // first, find number of entries by searching for newlines
         //
         unsigned maxEntries = 0 ;
         unsigned spaceLeft = rv.bytesUsed();
         char const *next = rv.startChar();
         while( 0 < spaceLeft )
         {
            void const *nl = memchr( next, '\n', spaceLeft );
            if( nl )
            {
               maxEntries++ ;
               unsigned offs = (char *)nl - next + 1 ;
               next      += offs ;
               spaceLeft -= offs ;
            }
            else
               break;
         }

         
         if ( 1 )
         {
            printf( "%u entries in list\n", maxEntries+1 );
            
            unsigned numUnique = 0 ;
            unsigned uniqueSize = 0 ;
            entry_t * const entries = (entry_t *)malloc(sizeof(entry_t)*(maxEntries+1) );
            memset( entries, 0, maxEntries*sizeof(entry_t) );

            varIter_t it( rv );

            entry_t nextEntry ;
            while( it.next( nextEntry.name, nextEntry.nameLen, nextEntry.data, nextEntry.dataLen ) )
            {
               unsigned i ;
               for( i = 0 ; i < numUnique ; i++ )
               {
                  if( ( entries[i].nameLen == nextEntry.nameLen )
                      &&
                      ( 0 == memcmp( entries[i].name, nextEntry.name, nextEntry.nameLen ) ) )
                  {
                     break;
                  }
               }
               if( i < numUnique )
               {
                  uniqueSize -= entries[i].dataLen ;
                  uniqueSize += nextEntry.dataLen ;

                  entries[i].data    = nextEntry.data ;
                  entries[i].dataLen = nextEntry.dataLen ;
               } // duplicate
               else
               {
                  entries[numUnique++] = nextEntry ;
                  uniqueSize += nextEntry.nameLen ;
                  uniqueSize += nextEntry.dataLen ;
               } // first timer
            } // for each entry in flash

            // 
            // now add original entry (remember why we're here)
            // 
            unsigned i ;
            for( i = 0 ; i < numUnique ; i++ )
            {
               if( ( entries[i].nameLen == nameLen )
                   &&
                   ( 0 == memcmp( entries[i].name, name, nameLen ) ) )
               {
                  break;
               }
            }

            if( i < numUnique )
            {
               uniqueSize -= entries[i].dataLen ;
               uniqueSize += dataLen ;
               entries[i].data    = value ;
               entries[i].dataLen = dataLen ;
            } // duplicate
            else
            {
               entries[i].name    = name ;
               entries[i].nameLen = nameLen ;
               entries[i].data    = value ;
               entries[i].dataLen = dataLen ;
               uniqueSize += nameLen ;
               uniqueSize += dataLen ;
               numUnique++ ;
            } // new entry 

            uniqueSize += 2*numUnique ;
            printf( "%u unique entries, %u bytes\n", numUnique, uniqueSize );

            if( uniqueSize < rv.maxSize() )
            {
printf( "saving %u bytes\n", uniqueSize );

               int fd = open( devName, O_WRONLY );
               if( 0 <= fd )
               {
		  if (bDevice) {
                     mtd_info_t meminfo;
                     if( 0 == ioctl( fd, MEMGETINFO, (unsigned long)&meminfo) )
                     {
                        if( meminfo.erasesize == rv.maxSize() )
                        {
                           unsigned offset = meminfo.size-meminfo.erasesize ;
                           erase_info_t erase;
                           erase.start = offset ;
                           erase.length = meminfo.erasesize;
                           if( 0 == ioctl( fd, MEMERASE, (unsigned long)&erase) )
                           {
                              if( offset == (unsigned)lseek( fd, offset, SEEK_SET ) )
                              {
			         writeEntries(fd, entries,numUnique,uniqueSize);
                                 worked = true ;
                              }
                              else
                                 perror( "lseek3" );
                           }
                           else
                              fprintf( stderr, "erase error %m\n" );
                        }
                        else
                           fprintf( stderr, "erase size mismatch: rv %u, mi %u\n", rv.maxSize(), meminfo.erasesize );
                     }
                     else
                        perror( "MEMGETINFO" );
		  } else {
			writeEntries(fd, entries,numUnique,uniqueSize);
                        worked = true ;
		  }
      
                  close( fd );
               }
               else
                  perror(devName);
            }
            else
               fprintf( stderr, "Flash parameter area is full!\n" );

            free( entries );
         }
         else
            fprintf( stderr, "Error counting entries: why is size so big?\n" );
      }
   }
   return worked ;
}