162306a36Sopenharmony_ci/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * unistd function definitions for NOLIBC
462306a36Sopenharmony_ci * Copyright (C) 2017-2022 Willy Tarreau <w@1wt.eu>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef _NOLIBC_UNISTD_H
862306a36Sopenharmony_ci#define _NOLIBC_UNISTD_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "std.h"
1162306a36Sopenharmony_ci#include "arch.h"
1262306a36Sopenharmony_ci#include "types.h"
1362306a36Sopenharmony_ci#include "sys.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define STDIN_FILENO  0
1762306a36Sopenharmony_ci#define STDOUT_FILENO 1
1862306a36Sopenharmony_ci#define STDERR_FILENO 2
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic __attribute__((unused))
2262306a36Sopenharmony_ciint msleep(unsigned int msecs)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	struct timeval my_timeval = { msecs / 1000, (msecs % 1000) * 1000 };
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (sys_select(0, 0, 0, 0, &my_timeval) < 0)
2762306a36Sopenharmony_ci		return (my_timeval.tv_sec * 1000) +
2862306a36Sopenharmony_ci			(my_timeval.tv_usec / 1000) +
2962306a36Sopenharmony_ci			!!(my_timeval.tv_usec % 1000);
3062306a36Sopenharmony_ci	else
3162306a36Sopenharmony_ci		return 0;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic __attribute__((unused))
3562306a36Sopenharmony_ciunsigned int sleep(unsigned int seconds)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	struct timeval my_timeval = { seconds, 0 };
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	if (sys_select(0, 0, 0, 0, &my_timeval) < 0)
4062306a36Sopenharmony_ci		return my_timeval.tv_sec + !!my_timeval.tv_usec;
4162306a36Sopenharmony_ci	else
4262306a36Sopenharmony_ci		return 0;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic __attribute__((unused))
4662306a36Sopenharmony_ciint usleep(unsigned int usecs)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	struct timeval my_timeval = { usecs / 1000000, usecs % 1000000 };
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	return sys_select(0, 0, 0, 0, &my_timeval);
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic __attribute__((unused))
5462306a36Sopenharmony_ciint tcsetpgrp(int fd, pid_t pid)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	return ioctl(fd, TIOCSPGRP, &pid);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define __syscall_narg(_0, _1, _2, _3, _4, _5, _6, N, ...) N
6062306a36Sopenharmony_ci#define _syscall_narg(...) __syscall_narg(__VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)
6162306a36Sopenharmony_ci#define _syscall(N, ...) __sysret(my_syscall##N(__VA_ARGS__))
6262306a36Sopenharmony_ci#define _syscall_n(N, ...) _syscall(N, __VA_ARGS__)
6362306a36Sopenharmony_ci#define syscall(...) _syscall_n(_syscall_narg(__VA_ARGS__), ##__VA_ARGS__)
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* make sure to include all global symbols */
6662306a36Sopenharmony_ci#include "nolibc.h"
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif /* _NOLIBC_UNISTD_H */
69