/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Private header file for mount-encrypted helper tool.
 */
#ifndef CRYPTOHOME_MOUNT_ENCRYPTED_H_
#define CRYPTOHOME_MOUNT_ENCRYPTED_H_

/* #define DEBUG_ENABLED 1 */
#define DEBUG_TIME_DELTA 1

#include <openssl/err.h>
#include <openssl/sha.h>

#define DIGEST_LENGTH SHA256_DIGEST_LENGTH

#define _ERROR(f, a...)                                                \
  do {                                                                 \
    fprintf(stderr, "ERROR[pid:%d] %s (%s, %d): ", getpid(), __func__, \
            __FILE__, __LINE__);                                       \
    fprintf(stderr, f, ##a);                                           \
  } while (0)
#define ERROR(f, a...)     \
  do {                     \
    _ERROR(f, ##a);        \
    fprintf(stderr, "\n"); \
    fflush(stderr);        \
  } while (0)
#define PERROR(f, a...)                         \
  do {                                          \
    _ERROR(f, ##a);                             \
    fprintf(stderr, ": %s\n", strerror(errno)); \
    fflush(stderr);                             \
  } while (0)

#define SSL_ERROR(f, a...)                                            \
  do {                                                                \
    ERR_load_crypto_strings();                                        \
    _ERROR(f, ##a);                                                   \
    fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL)); \
    fflush(stderr);                                                   \
  } while (0)

#if DEBUG_ENABLED
extern struct timeval tick;
extern struct timeval tick_start;
#define TICK_INIT()            \
  do {                         \
    gettimeofday(&tick, NULL); \
    tick_start = tick;         \
  } while (0)
#ifdef DEBUG_TIME_DELTA
/* This timeval helper copied from glibc manual. */
static inline int timeval_subtract(struct timeval* result,
                                   struct timeval* x,
                                   struct timeval* y) {
  /* Perform the carry for the later subtraction by updating y. */
  if (x->tv_usec < y->tv_usec) {
    int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
    y->tv_usec -= 1000000 * nsec;
    y->tv_sec += nsec;
  }
  if (x->tv_usec - y->tv_usec > 1000000) {
    int nsec = (x->tv_usec - y->tv_usec) / 1000000;
    y->tv_usec += 1000000 * nsec;
    y->tv_sec -= nsec;
  }

  /* Compute the time remaining to wait.
   * tv_usec is certainly positive.
   */
  result->tv_sec = x->tv_sec - y->tv_sec;
  result->tv_usec = x->tv_usec - y->tv_usec;

  /* Return 1 if result is negative. */
  return x->tv_sec < y->tv_sec;
}
#define TICK_REPORT()                                                      \
  do {                                                                     \
    struct timeval now, diff;                                              \
    gettimeofday(&now, NULL);                                              \
    timeval_subtract(&diff, &now, &tick);                                  \
    printf("\tTook: [pid:%d, %2d.%06ds]\n", getpid(),                      \
           static_cast<int>(diff.tv_sec), static_cast<int>(diff.tv_usec)); \
    tick = now;                                                            \
  } while (0)
#else
#define TICK_REPORT()                                    \
  do {                                                   \
    gettimeofday(&tick, NULL);                           \
    printf("[%2d.%06d] ", static_cast<int>(tick.tv_sec), \
           static_cast<int>(tick.tv_usec));              \
  } while (0)
#endif
#define TICK_DONE()                                             \
  do {                                                          \
    struct timeval tick_done;                                   \
    TICK_REPORT();                                              \
    timeval_subtract(&tick_done, &tick, &tick_start);           \
    printf("Process Lifetime: [pid:%d, %2d.%06ds]\n", getpid(), \
           static_cast<int>(tick_done.tv_sec),                  \
           static_cast<int>(tick_done.tv_usec));                \
  } while (0)
#else
#define TICK_INIT() \
  do {              \
  } while (0)
#define TICK_REPORT() \
  do {                \
  } while (0)
#define TICK_DONE() \
  do {              \
  } while (0)
#endif

#define _INFO(f, a...)             \
  do {                             \
    printf("[pid:%d] ", getpid()); \
    printf(f, ##a);                \
    printf("\n");                  \
    fflush(stdout);                \
  } while (0)
#define INFO(f, a...) \
  do {                \
    TICK_REPORT();    \
    _INFO(f, ##a);    \
  } while (0)
#define INFO_INIT(f, a...) \
  do {                     \
    TICK_INIT();           \
    INFO(f, ##a);          \
  } while (0)
#define INFO_DONE(f, a...) \
  do {                     \
    TICK_DONE();           \
    INFO(f, ##a);          \
  } while (0)
#if DEBUG_ENABLED
#define DEBUG(f, a...) \
  do {                 \
    TICK_REPORT();     \
    _INFO(f, ##a);     \
  } while (0)
#else
#define DEBUG(f, a...) \
  do {                 \
  } while (0)
#endif

#if DEBUG_ENABLED
static inline void debug_dump_hex(const char* name,
                                  uint8_t* data,
                                  uint32_t size) {
  int i;
  printf("%s: ", name);
  for (i = 0; i < size; i++) {
    printf("%02x ", data[i]);
  }
  printf("\n");
}
#else
#define debug_dump_hex(n, d, s) \
  do {                          \
  } while (0)
#endif

#endif  // CRYPTOHOME_MOUNT_ENCRYPTED_H_
