/*
 * util.h - routeup/tlsdated utility functions
 * Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef UTIL_H
#define UTIL_H

#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#ifdef HAVE_PRCTL
#include <sys/prctl.h>
#ifndef PR_SET_NO_NEW_PRIVS
#  define PR_SET_NO_NEW_PRIVS 38
#endif
#ifndef PR_GET_NO_NEW_PRIVS
#  define PR_GET_NO_NEW_PRIVS 39
#endif
#endif

#include "src/rtc.h"

#ifdef TARGET_OS_HAIKU
#include <stdarg.h>
#endif

#define API __attribute__((visibility("default")))

extern const char *kTempSuffix;
#define IGNORE_EINTR(expr) ({ \
  typeof(expr) _r; \
  while ((_r = (expr)) == -1 && errno == EINTR); \
  _r; \
})

extern int verbose;
extern int verbose_debug;
void initalize_syslog (void);
void terminate_syslog (void);
void die (const char *fmt, ...);
void verb (const char *fmt, ...);
extern void logat (int isverbose, const char *fmt, ...);

#define verb_debug debug
#define debug(fmt, ...) if (verbose_debug) logat(1, fmt, ## __VA_ARGS__)
#define info(fmt, ...) logat(0, fmt, ## __VA_ARGS__)
#define pinfo(fmt, ...) logat(1, fmt ": %s", ## __VA_ARGS__, strerror(errno))
#define error(fmt, ...) logat(0, fmt, ## __VA_ARGS__)
#define perror(fmt, ...) logat(0, fmt ": %s", ## __VA_ARGS__, strerror(errno))
#define fatal(fmt, ...) do { logat(0, fmt, ## __VA_ARGS__); exit(1); } while (0)
#define pfatal(fmt, ...) do { \
  logat(0, fmt ": %s", ## __VA_ARGS__, strerror(errno)); \
  exit(1); \
} while (0)

static inline int min (int x, int y)
{
  return x < y ? x : y;
}

void drop_privs_to (const char *user, const char *group,
                    const char **supp_groups);
void no_new_privs (void);
const char *sync_type_str (int sync_type);

struct state;
enum event_id_t;
void trigger_event (struct state *state, enum event_id_t e, int sec);

struct platform {
	int (*rtc_open)(struct rtc_handle *);
	int (*rtc_write)(struct rtc_handle *, const struct timeval *tv);
	int (*rtc_read)(struct rtc_handle *, struct timeval *tv);
	int (*rtc_close)(struct rtc_handle *);

	int (*file_open)(const char *path, int write, int cloexec);
	int (*file_close)(int fd);
	/* Atomic file write and read */
	int (*file_write)(int fd, void *buf, size_t sz);
	int (*file_read)(int fd, void *buf, size_t sz);

	int (*time_get)(struct timeval *tv);

	int (*pgrp_enter)(void);
	int (*pgrp_kill)(void);

	int (*process_signal)(pid_t pid, int sig);
	int (*process_wait)(pid_t pid, int *status, int timeout);
};

extern struct platform *platform;

#endif /* !UTIL_H */
