/* 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_
