Changeset 67369b1 in rtems-tools


Ignore:
Timestamp:
Sep 10, 2014, 1:15:29 AM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
2d5de2e
Parents:
30a7f06
Message:

Fix the tempfile output code to handle line breaks better.

Location:
linkers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-process.cpp

    r30a7f06 r67369b1  
    4949#endif
    5050
     51#if __WIN32__
     52#define CREATE_MODE (S_IRUSR | S_IWUSR)
     53#define OPEN_FLAGS  (O_BINARY)
     54#else
     55#define CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
     56#define OPEN_FLAGS  (0)
     57#endif
     58
    5159#include <iostream>
    5260
     
    166174        bool ok = rld::path::check_file (_name);
    167175        int  flags = writable ? O_RDWR : O_RDONLY;
    168 
    169         if (overridden)
    170         {
    171           flags |= O_CREAT | O_TRUNC;
     176        int  mode = writable ? CREATE_MODE : 0;
     177
     178        if (writable && overridden)
     179        {
     180          flags |= O_CREAT | O_TRUNC | O_APPEND;
    172181        }
    173182        else
     
    178187
    179188        level = 0;
    180         fd = ::open (_name.c_str (), flags);
     189        fd = ::open (_name.c_str (), flags, mode);
    181190        if (fd < 0)
    182191          throw rld::error (::strerror (errno), "tempfile open:" + _name);
     
    258267      if (fd != -1)
    259268      {
    260         if (level)
    261           line.append (buf, level);
    262         level = 0;
    263         while (true)
    264         {
    265           int read = ::read (fd, buf, sizeof (buf));
    266           if (read < 0)
    267             throw rld::error (::strerror (errno), "tempfile read:" + _name);
    268           else if (read == 0)
    269             break;
    270           else
     269        bool reading = true;
     270        while (reading)
     271        {
     272          if (level < (sizeof (buf) - 1))
     273          {
     274            memset (buf + level, 0, sizeof (buf) - level);
     275            int read = ::read (fd, buf + level, sizeof (buf) - level - 1);
     276            if (read < 0)
     277              throw rld::error (::strerror (errno), "tempfile read:" + _name);
     278            else if (read == 0)
     279              reading = false;
     280            else
     281              level += read;
     282          }
     283          if (level)
    271284          {
    272285            char* lf = ::strchr (buf, '\n');
     286            int   len = level;
    273287            if (lf)
    274             {
    275               int len = lf - &buf[0] + 1;
     288              len = lf - &buf[0] + 1;
     289            if (lf || !reading)
     290            {
    276291              line.append (buf, len);
    277               level = read - len;
    278               if (level)
    279                 ::memmove (buf, &buf[len], level);
    280               break;
    281             }
    282             line.append (buf, read);
     292              level -= len;
     293            }
     294            if (level)
     295              ::memmove (buf, &buf[len], level + 1);
     296            reading = false;
    283297          }
    284298        }
     
    344358            break;
    345359          if (!prefix.empty ())
    346             out << prefix << ':';
     360            out << prefix << ": ";
    347361          if (line_numbers)
    348             out << lc << ':';
    349           out << line;
     362            out << lc << ": ";
     363          out << line << std::flush;
    350364        }
    351365        close ();
     
    395409             const std::string&   errname)
    396410    {
    397       if (rld::verbose () >= RLD_VERBOSE_TRACE)
     411      if (rld::verbose (RLD_VERBOSE_TRACE))
    398412      {
    399413        std::cout << "execute: ";
     
    430444      status _status;
    431445
    432       if (rld::verbose () >= RLD_VERBOSE_TRACE)
     446      if (rld::verbose (RLD_VERBOSE_TRACE))
    433447        std::cout << "execute: status: ";
    434448
     
    437451        _status.type = status::normal;
    438452        _status.code = WEXITSTATUS (s);
    439         if (rld::verbose () >= RLD_VERBOSE_TRACE)
     453        if (rld::verbose (RLD_VERBOSE_TRACE))
    440454          std::cout << _status.code << std::endl;
    441455      }
     
    444458        _status.type = status::signal;
    445459        _status.code = WTERMSIG (s);
    446         if (rld::verbose () >= RLD_VERBOSE_TRACE)
     460        if (rld::verbose (RLD_VERBOSE_TRACE))
    447461          std::cout << "signal: " << _status.code << std::endl;
    448462      }
     
    451465        _status.type = status::stopped;
    452466        _status.code = WSTOPSIG (s);
    453         if (rld::verbose () >= RLD_VERBOSE_TRACE)
     467        if (rld::verbose (RLD_VERBOSE_TRACE))
    454468          std::cout << "stopped: " << _status.code << std::endl;
    455469      }
  • linkers/rld-process.h

    r30a7f06 r67369b1  
    194194      int               fd;         //< The file descriptor
    195195      char              buf[256];   //< The read buffer.
    196       int               level;      //< The level of data in the buffer.
     196      size_t            level;      //< The level of data in the buffer.
    197197    };
    198198
Note: See TracChangeset for help on using the changeset viewer.