51 broke -E logic completely, rewise it
[tfcrypt.git] / tfc_misc.c
index f55726ac897974471b33f9ad4422bc4463ddccfe..2aa58df4b5fd46ea9d579f3be3e4cafb85067e0f 100644 (file)
@@ -63,6 +63,26 @@ tfc_yesno str_empty(const char *str)
        return NO;
 }
 
+int xxopen(tfc_yesno noerr, const char *pathname, int flags)
+{
+       int r;
+
+       if ((flags & O_WRONLY || flags & O_RDWR)) {
+               if (read_only == YES) flags = O_RDONLY;
+               else flags |= write_flags;
+       }
+
+       flags |= O_LARGEFILE;
+       r = open(pathname, flags, 0666);
+       if (noerr == NO && r == -1) xerror(NO, NO, YES, "%s", pathname);
+       return r;
+}
+
+int xopen(const char *pathname, int flags)
+{
+       return xxopen(NO, pathname, flags);
+}
+
 void xclose(int fd)
 {
        if (fd < 3) return;
@@ -77,23 +97,67 @@ const char *tfc_modename(int mode)
                case TFC_MODE_XTS: return "XTS";
                case TFC_MODE_ECB: return "ECB";
                case TFC_MODE_CBC: return "CBC";
-               case TFC_MODE_OCB: return "OCB";
+               case TFC_MODE_PCBC: return "PCBC";
        }
 
        return NULL;
 }
 
+tfc_yesno tfc_is_freestream(int mode)
+{
+       switch (mode) {
+               case TFC_MODE_PLAIN:
+               case TFC_MODE_XOR:
+               case TFC_MODE_STREAM: return YES;
+       }
+
+       return NO;
+}
+
 void tfc_getcurtime(tfc_useconds *tx)
 {
-       struct timeval t;
+       struct timespec t;
        memset(&t, 0, sizeof(t));
 
-       gettimeofday(&t, NULL);
-       *tx = t.tv_sec * 1000000 + t.tv_usec;
+       clock_gettime(CLOCK_MONOTONIC, &t);
+       *tx = (tfc_useconds)t.tv_sec * 1000000 + (t.tv_nsec / 1000);
 
        memset(&t, 0, sizeof(t));
 }
 
+char *tfc_format_time(tfc_useconds t)
+{
+       tfc_useconds secs, dsecs;
+       unsigned days, hours, minutes, seconds;
+       static char r[128];
+
+       secs = (tfc_useconds)TFC_UTODSECS(t);
+       dsecs = (tfc_useconds)(t - (secs * 1000000));
+
+       days = secs / 86400;
+       hours = (secs / 3600) % 24;
+       minutes = (secs / 60) % 60;
+       seconds = secs % 60;
+
+       if (days > 0) sprintf(r, "%ud,%02u:%02u:%02u.%04u", days, hours, minutes, seconds, (unsigned)(dsecs / 100));
+       else if (hours > 0) sprintf(r, "%02u:%02u:%02u.%04u", hours, minutes, seconds, (unsigned)(dsecs / 100));
+       else if (minutes > 0) sprintf(r, "%02u:%02u.%04u", minutes, seconds, (unsigned)(dsecs / 100));
+       else sprintf(r, "%02u.%04u", seconds, (unsigned)(dsecs / 100));
+
+       return r;
+}
+
+char *tfc_format_pid(const char *str)
+{
+       static char r[128];
+       size_t n;
+
+       n = xstrlcpy(r, str, sizeof(r));
+       if (show_pid == YES && sizeof(r)-n >= 22) sprintf(r+n, "[%lu]", (unsigned long)progpid);
+
+       return r;
+}
+
 tfc_fsize tfc_fdsize(int fd)
 {
        off_t l, cur;
@@ -113,7 +177,7 @@ tfc_fsize tfc_fdgetpos(int fd)
        off_t t;
 
        t = lseek(fd, 0L, SEEK_CUR);
-       if (t == -1) return NOFSIZE;
+       if (t == (off_t)-1) return NOFSIZE;
        return (tfc_fsize)t;
 }
 
@@ -131,7 +195,7 @@ tfc_fsize tfc_fnamesize(char *fname, tfc_yesno noexit)
                memset(s, 0, 2);
        }
 
-       fnmfd = open(fname, O_RDONLY);
+       fnmfd = xxopen(YES, fname, O_RDONLY);
        if (s) memcpy(s, T, 2);
        if (fnmfd == -1) {
                xerror(noexit, NO, YES, "%s", fname);