diff options
| author | Chris Dyer <cdyer@cs.cmu.edu> | 2012-10-11 14:06:32 -0400 | 
|---|---|---|
| committer | Chris Dyer <cdyer@cs.cmu.edu> | 2012-10-11 14:06:32 -0400 | 
| commit | 07ea7b64b6f85e5798a8068453ed9fd2b97396db (patch) | |
| tree | 644496a1690d84d82a396bbc1e39160788beb2cd /klm/util/file.cc | |
| parent | 37b9e45e5cb29d708f7249dbe0b0fb27685282a0 (diff) | |
| parent | a36fcc5d55c1de84ae68c1091ebff2b1c32dc3b7 (diff) | |
Merge branch 'master' of https://github.com/redpony/cdec
Diffstat (limited to 'klm/util/file.cc')
| -rw-r--r-- | klm/util/file.cc | 34 | 
1 files changed, 27 insertions, 7 deletions
| diff --git a/klm/util/file.cc b/klm/util/file.cc index 98f13983..6bf879ac 100644 --- a/klm/util/file.cc +++ b/klm/util/file.cc @@ -6,6 +6,7 @@  #include <cstdio>  #include <iostream> +#include <assert.h>  #include <sys/types.h>  #include <sys/stat.h>  #include <fcntl.h> @@ -111,6 +112,11 @@ void WriteOrThrow(int fd, const void *data_void, std::size_t size) {    }  } +void WriteOrThrow(FILE *to, const void *data, std::size_t size) { +  assert(size); +  if (1 != std::fwrite(data, size, 1, to)) UTIL_THROW(util::ErrnoException, "Short write; requested size " << size); +} +  void FSyncOrThrow(int fd) {  // Apparently windows doesn't have fsync?    #if !defined(_WIN32) && !defined(_WIN64) @@ -119,8 +125,13 @@ void FSyncOrThrow(int fd) {  }  namespace { -void InternalSeek(int fd, off_t off, int whence) { +void InternalSeek(int fd, int64_t off, int whence) { +#if defined(_WIN32) || defined(_WIN64) +  UTIL_THROW_IF((__int64)-1 == _lseeki64(fd, off, whence), ErrnoException, "Windows seek failed"); + +#else    UTIL_THROW_IF((off_t)-1 == lseek(fd, off, whence), ErrnoException, "Seek failed"); +#endif  }  } // namespace @@ -143,6 +154,12 @@ std::FILE *FDOpenOrThrow(scoped_fd &file) {    return ret;  } +std::FILE *FOpenOrThrow(const char *path, const char *mode) { +  std::FILE *ret; +  UTIL_THROW_IF(!(ret = fopen(path, mode)), util::ErrnoException, "Could not fopen " << path << " for " << mode); +  return ret; +} +  TempMaker::TempMaker(const std::string &prefix) : base_(prefix) {    base_ += "XXXXXX";  } @@ -242,7 +259,9 @@ mkstemp_and_unlink(char *tmpl)      /* Modified for windows and to unlink */      //      fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, _S_IREAD | _S_IWRITE); -    fd = _open (tmpl, _O_RDWR | _O_CREAT | _O_TEMPORARY | _O_EXCL | _O_BINARY, _S_IREAD | _S_IWRITE); +    int flags = _O_RDWR | _O_CREAT | _O_EXCL | _O_BINARY; +    flags |= _O_TEMPORARY; +    fd = _open (tmpl, flags, _S_IREAD | _S_IWRITE);      if (fd >= 0)      {        errno = save_errno; @@ -260,17 +279,18 @@ mkstemp_and_unlink(char *tmpl)  int  mkstemp_and_unlink(char *tmpl) {    int ret = mkstemp(tmpl); -  if (ret == -1) return -1; -  UTIL_THROW_IF(unlink(tmpl), util::ErrnoException, "Failed to delete " << tmpl); +  if (ret != -1) { +    UTIL_THROW_IF(unlink(tmpl), util::ErrnoException, "Failed to delete " << tmpl); +  }    return ret;  }  #endif  int TempMaker::Make() const { -  std::string copy(base_); -  copy.push_back(0); +  std::string name(base_); +  name.push_back(0);    int ret; -  UTIL_THROW_IF(-1 == (ret = mkstemp_and_unlink(©[0])), util::ErrnoException, "Failed to make a temporary based on " << base_); +  UTIL_THROW_IF(-1 == (ret = mkstemp_and_unlink(&name[0])), util::ErrnoException, "Failed to make a temporary based on " << base_);    return ret;  } | 
