-const tchar *
-path_basename_with_len(const tchar *path, size_t len)
-{
- const tchar *p = &path[len] - 1;
-
- /* Trailing slashes. */
- while (1) {
- if (p == path - 1)
- return T("");
- if (*p != T('/'))
- break;
- p--;
- }
-
- while ((p != path - 1) && *p != T('/'))
- p--;
-
- return p + 1;
-}
-
-/* Like the basename() function, but does not modify @path; it just returns a
- * pointer to it. */
-const tchar *
-path_basename(const tchar *path)
-{
- return path_basename_with_len(path, tstrlen(path));
-}
-
-/*
- * Returns a pointer to the part of @path following the first colon in the last
- * path component, or NULL if the last path component does not contain a colon.
- */
-const tchar *
-path_stream_name(const tchar *path)
-{
- const tchar *base = path_basename(path);
- const tchar *stream_name = tstrchr(base, T(':'));
- if (!stream_name)
- return NULL;
- else
- return stream_name + 1;
-}
-
-u64
-get_wim_timestamp()
-{
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return timeval_to_wim_timestamp(tv);
-}
-
-void
-wim_timestamp_to_str(u64 timestamp, tchar *buf, size_t len)
-{
- struct tm tm;
- time_t t = wim_timestamp_to_unix(timestamp);
- gmtime_r(&t, &tm);
- tstrftime(buf, len, T("%a %b %d %H:%M:%S %Y UTC"), &tm);
-}
-
-void
-zap_backslashes(tchar *s)
-{
- if (s) {
- while (*s != T('\0')) {
- if (*s == T('\\'))
- *s = T('/');
- s++;
- }
- }
-}
-
-/* Write @n bytes from @buf to the file descriptor @fd, retrying on internupt
- * and on short writes.
- *
- * Returns short count and set errno on failure. */
-size_t
-full_write(int fd, const void *buf, size_t n)
-{
- const void *p = buf;
- ssize_t ret;
- ssize_t total = 0;
-
- while (total != n) {
- ret = write(fd, p, n);
- if (ret <= 0) {
- if (errno == EINTR)
- continue;
- if (ret == 0)
- errno = EIO;
- break;
- }
- total += ret;
- p += ret;
- }
- return total;
-}
-
-/* Read @n bytes from the file descriptor @fd to the buffer @buf, retrying on
- * interrupt and on short reads.
- *
- * Returns short count and set errno on failure. */
-size_t
-full_read(int fd, void *buf, size_t n)
-{
- size_t bytes_remaining = n;
- while (bytes_remaining) {
- ssize_t bytes_read = read(fd, buf, bytes_remaining);
- if (bytes_read <= 0) {
- if (errno == EINTR)
- continue;
- if (bytes_read == 0)
- errno = EIO;
- break;
- }
- bytes_remaining -= bytes_read;
- buf += bytes_read;
- }
- return n - bytes_remaining;
-}
-
-/* Read @n bytes from the file descriptor @fd at the offset @offset to the
- * buffer @buf, retrying on interrupt and on short reads.
- *
- * Returns short count and set errno on failure. */
-size_t
-full_pread(int fd, void *buf, size_t nbyte, off_t offset)
-{
- size_t bytes_remaining = nbyte;
- ssize_t bytes_read;
-
- while (bytes_remaining) {
- bytes_read = pread(fd, buf, bytes_remaining, offset);
- if (bytes_read <= 0) {
- if (errno == EINTR)
- continue;
- if (bytes_read == 0)
- errno = EIO;
- break;
- }
- bytes_remaining -= bytes_read;
- buf += bytes_read;
- offset += bytes_read;
- }
- return nbyte - bytes_remaining;
-}