16fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones/*
26fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones * util.h - routeup/tlsdated utility functions
36fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones * Copyright (c) 2012 The Chromium Authors. All rights reserved.
46fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones * Use of this source code is governed by a BSD-style license that can be
56fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones * found in the LICENSE file.
66fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones */
76fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones
86fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#ifndef UTIL_H
96fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define UTIL_H
106fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones
116fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#include <errno.h>
126fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#include <string.h>
13c88a9f7f976f8495fcf27717a292bd1070828192Jacob Appelbaum#include <stdlib.h>
14d00526018524956084364987edecbfa40321d0d9Fabian Keil#include <unistd.h>
156fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones
161cfe6cf10d1a7f397d0fff8c8bcb60667c30b1dbJacob Appelbaum#ifdef HAVE_PRCTL
171cfe6cf10d1a7f397d0fff8c8bcb60667c30b1dbJacob Appelbaum#include <sys/prctl.h>
18733df00516d22ef63b891a29d18704d963fdb632Jacob Appelbaum#ifndef PR_SET_NO_NEW_PRIVS
19733df00516d22ef63b891a29d18704d963fdb632Jacob Appelbaum#  define PR_SET_NO_NEW_PRIVS 38
20733df00516d22ef63b891a29d18704d963fdb632Jacob Appelbaum#endif
21182abd405bd9847448298d44192d052d3820a81dJacob Appelbaum#ifndef PR_GET_NO_NEW_PRIVS
22182abd405bd9847448298d44192d052d3820a81dJacob Appelbaum#  define PR_GET_NO_NEW_PRIVS 39
23182abd405bd9847448298d44192d052d3820a81dJacob Appelbaum#endif
241cfe6cf10d1a7f397d0fff8c8bcb60667c30b1dbJacob Appelbaum#endif
251cfe6cf10d1a7f397d0fff8c8bcb60667c30b1dbJacob Appelbaum
269c331bf201909fb5a85725202eee872d4323e12dWill Drewry#include "src/rtc.h"
279c331bf201909fb5a85725202eee872d4323e12dWill Drewry
28f0f17b98fa4c2a5a20a255be4b631d9e3d8bf704Jacob Appelbaum#ifdef TARGET_OS_HAIKU
29f0f17b98fa4c2a5a20a255be4b631d9e3d8bf704Jacob Appelbaum#include <stdarg.h>
30f0f17b98fa4c2a5a20a255be4b631d9e3d8bf704Jacob Appelbaum#endif
31f0f17b98fa4c2a5a20a255be4b631d9e3d8bf704Jacob Appelbaum
326fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define API __attribute__((visibility("default")))
336fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones
34aa04c0126a590fc9646d491151bcbfeed34ba693ellyextern const char *kTempSuffix;
35c45952f88c568046a02bc0aea793008d8bb37755Will Drewry#define IGNORE_EINTR(expr) ({ \
36c45952f88c568046a02bc0aea793008d8bb37755Will Drewry  typeof(expr) _r; \
37c45952f88c568046a02bc0aea793008d8bb37755Will Drewry  while ((_r = (expr)) == -1 && errno == EINTR); \
38c45952f88c568046a02bc0aea793008d8bb37755Will Drewry  _r; \
39c45952f88c568046a02bc0aea793008d8bb37755Will Drewry})
40aa04c0126a590fc9646d491151bcbfeed34ba693elly
41b24f342311f93ff61a73ba4628dc173d09c50413Jacob Appelbaumextern int verbose;
42232fa7e93cd02d176ba2501d8d0e6614b2563ac0Jacob Appelbaumextern int verbose_debug;
43c9b803bcf0e0923dceecb47f2d0deac416f82373Jacob Appelbaumvoid initalize_syslog (void);
4482853f9cb8f8f2e11041046d9957a9483d2e2102Jacob Appelbaumvoid terminate_syslog (void);
45c88a9f7f976f8495fcf27717a292bd1070828192Jacob Appelbaumvoid die (const char *fmt, ...);
46c88a9f7f976f8495fcf27717a292bd1070828192Jacob Appelbaumvoid verb (const char *fmt, ...);
47c45952f88c568046a02bc0aea793008d8bb37755Will Drewryextern void logat (int isverbose, const char *fmt, ...);
48c45952f88c568046a02bc0aea793008d8bb37755Will Drewry
4947313d1f1ae3749f69ad0344e8125f1d61f6faedWill Drewry#define verb_debug debug
5047313d1f1ae3749f69ad0344e8125f1d61f6faedWill Drewry#define debug(fmt, ...) if (verbose_debug) logat(1, fmt, ## __VA_ARGS__)
51523304f84539c2fc0bd802e106fe37327c595405Jacob Appelbaum#define info(fmt, ...) logat(0, fmt, ## __VA_ARGS__)
526fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define pinfo(fmt, ...) logat(1, fmt ": %s", ## __VA_ARGS__, strerror(errno))
536fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define error(fmt, ...) logat(0, fmt, ## __VA_ARGS__)
546fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define perror(fmt, ...) logat(0, fmt ": %s", ## __VA_ARGS__, strerror(errno))
556fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define fatal(fmt, ...) do { logat(0, fmt, ## __VA_ARGS__); exit(1); } while (0)
566fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#define pfatal(fmt, ...) do { \
578d751a0168e8c392df88327709e482f6d6375ccbJacob Appelbaum  logat(0, fmt ": %s", ## __VA_ARGS__, strerror(errno)); \
588d751a0168e8c392df88327709e482f6d6375ccbJacob Appelbaum  exit(1); \
596fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones} while (0)
606fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones
61c45952f88c568046a02bc0aea793008d8bb37755Will Drewrystatic inline int min (int x, int y)
62c45952f88c568046a02bc0aea793008d8bb37755Will Drewry{
63c45952f88c568046a02bc0aea793008d8bb37755Will Drewry  return x < y ? x : y;
64c45952f88c568046a02bc0aea793008d8bb37755Will Drewry}
65a9e52fe816b570da68138394c4884c7db7171580Elly Fong-Jones
66aab9382297008c1d1b7cef361159a44885d52af0Gilad Arnoldvoid drop_privs_to (const char *user, const char *group,
67aab9382297008c1d1b7cef361159a44885d52af0Gilad Arnold                    const char **supp_groups);
68eaa686f75374a6c2807b976dfaf65620a57421c4Jacob Appelbaumvoid no_new_privs (void);
69c45952f88c568046a02bc0aea793008d8bb37755Will Drewryconst char *sync_type_str (int sync_type);
70c45952f88c568046a02bc0aea793008d8bb37755Will Drewry
71c45952f88c568046a02bc0aea793008d8bb37755Will Drewrystruct state;
72c45952f88c568046a02bc0aea793008d8bb37755Will Drewryenum event_id_t;
73c45952f88c568046a02bc0aea793008d8bb37755Will Drewryvoid trigger_event (struct state *state, enum event_id_t e, int sec);
74a5e7fbb012f155b0a37c09e1c42989bc4988fce9Elly Fong-Jones
75aa04c0126a590fc9646d491151bcbfeed34ba693ellystruct platform {
769c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*rtc_open)(struct rtc_handle *);
779c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*rtc_write)(struct rtc_handle *, const struct timeval *tv);
789c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*rtc_read)(struct rtc_handle *, struct timeval *tv);
799c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*rtc_close)(struct rtc_handle *);
80aa04c0126a590fc9646d491151bcbfeed34ba693elly
819c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*file_open)(const char *path, int write, int cloexec);
829c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*file_close)(int fd);
839c331bf201909fb5a85725202eee872d4323e12dWill Drewry	/* Atomic file write and read */
849c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*file_write)(int fd, void *buf, size_t sz);
859c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*file_read)(int fd, void *buf, size_t sz);
86aa04c0126a590fc9646d491151bcbfeed34ba693elly
87aa04c0126a590fc9646d491151bcbfeed34ba693elly	int (*time_get)(struct timeval *tv);
88aa04c0126a590fc9646d491151bcbfeed34ba693elly
89aa04c0126a590fc9646d491151bcbfeed34ba693elly	int (*pgrp_enter)(void);
90aa04c0126a590fc9646d491151bcbfeed34ba693elly	int (*pgrp_kill)(void);
919c331bf201909fb5a85725202eee872d4323e12dWill Drewry
929c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*process_signal)(pid_t pid, int sig);
939c331bf201909fb5a85725202eee872d4323e12dWill Drewry	int (*process_wait)(pid_t pid, int *status, int timeout);
94aa04c0126a590fc9646d491151bcbfeed34ba693elly};
95aa04c0126a590fc9646d491151bcbfeed34ba693elly
96aa04c0126a590fc9646d491151bcbfeed34ba693ellyextern struct platform *platform;
97aa04c0126a590fc9646d491151bcbfeed34ba693elly
986fb0d4b062af22e3576b8c48027710d10d764e34Elly Fong-Jones#endif /* !UTIL_H */
99