Update MentOs code to the latest development version.

This commit is contained in:
Enrico Fraccaroli
2021-10-04 11:44:02 +02:00
parent 6fd063984a
commit b01eccca2e
484 changed files with 42358 additions and 20285 deletions
+20
View File
@@ -0,0 +1,20 @@
/// MentOS, The Mentoring Operating system project
/// @file assert.h
/// @brief Defines the function and pre-processor macro for assertions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Function used to log the information of a failed assertion.
/// @param assertion The failed assertion.
/// @param file The file where the assertion is located.
/// @param function The function where the assertion is.
/// @param line The line inside the file.
void __assert_fail(const char *assertion, const char *file, const char *function, unsigned int line);
/// @brief Extract the filename from the full path provided by __FILE__.
#define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
/// @brief Assert function.
#define assert(expression) ((expression) ? (void)0 : __assert_fail(#expression, __FILENAME__, __func__, __LINE__))
+9
View File
@@ -0,0 +1,9 @@
/// @file ioctls.h
/// @brief Input/Output ConTroL (IOCTL) numbers.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#define TCGETS 0x5401U ///< Get the current serial port settings.
#define TCSETS 0x5402U ///< Set the current serial port settings.
+36
View File
@@ -0,0 +1,36 @@
/// MentOS, The Mentoring Operating system project
/// @file stat.h
/// @brief Defines the structure used by the functiosn fstat(), lstat(), and stat().
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#if !defined(__SYS_STAT_H) && !defined(__KERNEL__)
#error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
#endif
#include "stddef.h"
#include "time.h"
/// @brief Data structure which contains information about a file.
typedef struct stat_t {
/// ID of device containing file.
dev_t st_dev;
/// File serial number.
ino_t st_ino;
/// Mode of file.
mode_t st_mode;
/// File user id.
uid_t st_uid;
/// File group id.
gid_t st_gid;
/// File Size.
off_t st_size;
/// Time of last access.
time_t st_atime;
/// Time of last data modification.
time_t st_mtime;
/// Time of last status change.
time_t st_ctime;
} stat_t;
+45
View File
@@ -0,0 +1,45 @@
/// MentOS, The Mentoring Operating system project
/// @file termios-struct.h
/// @brief Definition of the `termios` structure.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// Type for control characters.
typedef unsigned char cc_t;
/// Type for speed.
typedef unsigned int speed_t;
/// Type for flags.
typedef unsigned int tcflag_t;
/// The number of control characters.
#define NCCS 32
/// @brief Stores information about a terminal IOs.
typedef struct termios {
tcflag_t c_iflag; ///< input mode flags
tcflag_t c_oflag; ///< output mode flags
tcflag_t c_cflag; ///< control mode flags
tcflag_t c_lflag; ///< local mode flags
cc_t c_line; ///< line discipline
cc_t c_cc[NCCS]; ///< control characters
speed_t c_ispeed; ///< input speed
speed_t c_ospeed; ///< output speed
} termios;
/// @brief These flags generally control higher-level aspects of input processing than the input
/// modes flags described in Input Modes, such as echoing, signals, and the choice of canonical
/// or noncanonical input.
enum {
ISIG = 000001U, ///< Controls whether the INTR, QUIT, and SUSP characters are recognized.
ICANON = 000002U, ///< Enables canonical input processing mode.
ECHO = 000010U, ///< Echo input characters.
ECHOE = 000020U, ///< If ICANON is set, the ERASE character erases the preceding character.
ECHOK = 000040U, ///< If ICANON is set, the KILL character erases the current line.
ECHONL = 000100U, ///< If ICANON is set, echo the NL character even if ECHO is not set.
NOFLSH = 000200U, ///< Do not clear in/out queues when receiving INTR, QUIT, and SUSP.
TOSTOP = 000400U, ///< Allows SIGTTOU signals generated by background processes.
ECHOCTL = 001000U, ///< If this and ECHO are set, control characters with ^ are echoed.
ECHOKE = 004000U, ///< If ICANON is set, KILL is echoed by erasing each character on the line.
IEXTEN = 100000U, ///< Enables implementation-defined input processing.
};
+52
View File
@@ -0,0 +1,52 @@
/// MentOS, The Mentoring Operating system project
/// @file ctype.h
/// @brief Functions related to character handling.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Check if the given value is a digit.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int isdigit(int c);
/// @brief Check if the given value is a letter.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int isalpha(int c);
/// @brief Check if the given value is either a letter or a digit.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int isalnum(int c);
/// @brief Check if the given value is an hexadecimal digit.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int isxdigit(int c);
/// @brief Check if the given value is a lower case letter.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int islower(int c);
/// @brief Check if the given value is an upper case letter.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int isupper(int c);
/// @brief Transforms the given value into a lower case letter.
/// @param c The input letter.
/// @return The input letter turned into a lower case letter.
int tolower(int c);
/// @brief Transforms the given value into an upper case letter.
/// @param c The input letter.
/// @return The input letter turned into an upper case letter.
int toupper(int c);
/// @brief Check if the given value is a whitespace.
/// @param c The input character.
/// @return 1 on success, 0 otherwise.
int isspace(int c);
+44
View File
@@ -0,0 +1,44 @@
/// MentOS, The Mentoring Operating system project
/// @file debug.h
/// @brief Debugging primitives.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#ifndef __DEBUG_HEADER__
/// Header for identifying outputs coming from a mechanism.
#define __DEBUG_HEADER__
#endif
/// @brief Extract the filename from the full path provided by __FILE__.
#define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
/// @brief Prints the given character to debug output.
/// @param c The character to print.
void dbg_putchar(char c);
/// @brief Prints the given string to debug output.
/// @param s The string to print.
void dbg_puts(const char *s);
/// @brief Prints the given string to the debug output.
/// @param file The name of the file.
/// @param fun The name of the function.
/// @param line The line inside the file.
/// @param format The format to used, see printf.
/// @param ... The list of arguments.
void dbg_printf(const char *file, const char *fun, int line, const char *format, ...);
/// @brief Transforms the given amount of bytes to a readable string.
/// @param bytes The bytes to turn to string.
/// @return String representing the bytes in human readable form.
const char *to_human_size(unsigned long bytes);
/// @brief Transforms the given value to a binary string.
/// @param value The decimal value.
/// @return String representing the binary value.
const char *dec_to_binary(unsigned long value);
/// Prints a debugging message.
#define pr_debug(...) dbg_printf(__FILENAME__, __func__, __LINE__, __DEBUG_HEADER__ __VA_ARGS__)
+46
View File
@@ -0,0 +1,46 @@
/// MentOS, The Mentoring Operating system project
/// @file fcntl.h
/// @brief Headers of functions fcntl() and open().
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#define O_RDONLY 00000000U ///< Open for reading only.
#define O_WRONLY 00000001U ///< Open for writing only.
#define O_RDWR 00000002U ///< Open for reading and writing.
#define O_CREAT 00000100U ///< Create if nonexistant.
#define O_EXCL 00000200U ///< Error if already exists.
#define O_TRUNC 00001000U ///< Truncate to zero length.
#define O_APPEND 00002000U ///< Set append mode.
#define O_NONBLOCK 00004000U ///< No delay.
#define O_DIRECTORY 00200000U ///< If file exists has no effect. Otherwise, the file is created.
/// @defgroup ModeBitsAccessPermission Mode Bits for Access Permission
/// @brief The file modes.
/// @{
#define S_IRWXU 0000700U ///< RWX mask for user.
#define S_IRUSR 0000400U ///< R for user.
#define S_IWUSR 0000200U ///< W for user.
#define S_IXUSR 0000100U ///< X for user.
#define S_IRWXG 0000070U ///< RWX mask for group.
#define S_IRGRP 0000040U ///< R for group.
#define S_IWGRP 0000020U ///< W for group.
#define S_IXGRP 0000010U ///< X for group.
#define S_IRWXO 0000007U ///< RWX mask for group.
#define S_IROTH 0000004U ///< R for group.
#define S_IWOTH 0000002U ///< W for group.
#define S_IXOTH 0000001U ///< X for group.
#define S_ISDIR(m) (((m)&0170000) == 0040000) ///< directory.
#define S_ISCHR(m) (((m)&0170000) == 0020000) ///< char special
#define S_ISBLK(m) (((m)&0170000) == 0060000) ///< block special
#define S_ISREG(m) (((m)&0170000) == 0100000) ///< regular file
#define S_ISFIFO(m) (((m)&0170000) == 0010000) ///< fifo
#define S_ISLNK(m) (((m)&0170000) == 0120000) ///< symbolic link
#define S_ISSOCK(m) (((m)&0170000) == 0140000) ///< socket
/// @}
+37
View File
@@ -0,0 +1,37 @@
/// MentOS, The Mentoring Operating system project
/// @file fcvt.h
/// @brief Declare the functions required to turn double values into a string.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Thif function transforms `value` into a string of digits inside `buf`,
/// representing the whole part followed by the decimal part.
/// @details
/// For instance, 512.765 will result in:
/// decpt = 3
/// sign = 0
/// buf = "512765"
/// @param arg The argument to turn into string.
/// @param chars The total number of digits.
/// @param decpt The position of the decimal point.
/// @param sign The sign of the number.
/// @param buf Buffer where the digits should be placed.
/// @param buf_size Dimension of the buffer.
void ecvtbuf(double arg, int chars, int *decpt, int *sign, char *buf, unsigned buf_size);
/// @brief Thif function transforms `value` into a string of digits inside `buf`,
/// representing the whole part followed by the decimal part.
/// @details
/// For instance, 512.765 will result in:
/// decpt = 3
/// sign = 0
/// buf = "512765"
/// @param arg The argument to turn into string.
/// @param decimals The total number of digits to write after the decimal point.
/// @param decpt The position of the decimal point.
/// @param sign The sign of the number.
/// @param buf Buffer where the digits should be placed.
/// @param buf_size Dimension of the buffer.
void fcvtbuf(double arg, int decimals, int *decpt, int *sign, char *buf, unsigned buf_size);
+76
View File
@@ -0,0 +1,76 @@
/// MentOS, The Mentoring Operating system project
/// @file grp.h
/// @brief Defines the structures and functions for managing groups.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stddef.h"
/// Maximum number of users per group
#define MAX_MEMBERS_PER_GROUP 64
///@brief Contains user group informations
typedef struct group{
char* gr_name; // the name of the group
gid_t gr_gid; // numerical group ID
char* gr_passwd; // password
//pointer to a null-terminated array of character pointers to member names
char* gr_mem[MAX_MEMBERS_PER_GROUP + 1];
} group;
///@brief Provides access to the group database entry for `uid`.
///@param gid The gid to search inside the database.
///@return A pointer to the structure containing the database entry.
struct group* getgrgid(gid_t gid);
///@brief Provides access to the group database entry for `name`.
///@param name The name to search inside the database.
///@return A pointer to the structure containing the database entry.
struct group* getgrnam(const char* name);
///@brief Provides the same information as getgrgid but it stores the
/// results inside group, and the string information are store store
/// inside `buf`.
///@param gid The uid to search inside the database.
///@param group The structure containing pointers to the entry fields.
///@param buf The buffer where the strings should be stored.
///@param buflen The lenght of the buffer.
///@param result A pointer to the result or NULL is stored here.
///@return If the entry was found returns zero and set *result to group,
/// if the entry was not found returns zero and set *result to NULL,
/// on failure returns a number and sets and set *result to NULL.
int getgrgid_r(gid_t gid, struct group* group, char* buf, size_t buflen, struct group ** result);
///@brief Provides the same information as getgrnam but it stores the
/// results inside group, and the string information are store store
/// inside `buf`.
///@param name The name to search inside the database.
///@param group The structure containing pointers to the entry fields.
///@param buf The buffer where the strings should be stored.
///@param buflen The lenght of the buffer.
///@param result A pointer to the result or NULL is stored here.
///@return If the entry was found returns zero and set *result to group,
/// if the entry was not found returns zero and set *result to NULL,
/// on failure returns a number and sets and set *result to NULL.
int getgrnam_r(const char* name, struct group* group, char* buf, size_t buflen, struct group** result);
///@brief Returns a pointer to a structure containing the broken-out
/// fields of an entry in the group database.
/// When first called returns a pointer to a group structure
/// containing the first entry in the group database.
/// Thereafter, it returns a pointer to a group structure
/// containing the next group structure in the group database,
/// so successive calls may be used to search the entire database.
struct group* getgrent(void);
///@brief Rewinds the group database to allow repeated searches.
void endgrent(void);
///@brief May be called to close the group database when processing is complete.
void setgrent(void);
+27
View File
@@ -0,0 +1,27 @@
/// MentOS, The Mentoring Operating system project
/// @file mm_io.h
/// @brief Memory Mapped IO functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stdint.h"
/// @brief Reads a 8-bit value from the given address.
uint8_t in_memb(uint32_t addr);
/// @brief Reads a 16-bit value from the given address.
uint16_t in_mems(uint32_t addr);
/// @brief Reads a 32-bit value from the given address.
uint32_t in_meml(uint32_t addr);
/// @brief Writes a 8-bit value at the given address.
void out_memb(uint32_t addr, uint8_t value);
/// @brief Writes a 16-bit value at the given address.
void out_mems(uint32_t addr, uint16_t value);
/// @brief Writes a 32-bit value at the given address.
void out_meml(uint32_t addr, uint32_t value);
+43
View File
@@ -0,0 +1,43 @@
/// MentOS, The Mentoring Operating system project
/// @file port_io.h
/// @brief Byte I/O on ports prototypes.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stdint.h"
/// @brief Used for reading from the I/O ports.
/// @param port The input port.
/// @return The read value.
uint8_t inportb(uint16_t port);
/// @brief Used for reading 2 bytes from the I/O ports.
/// @param port The input port.
/// @return The read value.
uint16_t inports(uint16_t port);
void inportsm(uint16_t port, uint8_t *data, unsigned long size);
/// @brief Used for reading 4 bytes from the I/O ports.
/// @param port The input port.
/// @return The read value.
uint32_t inportl(uint16_t port);
/// @brief Use this to write to I/O ports to send bytes to devices.
/// @param port The output port.
/// @param data The data to write.
void outportb(uint16_t port, uint8_t data);
/// @brief Use this to write to I/O ports to send 2 bytes to devices.
/// @param port The output port.
/// @param data The data to write.
void outports(uint16_t port, uint16_t data);
void outportsm(uint16_t port, uint8_t *data, uint16_t size);
/// @brief Use this to write to I/O ports to send 4 bytes to devices.
/// @param port The output port.
/// @param data The data to write.
void outportl(uint16_t port, uint32_t data);
+25
View File
@@ -0,0 +1,25 @@
/// MentOS, The Mentoring Operating system project
/// @file ipc.h
/// @brief Inter-Process Communication (IPC) structures.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Permission details of an IPC object.
struct ipc_perm {
/// Key supplied to msgget(2).
key_t __key;
/// Effective UID of owner.
uid_t uid;
/// Effective GID of owner.
gid_t gid;
/// Effective UID of creator.
uid_t cuid;
/// Effective GID of creator.
gid_t cgid;
/// Permissions.
unsigned short mode;
/// Sequence number.
unsigned short __seq;
};
+70
View File
@@ -0,0 +1,70 @@
/// MentOS, The Mentoring Operating system project
/// @file msg.h
/// @brief Definition of structure for managing message queues.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "sys/types.h"
#include "stddef.h"
#include "time.h"
#include "ipc.h"
/// Type for storing the number of messages in a message queue.
typedef unsigned int msgqnum_t;
/// Type for storing the number of bytes in a message queue.
typedef unsigned int msglen_t;
/// @brief Buffer to use with the message queue IPC.
struct msgbuf {
/// Type of the message.
long mtype;
/// Text of the message.
char mtext[1];
};
/// @brief Message queue data structure.
struct msqid_ds {
/// Ownership and permissions.
struct ipc_perm msg_perm;
/// Time of last msgsnd(2).
time_t msg_stime;
/// Time of last msgrcv(2).
time_t msg_rtime;
/// Time of creation or last modification by msgctl().
time_t msg_ctime;
/// Number of bytes in queue.
unsigned long msg_cbytes;
/// Number of messages in queue.
msgqnum_t msg_qnum;
/// Maximum number of bytes in queue.
msglen_t msg_qbytes;
/// PID of last msgsnd(2).
pid_t msg_lspid;
/// PID of last msgrcv(2).
pid_t msg_lrpid;
};
#ifdef __KERNEL__
long sys_msgget(key_t key, int msgflg);
long sys_msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
long sys_msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
long sys_msgctl(int msqid, int cmd, struct msqid_ds *buf);
#else
long msgget(key_t key, int msgflg);
long msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
long msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
long msgctl(int msqid, int cmd, struct msqid_ds *buf);
#endif
+40
View File
@@ -0,0 +1,40 @@
/// MentOS, The Mentoring Operating system project
/// @file sem.h
/// @brief Definition of structure for managing semaphores.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "sys/types.h"
#include "stddef.h"
#include "time.h"
#include "ipc.h"
/// @brief Buffer to use with the semaphore IPC.
struct sembuf {
/// Semaphore index in array.
unsigned short sem_num;
/// Semaphore operation.
short sem_op;
/// Operation flags.
short sem_flg;
};
#ifdef __KERNEL__
long sys_semget(key_t key, int nsems, int semflg);
long sys_semop(int semid, struct sembuf *sops, unsigned nsops);
long sys_semctl(int semid, int semnum, int cmd, unsigned long arg);
#else
long semget(key_t key, int nsems, int semflg);
long semop(int semid, struct sembuf *sops, unsigned nsops);
long semctl(int semid, int semnum, int cmd, unsigned long arg);
#endif
+157
View File
@@ -0,0 +1,157 @@
/// MentOS, The Mentoring Operating system project
/// @file shm.h
/// @brief Definition of structure for managing shared memories.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "sys/types.h"
#include "stddef.h"
#include "time.h"
#include "ipc.h"
/// Data type for storing the number of attaches.
typedef unsigned long shmatt_t;
/// @brief Shared memory data structure.
struct shmid_ds {
/// Operation permission struct.
struct ipc_perm shm_perm;
/// Size of segment in bytes.
size_t shm_segsz;
/// Time of last shmat().
time_t shm_atime;
/// Time of last shmdt().
time_t shm_dtime;
/// Time of last change by shmctl().
time_t shm_ctime;
/// Pid of creator.
pid_t shm_cpid;
/// Pid of last shmop.
pid_t shm_lpid;
/// Number of current attaches.
shmatt_t shm_nattch;
/// Pointer to the next shared memory data structure.
struct shmid_ds *next;
/// Where shm created is memorized, should be a file.
void *shm_location;
};
#if 0
#include "ipc.h"
#include "debug.h"
#include "time.h"
#include "kheap.h"
#include "stddef.h"
#include "paging.h"
#include "syscall.h"
#include "scheduler.h"
//======== Permission flag for shmget ==========================================
// or S_IRUGO from <linux/stat.h>.
#define SHM_R 0400
// or S_IWUGO from <linux/stat.h>.
#define SHM_W 0200
//==============================================================================
//======== Flags for shmat =====================================================
// Attach read-only else read-write.
#define SHM_RDONLY 010000
// Round attach address to SHMLBA.
#define SHM_RND 020000
// Take-over region on attach.
#define SHM_REMAP 040000
// Execution access.
#define SHM_EXEC 0100000
//==============================================================================
//======== Commands for shmctl =================================================
// Lock segment (root only).
#define SHM_LOCK 11
// Unlock segment (root only).
#define SHM_UNLOCK 12
//==============================================================================
// Ipcs ctl commands.
#define SHM_STAT 13
#define SHM_INFO 14
#define SHM_STAT_ANY 15
//======== shm_mode upper byte flags ===========================================
// segment will be destroyed on last detach.
#define SHM_DEST 01000
// Segment will not be swapped.
#define SHM_LOCKED 02000
// Segment is mapped via hugetlb.
#define SHM_HUGETLB 04000
// Don't check for reservations.
#define SHM_NORESERVE 010000
/// @@brief Syscall Service Routine: Shared memory control operation.
int syscall_shmctl(int *args);
/// @@brief Syscall Service Routine: Get shared memory segment.
int syscall_shmget(int *args);
/// @@brief Syscall Service Routine: Attach shared memory segment.
void *syscall_shmat(int *args);
/// @@brief Syscall Service Routine: Detach shared memory segment.
int syscall_shmdt(int *args);
/// @@brief User Wrapper: Shared memory control operation.
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
/// @@brief User Wrapper: Get shared memory segment.
int shmget(key_t key, size_t size, int flags);
/// @@brief User Wrapper: Attach shared memory segment.
void *shmat(int shmid, void *shmaddr, int flag);
/// @@brief User Wrapper: Detach shared memory segment.
int shmdt(void *shmaddr);
/// @@brief Find shmid_ds on list.
struct shmid_ds *find_shm_fromid(int shmid);
/// @@brief Find shmid_ds on list.
struct shmid_ds *find_shm_fromkey(key_t key);
/// @@brief shmid_ds on list.
struct shmid_ds *find_shm_fromvaddr(void *shmvaddr);
#endif
#ifdef __KERNEL__
long sys_shmat(int shmid, char *shmaddr, int shmflg);
long sys_shmget(key_t key, size_t size, int flag);
long sys_shmdt(char *shmaddr);
long sys_shmctl(int shmid, int cmd, struct shmid_ds *buf);
#else
long shmat(int shmid, char *shmaddr, int shmflg);
long shmget(key_t key, size_t size, int flag);
long shmdt(char *shmaddr);
long shmctl(int shmid, int cmd, struct shmid_ds *buf);
#endif
+41
View File
@@ -0,0 +1,41 @@
/// MentOS, The Mentoring Operating system project
/// @file libgen.h
/// @brief String routines.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#include "stddef.h"
// TODO: doxygen comment.
/// @brief
/// @param out
/// @param cur
/// @param sep
/// @param max
/// @result
int parse_path(char *out, char **cur, char sep, size_t max);
// TODO: doxygen comment.
/// @brief
/// @param path
/// @result
char *dirname(const char *path);
// TODO: doxygen comment.
/// @brief
/// @param path
/// @result
char *basename(const char *path);
/// @brief Return the canonicalized absolute pathname.
/// @param path The path we are canonicalizing.
/// @param resolved The canonicalized path.
/// @return
/// If there is no error, realpath() returns a pointer to the resolved.
/// Otherwise, it returns NULL, the contents of the array resolved
/// are undefined, and errno is set to indicate the error.
/// @details
/// If resolved is NULL, then realpath() uses malloc
/// to allocate a buffer of up to PATH_MAX bytes to hold the
/// resolved pathname, and returns a pointer to this buffer.
char *realpath(const char *path, char *resolved);
+58
View File
@@ -0,0 +1,58 @@
/// MentOS, The Mentoring Operating system project
/// @file limits.h
/// @brief OS numeric limits.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// Number of bits in a `char'.
#define CHAR_BIT 8
/// Minimum value a `signed char' can hold.
#define SCHAR_MIN -128
/// Maximum value a `signed char' can hold.
#define SCHAR_MAX +127
/// Minimum value a `signed char' can hold.
#define CHAR_MIN SCHAR_MIN
/// Maximum value a `signed char' can hold.
#define CHAR_MAX SCHAR_MAX
/// Maximum value a `char' can hold.
#define UCHAR_MAX 255
/// Minimum value a `signed short int' can hold.
#define SHRT_MIN (-32768)
/// Maximum value a `signed short int' can hold.
#define SHRT_MAX (+32767)
/// Maximum value a `unsigned short int' can hold.
#define USHRT_MAX 65535
/// Minimum value a `signed int' can hold.
#define INT_MIN (-2147483648)
/// Maximum values a `signed int' can hold.
#define INT_MAX (+2147483647)
/// Maximum value an `unsigned int' can hold.
#define UINT_MAX (+2147483647)
/// Maximum value a `signed long int' can hold.
#define LONG_MIN (-2147483648L)
/// Minimum value a `signed long int' can hold.
#define LONG_MAX (+2147483647L)
/// Maximum number of characters in a file name.
#define NAME_MAX 255
/// Maximum number of characters in a path name.
#define PATH_MAX 4096
/// Maximum pid number.
#define PID_MAX_LIMIT 32768
+158
View File
@@ -0,0 +1,158 @@
/// MentOS, The Mentoring Operating system project
/// @file math.h
/// @brief Mathematical constants and functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief The absolute value.
#define abs(a) (((a) < 0) ? -(a) : (a))
/// @brief The max of the two values.
#define max(a, b) (((a) > (b)) ? (a) : (b))
/// @brief The min of the two values.
#define min(a, b) (((a) < (b)) ? (a) : (b))
/// @brief The sign the the passed value.
#define sign(x) ((x < 0) ? -1 : ((x > 0) ? 1 : 0))
/// @brief e
#define M_E 2.7182818284590452354
/// @brief log_2 e
#define M_LOG2E 1.4426950408889634074
/// @brief log_10 e
#define M_LOG10E 0.43429448190325182765
/// @brief log_e 2
#define M_LN2 0.69314718055994530942
/// @brief log_e 10
#define M_LN10 2.30258509299404568402
/// @brief pi
#define M_PI 3.14159265358979323846
/// @brief pi / 2
#define M_PI_2 1.57079632679489661923
/// @brief pi / 4
#define M_PI_4 0.78539816339744830962
/// @brief 1 / pi
#define M_1_PI 0.31830988618379067154
/// @brief 2 / pi
#define M_2_PI 0.63661977236758134308
/// @brief 2 / sqrt(pi)
#define M_2_SQRTPI 1.12837916709551257390
/// @brief sqrt(2)
#define M_SQRT2 1.41421356237309504880
/// @brief 1 / sqrt(2)
#define M_SQRT1_2 0.70710678118654752440
/// @brief Returns the integral value that is nearest to x, with
/// halfway cases rounded away from zero.
/// @param x Value to round.
/// @result The value of x rounded to the nearest integral
/// (as a floating-point value).
double round(double x);
/// @brief Rounds x upward, returning the smallest integral value
/// that is not less than x.
/// @param x Value to round up.
/// @return The smallest integral value that is not less than x
/// (as a floating-point value).
double ceil(double x);
/// @brief Rounds x downward, returning the largest integral value
/// that is not greater than x.
/// @param x Value to round down.
/// @return The value of x rounded downward (as a floating-point value).
double floor(double x);
/// @brief Returns base raised to the power exponent:
/// @param base Base value.
/// @param exponent Exponent value.
/// @result The result of raising base to the power exponent.
/// @details
/// If the base is finite negative and the exponent is finite but not an
/// integer value, it causes a domain error.
/// If both base and exponent are zero, it may also cause a domain error
/// on certain implementations.
/// If base is zero and exponent is negative, it may cause a domain error
/// or a pole error (or none, depending on the library implementation).
/// The function may also cause a range error if the result is too great
/// or too small to be represented by a value of the return type.
double pow(double base, double exponent);
/// @brief Returns the base-e exponential function of x, which is e raised
/// to the power x: e^x.
/// @param x Value of the exponent.
/// @return Exponential value of x.
/// @details
/// If the magnitude of the result is too large to be represented by a value
/// of the return type, the function returns HUGE_VAL (or HUGE_VALF or
/// HUGE_VALL) with the proper sign, and an overflow range error occurs and
/// the global variable errno is set to ERANGE.
double exp(double x);
/// @brief Returns the absolute value of x: |x|.
/// @param x Value whose absolute value is returned.
/// @result The absolute value of x.
double fabs(double x);
/// @brief Returns the absolute value of x: |x|.
/// @param x Value whose absolute value is returned.
/// @result The absolute value of x.
float fabsf(float x);
/// @brief Returns the square root of x.
/// @param x Value whose square root is computed.
/// @return Square root of x. If x is negative, the global variable errno
/// is set to EDOM.
double sqrt(double x);
/// @brief Returns the square root of x.
/// @param x Value whose square root is computed.
/// @return Square root of x. If x is negative, the global variable errno
/// is set to EDOM.
float sqrtf(float x);
/// @brief Checks if the input value is Infinite (INF).
/// @param x The value to check.
/// @return 1 if INF, 0 otherwise.
int isinf(double x);
/// @brief Checks if the input value is Not A Number (NAN).
/// @param x The value to check.
/// @return 1 if NAN, 0 otherwise.
int isnan(double x);
/// @brief Logarithm function in base 10.
/// @param x Topic of the logarithm function.
/// @return Return the result.
double log10(double x);
/// @brief Natural logarithm function.
/// @param x Topic of the logarithm function.
/// @return Return the result.
double ln(double x);
/// @brief Logarithm function in base x.
/// @param x Base of the logarithm.
/// @param y Topic of the logarithm function.
/// @return Return the result.
double logx(double x, double y);
/// @brief Breaks x into an integral and a fractional part, both parts have the same sign as x.
/// @param x The value we want to break.
/// @param intpart Where we store the integer part.
/// @return the fractional part.
double modf(double x, double *intpart);
+56
View File
@@ -0,0 +1,56 @@
/// MentOS, The Mentoring Operating system project
/// @file pwd.h
/// @brief Contains the structure and functions for managing passwords.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stddef.h"
/// @brief Stores user account information.
typedef struct passwd_t {
char *pw_name; ///< User's login name.
char *pw_passwd; ///< Encrypted password (not currently).
uid_t pw_uid; ///< User ID.
gid_t pw_gid; ///< Group ID.
char *pw_gecos; ///< User's full name.
char *pw_dir; ///< User's login directory.
char *pw_shell; ///< User's login shell.
} passwd_t;
/// @brief Provides access to the password database entry for `name`.
/// @param name The name to search inside the database.
/// @return A pointer to the structure containing the database entry.
passwd_t *getpwnam(const char *name);
/// @brief Provides access to the password database entry for `uid`.
/// @param uid The uid to search inside the database.
/// @return A pointer to the structure containing the database entry.
passwd_t *getpwuid(uid_t uid);
/// @brief Provides the same information as getpwnam but it stores the
/// results inside pwd, and the string information are store store
/// inside `buf`.
/// @param name The name to search inside the database.
/// @param pwd The structure containing pointers to the entry fields.
/// @param buf The buffer where the strings should be stored.
/// @param buflen The lenght of the buffer.
/// @param result A pointer to the result or NULL is stored here.
/// @return If the entry was found returns zero and set *result to pwd,
/// if the entry was not found returns zero and set *result to NULL,
/// on failure returns a number and sets and set *result to NULL.
int getpwnam_r(const char *name, passwd_t *pwd, char *buf, size_t buflen, passwd_t **result);
/// @brief Provides the same information as getpwuid but it stores the
/// results inside pwd, and the string information are store store
/// inside `buf`.
/// @param uid The uid to search inside the database.
/// @param pwd The structure containing pointers to the entry fields.
/// @param buf The buffer where the strings should be stored.
/// @param buflen The lenght of the buffer.
/// @param result A pointer to the result or NULL is stored here.
/// @return If the entry was found returns zero and set *result to pwd,
/// if the entry was not found returns zero and set *result to NULL,
/// on failure returns a number and sets and set *result to NULL.
int getpwuid_r(uid_t uid, passwd_t *pwd, char *buf, size_t buflen, passwd_t **result);
+29
View File
@@ -0,0 +1,29 @@
/// MentOS, The Mentoring Operating system project
/// @file sched.h
/// @brief Structures and functions for managing the scheduler.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#include "sys/types.h"
#include "time.h"
#include "stdbool.h"
/// @brief Structure that describes scheduling parameters.
typedef struct sched_param_t {
/// Static execution priority.
int sched_priority;
/// Expected period of the task
time_t period;
/// Absolute deadline
time_t deadline;
/// Absolute time of arrival of the task
time_t arrivaltime;
/// Is task periodic?
bool_t is_periodic;
} sched_param_t;
int sched_setparam(pid_t pid, const sched_param_t *param);
int sched_getparam(pid_t pid, sched_param_t *param);
int waitperiod();
+273
View File
@@ -0,0 +1,273 @@
/// MentOS, The Mentoring Operating system project
/// @file signal.h
/// @brief Signals definition.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "sys/types.h"
/// @brief List of signals.
typedef enum {
SIGHUP = 1, ///< Hang up detected on controlling terminal or death of controlling process.
SIGINT = 2, ///< Issued if the user sends an interrupt signal (Ctrl + C).
SIGQUIT = 3, ///< Issued if the user sends a quit signal (Ctrl + D).
SIGILL = 4, ///< Illegal Instruction.
SIGTRAP = 5, ///< Trace/breakpoint trap.
SIGABRT = 6, ///< Abort signal from abort().
SIGEMT = 7, ///< Emulator trap.
SIGFPE = 8, ///< Floating-point arithmetic exception.
SIGKILL = 9, ///< If a process gets this signal it must quit immediately and will not perform any clean-up operations.
SIGBUS = 10, ///< Bus error (bad memory access).
SIGSEGV = 11, ///< Invalid memory reference.
SIGSYS = 12, ///< Bad system call (SVr4).
SIGPIPE = 13, ///< Broken pipe: write to pipe with no readers.
SIGALRM = 14, ///< Alarm clock signal (used for timers).
SIGTERM = 15, ///< Software termination signal (sent by kill by default).
SIGUSR1 = 16, ///< User-defined signal 1.
SIGUSR2 = 17, ///< User-defined signal 2.
SIGCHLD = 18, ///< Child stopped or terminated.
SIGPWR = 19, ///< Power failure.
SIGWINCH = 20, ///< Window resize signal.
SIGURG = 21, ///< Urgent condition on socket.
SIGPOLL = 22, ///< Pollable event.
SIGSTOP = 23, ///< Stop process.
SIGTSTP = 24, ///< Stop typed at terminal.
SIGCONT = 25, ///< Continue if stopped.
SIGTTIN = 26, ///< Terminal input for background process.
SIGTTOU = 27, ///< Terminal output for background process.
SIGVTALRM = 28, ///< Virtual alarm clock.
SIGPROF = 29, ///< Profiling timer expired.
SIGXCPU = 30, ///< CPU time limit exceeded.
SIGXFSZ = 31, ///< File size limit exceeded.
NSIG
} signal_type_t;
/// @brief Codes that indentify the sender of a signal.
typedef enum {
SI_NOINFO, ///< Unable to determine complete signal information.
// Signal : -
// Enabled fields : si_pid, si_uid
SI_USER, ///< Signal sent by kill(), pthread_kill(), raise(), abort() or alarm().
// Signal : -
// Enabled fields : -
SI_KERNEL, ///< Generic kernel function
// Signal : -
// Enabled fields : si_pid, si_uid, si_value
SI_QUEUE, ///< Signal was sent by sigqueue().
SI_TIMER, ///< Signal was generated by expiration of a timer set by timer_settimer().
SI_ASYNCIO, ///< Signal was generated by completion of an asynchronous I/O request.
SI_MESGQ, ///< Signal was generated by arrival of a message on an empty message queue.
// Signal : SIGILL
// Enabled fields : si_addr (address of failing instruction)
ILL_ILLOPC, ///< Illegal opcode.
ILL_ILLOPN, ///< Illegal operand.
ILL_ILLADR, ///< Illegal addressing mode.
ILL_ILLTRP, ///< Illegal trap.
ILL_PRVOPC, ///< Privileged opcode.
ILL_PRVREG, ///< Privileged register.
ILL_COPROC, ///< Coprocessor error.
ILL_BADSTK, ///< Internal stack error.
// Signal : SIGFPE
// Enabled fields : si_addr (address of failing instruction)
FPE_INTDIV, ///< Integer divide-by-zero.
FPE_INTOVF, ///< Integer overflow.
FPE_FLTDIV, ///< Floating point divide-by-zero.
FPE_FLTOVF, ///< Floating point overflow.
FPE_FLTUND, ///< Floating point underflow.
FPE_FLTRES, ///< Floating point inexact result.
FPE_FLTINV, ///< Invalid floating point operation.
FPE_FLTSUB, ///< Subscript out of range.
// Signal : SIGSEGV
// Enabled fields : si_addr (address of faulting memory reference)
SEGV_MAPERR, ///< Address not mapped.
SEGV_ACCERR, ///< Invalid permissions.
// Signal : SIGBUS
// Enabled fields : si_addr (address of faulting memory reference)
BUS_ADRALN, ///< Invalid address alignment.
BUS_ADRERR, ///< Non-existent physical address.
BUS_OBJERR, ///< Object-specific hardware error.
// Signal : SIGTRAP
// Enabled fields : -
TRAP_BRKPT, ///< Process breakpoint.
TRAP_TRACE, ///< Process trace trap.
// Signal : SIGCHLD
// Enabled fields : si_pid (child process ID)
// si_uid (real user ID of process that sent the signal)
// si_status (exit value or signal)
CLD_EXITED, ///< Child has exited.
CLD_KILLED, ///< Child has terminated abnormally and did not create a core file.
CLD_DUMPED, ///< Child has terminated abnormally and created a core file.
CLD_TRAPPED, ///< Traced child has trapped.
CLD_STOPPED, ///< Child has stopped.
CLD_CONTINUED, ///< Stopped child has continued.
// Signal : SIGIO/SIGPOLL
// Enabled fields : si_band
POLL_IN, ///< Data input available.
POLL_OUT, ///< Output buffers available.
POLL_MSG, ///< Input message available.
POLL_ERR, ///< I/O error.
POLL_PRI, ///< High priority input available.
POLL_HUP, ///< Device disconnected.
} signal_sender_code_t;
/// @brief Defines what to do with the provided signal mask.
typedef enum {
/// @brief The set of blocked signals is the union of the current set
/// and the set argument.
SIG_BLOCK,
/// @brief The signals in set are removed from the current set of
/// blocked signals. It is permissible to attempt to unblock
/// a signal which is not blocked.
SIG_UNBLOCK,
/// @brief The set of blocked signals is set to the argument set.
SIG_SETMASK
} sigmask_how_t;
/// @defgroup SigactionFlags Flags associated with a sigaction.
/// @{
#define SA_NOCLDSTOP 0x00000001U ///< Turn off SIGCHLD when children stop.
#define SA_NOCLDWAIT 0x00000002U ///< Flag on SIGCHLD to inhibit zombies.
#define SA_SIGINFO 0x00000004U ///< sa_sigaction specifies the signal-handling function for signum.
#define SA_ONSTACK 0x08000000U ///< Indicates that a registered stack_t will be used.
#define SA_RESTART 0x10000000U ///< Flag to get restarting signals (which were the default long ago)
#define SA_NODEFER 0x40000000U ///< Prevents the current signal from being masked in the handler.
#define SA_RESETHAND 0x80000000U ///< Clears the handler when the signal is delivered.
/// @}
/// Type of a signal handler.
typedef void (*sighandler_t)(int);
#define SIG_DFL ((sighandler_t)0) ///< Default signal handling.
#define SIG_IGN ((sighandler_t)1) ///< Ignore signal.
#define SIG_ERR ((sighandler_t)-1) ///< Error return from signal.
/// @brief Structure used to mask and unmask signals.
/// @details
/// Each unsigned long consists of 32 bits, thus, the maximum number of signals
/// that may be declared is 64.
/// Signals are divided into two cathegories, identified by the two unsigned longs:
/// [ 1, 31] corresponds to normal signals;
/// [32, 64] corresponds to real-time signals.
typedef struct sigset_t {
/// Signals divided into two cathegories.
unsigned long sig[2];
} sigset_t;
/// @brief Holds the information on how to handle a specific signal.
typedef struct sigaction_t {
/// This field specifies the type of action to be performed; its value can be a pointer
/// to the signal handler, SIG_DFL (that is, the value 0) to specify that the default
/// action is performed, or SIG_IGN (that is, the value 1) to specify that the signal is
/// ignored.
sighandler_t sa_handler;
/// This sigset_t variable specifies the signals to be masked when running the signal handler
sigset_t sa_mask;
/// This set of flags specifies how the signal must be handled;
unsigned int sa_flags;
} sigaction_t;
/// @brief Data passed with signal info.
typedef union sigval {
int sival_int; ///< Integer value.
void *sival_ptr; ///< Pointer value.
} sigval_t;
/// @brief Stores information about an occurrence of a specific signal.
typedef struct siginfo_t {
/// The signal number.
int si_signo;
/// A code identifying who raised the signal (see signal_sender_code_t).
int si_code;
/// Signal value.
sigval_t si_value;
/// The error code of the instruction that caused the signal to be raised, or 0 if there was no error.
int si_errno;
/// Process ID of sending process.
pid_t si_pid;
/// Real user ID of sending process.
uid_t si_uid;
/// Address at which fault occurred.
void *si_addr;
/// Exit value or signal for process termination.
int si_status;
/// Band event for SIGPOLL/SIGIO.
int si_band;
} siginfo_t;
/// @brief Send signal to a process.
/// @param pid The pid of the process to which we send the signal.
/// @param sig The type of signal to send.
/// @return On success 0, on error -1 and errno is set appropriately.
int kill(pid_t pid, int sig);
/// @brief Sets the disposition of the signal signum to handler.
/// @param signum The signal number.
/// @param handler The handler for the signal.
/// @return The previous value of the signal handler, or SIG_ERR on error.
sighandler_t signal(int signum, sighandler_t handler);
/// @brief Examine and change a signal action.
/// @param signum Specifies the signal and can be any valid signal except SIGKILL and SIGSTOP.
/// @param act If non-NULL, the new action for signal signum is installed from act.
/// @param oldact If non-NULL, the previous action is saved in oldact.
/// @return returns 0 on success; on error, -1 is returned, and errno is set to indicate the error.
int sigaction(int signum, const sigaction_t *act, sigaction_t *oldact);
/// @brief Examine and change blocked signals.
/// @param how Determines the behavior of the call.
/// @param set The set of signals to manage by the function.
/// @param oldset If non-NULL, the previous value of the signal mask is stored here.
/// @return returns 0 on success, and -1 on error (errno is set to indicate the cause).
/// @details
/// If set is NULL, then the signal mask is unchanged (i.e., how is
/// ignored), but the current value of the signal mask is
/// nevertheless returned in oldset (if it is not NULL).
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/// @brief Returns the string describing the given signal.
/// @param sig The signal to inquire.
/// @return String representing the signal.
const char *strsignal(int sig);
/// @brief Prepare an empty set.
/// @param set The set to manipulate.
/// @return 0 on success and -1 on error.
int sigemptyset(sigset_t *set);
/// @brief Prepare a full set.
/// @param set The set to manipulate.
/// @return 0 on success and -1 on error.
int sigfillset(sigset_t *set);
/// @brief Adds the given signal to the correct set.
/// @param set The set to manipulate.
/// @param signum The signalt to handle.
/// @return 0 on success and -1 on error.
int sigaddset(sigset_t *set, int signum);
/// @brief Removes the given signal to the correct set.
/// @param set The set to manipulate.
/// @param signum The signalt to handle.
/// @return 0 on success and -1 on error.
int sigdelset(sigset_t *set, int signum);
/// @brief Checks if the given signal is part of the set.
/// @param set The set to manipulate.
/// @param signum The signalt to handle.
/// @return 1 if signum is a member of set,
/// 0 if signum is not a member, and -1 on error.
int sigismember(sigset_t *set, int signum);
+28
View File
@@ -0,0 +1,28 @@
/// MentOS, The Mentoring Operating system project
/// @file stdarg.h
/// @brief Contains the macros required to manage variable number of arguments.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief The va_list type is an array containing a single element of one
/// structure containing the necessary information to implement the
/// va_arg macro.
typedef char *va_list;
/// @brief The type of the item on the stack.
#define va_item int
/// @brief Amount of space required in an argument list (ie. the stack) for an
/// argument of type t.
#define va_size(t) \
(((sizeof(t) + sizeof(va_item) - 1) / sizeof(va_item)) * sizeof(va_item))
/// @brief The start of a variadic list.
#define va_start(ap, last_arg) (ap = ((va_list)(&last_arg) + va_size(last_arg)))
/// @brief The end of a variadic list.
#define va_end(ap) ((void)0)
/// @brief The argument of a variadic list.
#define va_arg(ap, t) (ap += va_size(t), *((t *)(ap - va_size(t))))
+13
View File
@@ -0,0 +1,13 @@
/// MentOS, The Mentoring Operating system project
/// @file stdbool.h
/// @brief Defines the boolean values.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Define boolean value.
typedef enum bool_t {
false, ///< [0] False.
true ///< [1] True.
} __attribute__((__packed__)) bool_t;
+71
View File
@@ -0,0 +1,71 @@
/// MentOS, The Mentoring Operating system project
/// @file stddef.h
/// @brief Define basic data types.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#ifndef NULL
/// @brief Define NULL.
#define NULL ((void *)0)
#endif
#ifndef EOF
/// @brief Define End-Of-File.
#define EOF (-1)
#endif
/// @brief Define the size of a buffer.
#define BUFSIZ 512
/// Is the signed integer type of the result of subtracting two pointers.
typedef long signed int ptrdiff_t;
/// Define the byte type.
typedef unsigned char byte_t;
/// Define the generic size type.
typedef unsigned long size_t;
/// Define the generic signed size type.
typedef long ssize_t;
/// Define the type of an inode.
typedef unsigned int ino_t;
/// Used for device IDs.
typedef unsigned int dev_t;
/// The type of user-id.
typedef unsigned int uid_t;
/// The type of group-id.
typedef unsigned int gid_t;
/// The type of offset.
typedef long int off_t;
/// The type of mode.
typedef unsigned int mode_t;
/// This data-type is used to set protection bits of pages.
typedef unsigned int pgprot_t;
/// It evaluates to the offset (in bytes) of a given member within
/// a struct or union type, an expression of type size_t.
#define offsetof(type, member) \
((size_t) & (((type *)0)->member))
/// Retrieve an enclosing structure from a pointer to a nested element.
#if 1
#define container_of(ptr, type, member) \
((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))
#else
#define container_of(ptr, type, member) \
((type *)((char *)ptr - offsetof(type, member)))
#endif
/// Returns the alignment, in bytes, of the specified type.
#define alignof(type) offsetof( \
struct { char c; type member; }, member)
+37
View File
@@ -0,0 +1,37 @@
/// MentOS, The Mentoring Operating system project
/// @file stdint.h
/// @brief Standard integer data-types.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Define the signed 64-bit integer.
typedef int int64_t;
/// @brief Define the unsigned 64-bit integer.
typedef unsigned int uint64_t;
/// @brief Define the signed 32-bit integer.
typedef int int32_t;
/// @brief Define the unsigned 32-bit integer.
typedef unsigned int uint32_t;
/// @brief Define the signed 16-bit integer.
typedef short int16_t;
/// @brief Define the unsigned 16-bit integer.
typedef unsigned short uint16_t;
/// @brief Define the signed 8-bit integer.
typedef char int8_t;
/// @brief Define the unsigned 8-bit integer.
typedef unsigned char uint8_t;
/// @brief Define the signed 32-bit pointer.
typedef signed intptr_t;
/// @brief Define the unsigned 32-bit pointer.
typedef unsigned uintptr_t;
+129
View File
@@ -0,0 +1,129 @@
/// MentOS, The Mentoring Operating system project
/// @file stdio.h
/// @brief Standard I/0 functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stdarg.h"
#include "stddef.h"
/// @brief The maximum number of digits of an integer.
#define MAX_DIGITS_IN_INTEGER 11
/// @brief The size of 'gets' buffer.
#define GETS_BUFFERSIZE 255
#ifndef EOF
/// @brief Define the End-Of-File.
#define EOF (-1)
#endif
#define SEEK_SET 0 ///< The file offset is set to offset bytes.
#define SEEK_CUR 1 ///< The file offset is set to its current location plus offset bytes.
#define SEEK_END 2 ///< The file offset is set to the size of the file plus offset bytes.
/// @brief Writes the given character to the standard output (stdout).
/// @param character The character to send to stdout.
void putchar(int character);
/// @brief Writes the string pointed by str to the standard output (stdout)
/// and appends a newline character.
/// @param str The string to send to stdout.
void puts(char *str);
/// @brief Returns the next character from the standard input (stdin).
/// @return The character received from stdin.
int getchar();
/// @brief Reads characters from the standard input (stdin).
/// @param str Where the characters are stored.
/// @return The string received from standard input.
char *gets(char *str);
#ifndef __KERNEL__
/// @brief Same as getchar but reads from the given file descriptor.
/// @param fd The file descriptor from which it reads.
/// @return The read character.
int fgetc(int fd);
/// @brief Same as gets but reads from the given file descriptor.
/// @param buf The buffer where the string should be placed.
/// @param n The amount of characters to read.
/// @param fd The file descriptor from which it reads.
/// @return The read string.
char *fgets(char *buf, int n, int fd);
#endif
/// @brief Convert the given string to an integer.
/// @param str The string to convert.
/// @return The integer contained inside the string.
int atoi(const char *str);
/// @brief Converts the initial part of `str` to a long int value according to
/// the given base, which.
/// @param str This is the string containing the integral number.
/// @param endptr Set to the character after the numerical value.
/// @param base The base must be between 2 and 36 inclusive, or special 0.
/// @return Integral number as a long int value, else zero value is returned.
long strtol(const char *str, char **endptr, int base);
/// @brief Write formatted output to stdout.
/// @param fmt The format string.
/// @param ... The list of arguments.
/// @return On success, the total number of characters written is returned.
/// On failure, a negative number is returned.
int printf(const char *fmt, ...);
/// @brief Write formatted output to `str`.
/// @param str The buffer where the formatted string will be placed.
/// @param fmt Format string, following the same specifications as printf.
/// @param ... The list of arguments.
/// @return On success, the total number of characters written is returned.
/// On failure, a negative number is returned.
int sprintf(char *str, const char *fmt, ...);
#ifndef __KERNEL__
/// @brief The same as sprintf, but it putput on file.
/// @param fd The file descriptor associated with the file.
/// @param fmt Format string, following the same specifications as printf.
/// @param ... The list of arguments.
/// @return On success, the total number of characters written is returned.
/// On failure, a negative number is returned.
int fprintf(int fd, const char *fmt, ...);
#endif
/// @brief Write formatted data from variable argument list to string.
/// @param str Pointer to a buffer where the resulting C-string is stored.
/// @param fmt Format string, following the same specifications as printf.
/// @param args A variable arguments list.
/// @return On success, the total number of characters written is returned.
/// On failure, a negative number is returned.
int vsprintf(char *str, const char *fmt, va_list args);
#ifndef __KERNEL__
/// @brief Read formatted input from stdin.
/// @param fmt Format string, following the same specifications as printf.
/// @param ... The list of arguments where the values are stored.
/// @return On success, the function returns the number of items of the
/// argument list successfully filled. EOF otherwise.
int scanf(const char *fmt, ...);
#endif
/// @brief Read formatted data from string.
/// @param str String processed as source to retrieve the data.
/// @param fmt Format string, following the same specifications as printf.
/// @param ... The list of arguments where the values are stored.
/// @return On success, the function returns the number of items of the
/// argument list successfully filled. EOF otherwise.
int sscanf(const char *str, const char *fmt, ...);
#ifndef __KERNEL__
/// @brief The same as sscanf but the source is a file.
/// @param fd The file descriptor associated with the file.
/// @param fmt Format string, following the same specifications as printf.
/// @param ... The list of arguments where the values are stored.
/// @return On success, the function returns the number of items of the
/// argument list successfully filled. EOF otherwise.
int fscanf(int fd, const char *fmt, ...);
#endif
+71
View File
@@ -0,0 +1,71 @@
/// MentOS, The Mentoring Operating system project
/// @file stdlib.h
/// @brief Useful generic functions and macros.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stddef.h"
/// @brief Returns the number of usable bytes in the block pointed to by ptr.
/// @param ptr The pointer for which we want to retrieve the usable size.
/// @return The number of usable bytes in the block of allocated memory
/// pointed to by ptr. If ptr is not a valid pointer, 0 is returned.
size_t malloc_usable_size(void *ptr);
/// @brief Provides dynamically allocated memory.
/// @param size The amount of memory to allocate.
/// @return A pointer to the allocated memory.
void *malloc(unsigned int size);
/// @brief Allocates a block of memory for an array of num elements.
/// @param num The number of elements.
/// @param size The size of an element.
/// @return A pointer to the allocated memory.
void *calloc(size_t num, size_t size);
/// @brief Reallocates the given area of memory.
/// @param ptr The pointer to the memory to reallocate.
/// @param size The new size for the memory.
/// @return A pointer to the new portion of memory.
/// @details
/// It must be previously allocated by malloc(), calloc() or realloc() and
/// not yet freed with a call to free or realloc. Otherwise, the results
/// are undefined.
void *realloc(void *ptr, size_t size);
/// @brief Frees dynamically allocated memory.
/// @param ptr The pointer to the allocated memory.
void free(void *ptr);
/// The maximum value returned by the rand function.
#define RAND_MAX ((1U << 31U) - 1U)
/// @brief Allows to set the seed of the random value generator.
/// @param x The new seed.
void srand(int x);
/// @brief Generates a random value.
/// @return The random value.
int rand();
/// @brief Cause an abnormal program termination with core-dump.
void abort();
/// @brief Tries to adds the variable to the environment.
/// @param name Name of the variable.
/// @param value Value of the variable.
/// @param overwrite Override existing variable value or not.
/// @return Zero on success, or -1 on error with errno indicating the cause.
int setenv(const char *name, const char *value, int overwrite);
/// @brief Tries to remove the variable from the environment.
/// @param name Name of the variable.
/// @return Zero on success, or -1 on error with errno indicating the cause.
int unsetenv(const char *name);
/// @brief Returns the value of the given variable.
/// @param name Name of the variable.
/// @return A pointer to the value, or NULL if there is no match.
char *getenv(const char *name);
+14
View File
@@ -0,0 +1,14 @@
/// MentOS, The Mentoring Operating system project
/// @file strerror.h
/// @brief Contains the function that transfornms an errno into a string.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include <sys/errno.h>
/// @brief Returns the string representing the error number.
/// @param errnum The error number.
/// @return The string representing the error number.
char *strerror(int errnum);
+311
View File
@@ -0,0 +1,311 @@
/// MentOS, The Mentoring Operating system project
/// @file string.h
/// @brief String routines.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stddef.h"
/// @brief Copies the first num characters of source to destination.
/// @param destination Pointer to the destination array where the content is to be copied.
/// @param source String to be copied.
/// @param num Maximum number of characters to be copied from source.
/// @return destination is returned.
char *strncpy(char *destination, const char *source, size_t num);
/// @brief Compares up to n characters of s1 to those of s2.
/// @param s1 First string to be compared.
/// @param s2 Second string to be compared.
/// @param n Maximum number of characters to compare.
/// @return
/// Returns an integral value indicating the relationship between the strings:
/// <0 the first character that does not match has a lower
/// value in s1 than in s2
/// 0 the contents of both strings are equal
/// >0 the first character that does not match has a greater
/// value in s1 than in s2
int strncmp(const char *s1, const char *s2, size_t n);
/// @brief Case insensitive string compare.
/// @param s1 First string to be compared.
/// @param s2 Second string to be compared.
/// @return
/// Returns an integral value indicating the relationship between the strings:
/// <0 the first character that does not match has a lower
/// value in s1 than in s2
/// 0 the contents of both strings are equal
/// >0 the first character that does not match has a greater
/// value in s1 than in s2
int stricmp(const char *s1, const char *s2);
/// @brief Case-insensitively compare up to n characters of s1 to those of s2.
/// @param s1 First string to be compared.
/// @param s2 Second string to be compared.
/// @param n Maximum number of characters to compare.
/// @return
/// Returns an integral value indicating the relationship between the strings:
/// <0 the first character that does not match has a lower
/// value in s1 than in s2
/// 0 the contents of both strings are equal
/// >0 the first character that does not match has a greater
/// value in s1 than in s2
int strnicmp(const char *s1, const char *s2, size_t n);
/// @brief Returns a pointer to the first occurrence of ch in str.
/// @param s The string where the search is performed.
/// @param ch Character to be located.
/// @return A pointer to the first occurrence of character in str.
char *strchr(const char *s, int ch);
/// @brief Returns a pointer to the last occurrence of ch in str.
/// @param s The string where the search is performed.
/// @param ch Character to be located.
/// @return A pointer to the last occurrence of character in str.
char *strrchr(const char *s, int ch);
/// @brief Returns a pointer to the first occurrence of s2 in s1,
/// or NULL if s2 is not part of s1.
/// @param s1 String to be scanned
/// @param s2 String containing the sequence of characters to match.
/// @return A pointer to the first occurrence in s1 of the entire
/// sequence of characters specified in s2, or a null pointer
/// if the sequence is not present in s1.
char *strstr(const char *s1, const char *s2);
/// @brief Returns the length of the initial portion of string which consists
/// only of characters that are part of control.
/// @param string String to be scanned.
/// @param control String containing the characters to match.
/// @return The number of characters in the initial segment of string which
/// consist only of characters from control.
size_t strspn(const char *string, const char *control);
/// @brief Calculates the length of the initial segment of string which
/// consists entirely of characters not in control.
/// @param string String to be scanned.
/// @param control String containing the characters to match.
/// @return The number of characters in the initial segment of string which
/// consist only of characters that are not inside control.
size_t strcspn(const char *string, const char *control);
/// @brief Finds the first character in the string string that matches any
/// character specified in control.
/// @param string String to be scanned.
/// @param control String containing the characters to match.
/// @return
/// A pointer to the first occurrence in string of any of the characters
/// that are part of control, or a null pointer if none of the characters
/// of control is found in string before the terminating null-character.
char *strpbrk(const char *string, const char *control);
/// @brief Make a copy of the given string.
/// @param s String to duplicate.
/// @return On success, returns a pointer to the duplicated string.
/// On failure, returns NULL with errno indicating the cause.
char *strdup(const char *s);
/// @brief Make a copy of at most n bytes of the given string.
/// @param s String to duplicate.
/// @param n The number of character to duplicate.
/// @return On success, returns a pointer to the duplicated string.
/// On failure, returns NULL with errno indicating the cause.
char *strndup(const char *s, size_t n);
/// @brief Appends a copy of the string src to the string dst.
/// @param dst Pointer to the destination array, which should be large enough
/// to contain the concatenated resulting string.
/// @param src String to be appended. This should not overlap dst.
/// @return destination is returned.
char *strcat(char *dst, const char *src);
/// @brief Appends a copy of the string src to the string dst, up to n bytes.
/// @param dst Pointer to the destination array, which should be large enough
/// to contain the concatenated resulting string.
/// @param src String to be appended. This should not overlap dst.
/// @param n The number of bytes to copy.
/// @return destination is returned.
char *strncat(char *dst, const char *src, size_t n);
/// @brief Fill the string s with the character c.
/// @param s The string that you want to fill.
/// @param c The character that you want to fill the string with.
/// @return The address of the string, s.
char *strset(char *s, int c);
/// @brief Fill the string s with the character c, up to the given length n.
/// @param s The string that you want to fill.
/// @param c The character that you want to fill the string with.
/// @param n The maximum number of bytes to fill.
/// @return The address of the string, s.
char *strnset(char *s, int c, size_t n);
/// @brief Reverse the string s.
/// @param s The given string which is needed to be reversed.
/// @return The address of the string, s.
char *strrev(char *s);
/// @brief Splits string into tokens.
/// @param str String to truncate.
/// @param delim String containing the delimiter characters.
/// @return If a token is found, a pointer to the beginning of the token.
/// Otherwise, a null pointer.
/// @details
/// Notice that str is modified by being broken into smaller strings (tokens).
/// A null pointer may be specified, in which case the function continues
/// scanning where a previous successful call to the function ended.
char *strtok(char *str, const char *delim);
/// @brief This function is a reentrant version strtok().
/// @param str String to truncate.
/// @param delim String containing the delimiter characters.
/// @param saveptr Pointer used internally to maintain context between calls.
/// @return
/// @details
/// The saveptr argument is a pointer to a char * variable that is used
/// internally by strtok_r() in order to maintain context between successive
/// calls that parse the same string.
/// On the first call to strtok_r(), str should point to the string to be
/// parsed, and the value of saveptr is ignored. In subsequent calls, str
/// should be NULL, and saveptr should be unchanged since the previous call.
char *strtok_r(char *str, const char *delim, char **saveptr);
/// @brief Copies the values of num bytes from the location pointed by source
/// to the memory block pointed by destination.
/// @param dst Pointer to the destination array where the content is to be
/// copied, type-casted to a pointer of type void*.
/// @param src Pointer to the source of data to be copied, type-casted to
/// a pointer of type const void*.
/// @param n Number of bytes to copy.
/// @return A pointer to dst is returned.
void *memmove(void *dst, const void *src, size_t n);
/// @brief Searches for the first occurrence of the character c (an unsigned
/// char) in the first n bytes of the string pointed to, by the
/// argument str.
/// @param ptr Pointer to the block of memory where the search is performed.
/// @param c Value to be located.
/// @param n Number of bytes to be analyzed.
/// @return A pointer to the first occurrence of value in the block of memory.
void *memchr(const void *ptr, int c, size_t n);
/// @brief Converts a given string into lowercase.
/// @param s String which we want to convert into lowercase.
/// @return A pointer to s.
char *strlwr(char *s);
/// @brief Converts a given string into uppercase.
/// @param s String which we want to convert into uppercase.
/// @return A pointer to s.
char *strupr(char *s);
/// @brief The memccpy function copies no more than n bytes from memory
/// area src to memory area dest, stopping when the character c is
/// found.
/// @param dst Points to the destination memory area.
/// @param src Points to the source memory area.
/// @param c The delimiter used to stop.
/// @param n The maximum number of copied bytes.
/// @return A pointer to the next character in dst after c, or NULL if c
/// was not found in the first n characters of src.
void *memccpy(void *dst, const void *src, int c, size_t n);
/// @brief Copy a block of memory, handling overlap.
/// @param dst Pointer to the destination.
/// @param src Pointer to the source.
/// @param num Number of bytes to be copied.
/// @return Pointer to the destination.
void *memcpy(void *dst, const void *src, size_t num);
/// @brief Compares the first n bytes of str1 and str2.
/// @param ptr1 First pointer to block of memory.
/// @param ptr2 Second pointer to block of memory.
/// @param n Number of bytes to compare.
/// @return
/// Returns an integral value indicating the relationship between
/// the memory blocks:
/// <0 the first byte that does not match has a lower
/// value in ptr1 than in ptr2
/// 0 the contents of both memory blocks are equal
/// >0 the first byte that does not match has a greater
/// value in ptr1 than in ptr2
int memcmp(const void *ptr1, const void *ptr2, size_t n);
/// @brief Sets the first num bytes of the block of memory pointed by ptr
/// to the specified value.
/// @param ptr Pointer to the block of memory to set.
/// @param value Value to be set.
/// @param num Number of bytes to be set to the given value.
/// @return The same ptr.
void *memset(void *ptr, int value, size_t num);
/// @brief Copy the string src into the array dst.
/// @param dst The destination array where the content is to be copied.
/// @param src String to be copied.
/// @return A pointer to dst is returned.
char *strcpy(char *dst, const char *src);
/// @brief Checks if the two strings are equal.
/// @param s1 First string to be compared.
/// @param s2 Second string to be compared.
/// @return
/// Returns an integral value indicating the relationship between the strings:
/// <0 the first character that does not match has a lower
/// value in s1 than in s2
/// 0 the contents of both strings are equal
/// >0 the first character that does not match has a greater
/// value in s1 than in s2
int strcmp(const char *s1, const char *s2);
/// @brief Returns the length of the string s.
/// @param s Pointer to the null-terminated byte string to be examined.
/// @return The length of the null-terminated string str.
size_t strlen(const char *s);
/// @brief Returns the number of characters inside s, excluding the
/// terminating null byte ('\0'), but at most count.
/// @param s Pointer to the null-terminated byte string to be examined.
/// @param maxlen The upperbound on the length.
/// @return Returns strlen(s), if that is less than maxlen, or maxlen
/// if there is no null terminating ('\0') among the first maxlen
/// characters pointed to by s.
size_t strnlen(const char *s, size_t maxlen);
/// @brief Removes any whitespace characters from the beginning and end of str.
/// @param str The string to trim.
/// @return A pointer to str.
char *trim(char *str);
/// @brief Separate the given string based on a given delimiter.
/// @param stringp The string to separate.
/// @param delim The delimiter used to separate the string.
/// @return Returns a pointer to stringp.
/// @details
/// Finds the first token in stringp, that is delimited by one of the bytes in
/// the string delim. This token is terminated by overwriting the delimiter
/// with a null byte ('\0'), and *stringp is updated to point past the token.
/// In case no delimiter was found, the token is taken to be the entire string
/// *stringp, and *stringp is made NULL.
char *strsep(char **stringp, const char *delim);
/// @brief Move the number "num" into a string.
/// @param buffer The string containing the number.
/// @param num The number to convert.
/// @param base The base used to convert.
/// @return A pointer to buffer.
char *itoa(char *buffer, unsigned int num, unsigned int base);
/// @brief Replaces the occurrences of find with replace inside str.
/// @param str The string to manipulate.
/// @param find The character to replace.
/// @param replace The character used to replace.
/// @return A pointer to str.
char *replace_char(char *str, char find, char replace);
/// @brief Converts a file mode (the type and permission information associated
/// with an inode) into a symbolic string which is stored in the location
/// referenced by p.
/// @param mode File mode that encodes access permissions and file type.
/// @param p Buffer used to hold the string representation of file mode m.
void strmode(mode_t mode, char *p);
+41
View File
@@ -0,0 +1,41 @@
/// MentOS, The Mentoring Operating system project
/// @file bitops.h
/// @brief Bitmasks functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#define bit_set(V, B) ((V) | (1U << (B))) ///< Sets the given bit.
#define bit_clear(V, B) ((V) & ~(1U << (B))) ///< Clears the given bit.
#define bit_flip(V, B) ((V) ^ (1U << (B))) ///< Flips the given bit.
#define bit_set_assign(V, B) ((V) |= (1U << (B))) ///< Sets the given bit, permanently.
#define bit_clear_assign(V, B) ((V) &= ~(1U << (B))) ///< Clears the given bit, permanently.
#define bit_flip_assign(V, B) ((V) ^= (1U << (B))) ///< Flips the given bit, permanently.
#define bit_check(V, B) ((V) & (1U << (B))) ///< Checks if the given bit is 1.
#define bitmask_set(V, M) ((V) | (M)) ///< Sets the bits identified by the mask.
#define bitmask_clear(V, M) ((V) & ~(M)) ///< Clears the bits identified by the mask.
#define bitmask_flip(V, M) ((V) ^ (M)) ///< Flips the bits identified by the mask.
#define bitmask_set_assign(V, M) ((V) |= (M)) ///< Sets the bits identified by the mask, permanently.
#define bitmask_clear_assign(V, M) ((V) &= ~(M)) ///< Clears the bits identified by the mask, permanently.
#define bitmask_flip_assign(V, M) ((V) ^= (M)) ///< Flips the bits identified by the mask, permanently.
#define bitmask_check(V, M) ((V) & (M)) ///< Checks if the bits identified by the mask are all 1.
/// @brief Finds the first bit at zero, starting from the less significative bit.
static inline int find_first_zero(unsigned long value)
{
for (int i = 0; i < 32; ++i)
if (!bit_check(value, i))
return i;
return 0;
}
/// @brief Finds the first bit not zero, starting from the less significative bit.
static inline int find_first_non_zero(unsigned long value)
{
for (int i = 0; i < 32; ++i)
if (bit_check(value, i))
return i;
return 0;
}
+50
View File
@@ -0,0 +1,50 @@
/// MentOS, The Mentoring Operating system project
/// @file dirent.h
/// @brief Functions used to manage directories.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "limits.h"
#include "stddef.h"
/// File types for `d_type'.
enum {
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
};
static const char dt_char_array[] = {
'?', // DT_UNKNOWN = 0,
'p', //DT_FIFO = 1,
'c', //DT_CHR = 2,
'*',
'd', //DT_DIR = 4,
'*',
'b', //DT_BLK = 6,
'*',
'-', //DT_REG = 8,
'*',
'l', //DT_LNK = 10,
'*',
's', //DT_SOCK = 12,
'*',
'?', //DT_WHT = 14
};
/// Directory entry.
typedef struct dirent_t {
ino_t d_ino; ///< Inode number.
off_t d_off; ///< Offset to next linux_dirent.
unsigned short d_reclen; ///< Length of this linux_dirent.
unsigned short d_type; ///< type of the directory entry.
char d_name[NAME_MAX]; ///< Filename (null-terminated)
} dirent_t;
+138
View File
@@ -0,0 +1,138 @@
/// MentOS, The Mentoring Operating system project
/// @file errno.h
/// @brief System call errors definition.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
extern int *__geterrno();
/// Provide easy access to the error number.
#define errno (*__geterrno())
#define EPERM 1 ///< Operation not permitted.
#define ENOENT 2 ///< No such file or directory.
#define ESRCH 3 ///< No such process.
#define EINTR 4 ///< Interrupted system call.
#define EIO 5 ///< I/O error.
#define ENXIO 6 ///< No such device or address.
#define E2BIG 7 ///< Arg list too long.
#define ENOEXEC 8 ///< Exec format error.
#define EBADF 9 ///< Bad file number.
#define ECHILD 10 ///< No child processes.
#define EAGAIN 11 ///< Try again.
#define ENOMEM 12 ///< Out of memory.
#define EACCES 13 ///< Permission denied.
#define EFAULT 14 ///< Bad address.
#define ENOTBLK 15 ///< Block device required.
#define EBUSY 16 ///< Device or resource busy.
#define EEXIST 17 ///< File exists.
#define EXDEV 18 ///< Cross-device link.
#define ENODEV 19 ///< No such device.
#define ENOTDIR 20 ///< Not a directory.
#define EISDIR 21 ///< Is a directory.
#define EINVAL 22 ///< Invalid argument.
#define ENFILE 23 ///< File table overflow.
#define EMFILE 24 ///< Too many open files.
#define ENOTTY 25 ///< Not a typewriter.
#define ETXTBSY 26 ///< Text file busy.
#define EFBIG 27 ///< File too large.
#define ENOSPC 28 ///< No space left on device.
#define ESPIPE 29 ///< Illegal seek.
#define EROFS 30 ///< Read-only file system.
#define EMLINK 31 ///< Too many links.
#define EPIPE 32 ///< Broken pipe.
#define EDOM 33 ///< Math argument out of domain of func.
#define ERANGE 34 ///< Math result not representable.
#define EDEADLK 35 ///< Resource deadlock would occur.
#define ENAMETOOLONG 36 ///< File name too long.
#define ENOLCK 37 ///< No record locks available.
#define ENOSYS 38 ///< Function not implemented.
#define ENOTEMPTY 39 ///< Directory not empty.
#define ELOOP 40 ///< Too many symbolic links encountered.
#define EWOULDBLOCK EAGAIN ///< Operation would block.
#define ENOMSG 42 ///< No message of desired type.
#define EIDRM 43 ///< Identifier removed.
#define ECHRNG 44 ///< Channel number out of range.
#define EL2NSYNC 45 ///< Level 2 not synchronized.
#define EL3HLT 46 ///< Level 3 halted.
#define EL3RST 47 ///< Level 3 reset.
#define ELNRNG 48 ///< Link number out of range.
#define EUNATCH 49 ///< Protocol driver not attached.
#define ENOCSI 50 ///< No CSI structure available.
#define EL2HLT 51 ///< Level 2 halted.
#define EBADE 52 ///< Invalid exchange.
#define EBADR 53 ///< Invalid request descriptor.
#define EXFULL 54 ///< Exchange full.
#define ENOANO 55 ///< No anode.
#define EBADRQC 56 ///< Invalid request code.
#define EBADSLT 57 ///< Invalid slot.
#define EDEADLOCK EDEADLK ///< Resource deadlock would occur.
#define EBFONT 59 ///< Bad font file format.
#define ENOSTR 60 ///< Device not a stream.
#define ENODATA 61 ///< No data available.
#define ETIME 62 ///< Timer expired.
#define ENOSR 63 ///< Out of streams resources.
#define ENONET 64 ///< Machine is not on the network.
#define ENOPKG 65 ///< Package not installed.
#define EREMOTE 66 ///< Object is remote.
#define ENOLINK 67 ///< Link has been severed.
#define EADV 68 ///< Advertise error.
#define ESRMNT 69 ///< Srmount error.
#define ECOMM 70 ///< Communication error on send.
#define EPROTO 71 ///< Protocol error.
#define EMULTIHOP 72 ///< Multihop attempted.
#define EDOTDOT 73 ///< RFS specific error.
#define EBADMSG 74 ///< Not a data message.
#define EOVERFLOW 75 ///< Value too large for defined data type.
#define ENOTUNIQ 76 ///< Name not unique on network.
#define EBADFD 77 ///< File descriptor in bad state.
#define EREMCHG 78 ///< Remote address changed.
#define ELIBACC 79 ///< Can not access a needed shared library.
#define ELIBBAD 80 ///< Accessing a corrupted shared library.
#define ELIBSCN 81 ///< .lib section in a.out corrupted.
#define ELIBMAX 82 ///< Attempting to link in too many shared libraries.
#define ELIBEXEC 83 ///< Cannot exec a shared library directly.
#define EILSEQ 84 ///< Illegal byte sequence.
#define ERESTART 85 ///< Interrupted system call should be restarted.
#define ESTRPIPE 86 ///< Streams pipe error.
#define EUSERS 87 ///< Too many users.
#define ENOTSOCK 88 ///< Socket operation on non-socket.
#define EDESTADDRREQ 89 ///< Destination address required.
#define EMSGSIZE 90 ///< Message too long.
#define EPROTOTYPE 91 ///< Protocol wrong type for socket.
#define ENOPROTOOPT 92 ///< Protocol not available.
#define EPROTONOSUPPORT 93 ///< Protocol not supported.
#define ESOCKTNOSUPPORT 94 ///< Socket type not supported.
#define EOPNOTSUPP 95 ///< Operation not supported on transport endpoint.
#define EPFNOSUPPORT 96 ///< Protocol family not supported.
#define EAFNOSUPPORT 97 ///< Address family not supported by protocol.
#define EADDRINUSE 98 ///< Address already in use.
#define EADDRNOTAVAIL 99 ///< Cannot assign requested address.
#define ENETDOWN 100 ///< Network is down.
#define ENETUNREACH 101 ///< Network is unreachable.
#define ENETRESET 102 ///< Network dropped connection because of reset.
#define ECONNABORTED 103 ///< Software caused connection abort.
#define ECONNRESET 104 ///< Connection reset by peer.
#define ENOBUFS 105 ///< No buffer space available.
#define EISCONN 106 ///< Transport endpoint is already connected.
#define ENOTCONN 107 ///< Transport endpoint is not connected.
#define ESHUTDOWN 108 ///< Cannot send after transport endpoint shutdown.
#define ETOOMANYREFS 109 ///< Too many references: cannot splice.
#define ETIMEDOUT 110 ///< Connection timed out.
#define ECONNREFUSED 111 ///< Connection refused.
#define EHOSTDOWN 112 ///< Host is down.
#define EHOSTUNREACH 113 ///< No route to host.
#define EALREADY 114 ///< Operation already in progress.
#define EINPROGRESS 115 ///< Operation now in progress.
#define ESTALE 116 ///< Stale NFS file handle.
#define EUCLEAN 117 ///< Structure needs cleaning.
#define ENOTNAM 118 ///< Not a XENIX named type file.
#define ENAVAIL 119 ///< No XENIX semaphores available.
#define EISNAM 120 ///< Is a named type file.
#define EREMOTEIO 121 ///< Remote I/O error.
#define EDQUOT 122 ///< Quota exceeded.
#define ENOMEDIUM 123 ///< No medium found.
#define EMEDIUMTYPE 124 ///< Wrong medium type.
#define ENOTSCHEDULABLE 125 ///< The periodc process cannot be scheduled.
+15
View File
@@ -0,0 +1,15 @@
/// MentOS, The Mentoring Operating system project
/// @file ioctl.h
/// @brief Input/Output ConTroL (IOCTL) functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Perform the I/O control operation specified by REQUEST on FD.
/// One argument may follow; its presence and type depend on REQUEST.
/// @param fd Must be an open file descriptor.
/// @param request The device-dependent request code
/// @param data An untyped pointer to memory.
/// @return Return value depends on REQUEST. Usually -1 indicates error.
int ioctl(int fd, unsigned long int request, void *data);
+36
View File
@@ -0,0 +1,36 @@
/// MentOS, The Mentoring Operating system project
/// @file reboot.h
/// @brief Defines the values required to issue a reboot.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// Magic values required to use _reboot() system call.
#define LINUX_REBOOT_MAGIC1 0xfee1dead
/// Magic values required to use _reboot() system call.
#define LINUX_REBOOT_MAGIC2 672274793
/// Magic values required to use _reboot() system call.
#define LINUX_REBOOT_MAGIC2A 85072278
/// Magic values required to use _reboot() system call.
#define LINUX_REBOOT_MAGIC2B 369367448
/// Magic values required to use _reboot() system call.
#define LINUX_REBOOT_MAGIC2C 537993216
// Commands accepted by the _reboot() system call.
/// Restart system using default command and mode.
#define LINUX_REBOOT_CMD_RESTART 0x01234567
/// Stop OS and give system control to ROM monitor, if any.
#define LINUX_REBOOT_CMD_HALT 0xCDEF0123
/// Ctrl-Alt-Del sequence causes RESTART command.
#define LINUX_REBOOT_CMD_CAD_ON 0x89ABCDEF
/// Ctrl-Alt-Del sequence sends SIGINT to init task.
#define LINUX_REBOOT_CMD_CAD_OFF 0x00000000
/// Stop OS and remove all power from system, if possible.
#define LINUX_REBOOT_CMD_POWER_OFF 0x4321FEDC
/// Restart system using given command string.
#define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4
/// Suspend system using software suspend if compiled in.
#define LINUX_REBOOT_CMD_SW_SUSPEND 0xD000FCE2
/// Restart system using a previously loaded Linux kernel
#define LINUX_REBOOT_CMD_KEXEC 0x45584543
+35
View File
@@ -0,0 +1,35 @@
/// MentOS, The Mentoring Operating system project
/// @file stat.h
/// @brief Stat functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#define __SYS_STAT_H
#include "bits/stat.h"
#include "stddef.h"
#include "time.h"
/// @brief Retrieves information about the file at the given location.
/// @param path The path to the file that is being inquired.
/// @param buf A structure where data about the file will be stored.
/// @return Returns a negative value on failure.
int stat(const char *path, stat_t *buf);
/// @brief Retrieves information about the file at the given location.
/// @param fd The file descriptor of the file that is being inquired.
/// @param buf A structure where data about the file will be stored.
/// @return Returns a negative value on failure.
int fstat(int fd, stat_t *buf);
/// @brief Creates a new directory at the given path.
/// @param path The path of the new directory.
/// @param mode The permission of the new directory.
/// @return Returns a negative value on failure.
int mkdir(const char *path, mode_t mode);
/// @brief Removes the given directory.
/// @param path The path to the directory to remove.
/// @return Returns a negative value on failure.
int rmdir(const char *path);
+70
View File
@@ -0,0 +1,70 @@
/// MentOS, The Mentoring Operating system project
/// @file types.h
/// @brief Collection of Kernel datatype
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// The type of process id.
typedef signed int pid_t;
/// The type of process user variable.
typedef unsigned int user_t;
/// The type of process status.
typedef unsigned int status_t;
/// Type for system keys.
typedef int key_t;
/// Defines the list of flags of a process.
typedef enum eflags_list {
/// Carry flag.
EFLAG_CF = (1 << 0),
/// Parity flag.
EFLAG_PF = (1 << 2),
/// Auxiliary carry flag.
EFLAG_AF = (1 << 4),
/// Zero flag.
EFLAG_ZF = (1 << 6),
/// Sign flag.
EFLAG_SF = (1 << 7),
/// Trap flag.
EFLAG_TF = (1 << 8),
/// Interrupt enable flag.
EFLAG_IF = (1 << 9),
/// Direction flag.
EFLAG_DF = (1 << 10),
/// Overflow flag.
EFLAG_OF = (1 << 11),
/// Nested task flag.
EFLAG_NT = (1 << 14),
/// Resume flag.
EFLAG_RF = (1 << 16),
/// Virtual 8086 mode flag.
EFLAG_VM = (1 << 17),
/// Alignment check flag (486+).
EFLAG_AC = (1 << 18),
/// Virutal interrupt flag.
EFLAG_VIF = (1 << 19),
/// Virtual interrupt pending flag.
EFLAG_VIP = (1 << 20),
/// ID flag.
EFLAG_ID = (1 << 21),
} eflags_list;
+223
View File
@@ -0,0 +1,223 @@
/// MentOS, The Mentoring Operating system project
/// @file unistd.h
/// @brief Functions used to manage files.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "sys/types.h"
#include "sys/dirent.h"
#include "stddef.h"
#define STDIN_FILENO 0 ///< Standard input.
#define STDOUT_FILENO 1 ///< Standard output.
#define STDERR_FILENO 2 ///< Standard error output.
/// @brief Read data from a file descriptor.
/// @param fd The file descriptor.
/// @param buf The buffer.
/// @param nbytes The number of bytes to read.
/// @return The number of read characters.
ssize_t read(int fd, void *buf, size_t nbytes);
/// @brief Write data into a file descriptor.
/// @param fd The file descriptor.
/// @param buf The buffer collecting data to written.
/// @param nbytes The number of bytes to write.
/// @return The number of written bytes.
ssize_t write(int fd, void *buf, size_t nbytes);
/// @brief Opens the file specified by pathname.
/// @param pathname A pathname for a file.
/// @param flags Used to set the file status flags and file access modes
/// of the open file description.
/// @param mode Specifies the file mode bits be applied when a new file
/// is created.
/// @return Returns a file descriptor, a small, nonnegative integer for
/// use in subsequent system calls.
int open(const char *pathname, int flags, mode_t mode);
/// @brief Close a file descriptor.
/// @param fd The file descriptor.
/// @return The result of the operation.
int close(int fd);
/// @brief Repositions the file offset inside a file.
/// @param fd The file descriptor of the file.
/// @param offset The offest to use for the operation.
/// @param whence The type of operation.
/// @return Upon successful completion, returns the resulting offset
/// location as measured in bytes from the beginning of the file. On
/// error, the value (off_t) -1 is returned and errno is set to
/// indicate the error.
off_t lseek(int fd, off_t offset, int whence);
/// @brief Delete a name and possibly the file it refers to.
/// @param path The path to the file.
/// @return
int unlink(const char *path);
/// @brief Wrapper for exit system call.
/// @param status The exit status.
extern void exit(int status);
/// @brief Returns the process ID (PID) of the calling process.
/// @return pid_t process identifier.
extern pid_t getpid();
///@brief Return session id of the given process.
/// If pid == 0 return the SID of the calling process
/// If pid != 0 return the SID corresponding to the process having identifier == pid
///@param pid process identifier from wich we want the SID
///@return On success return SID of the session
/// Otherwise return -1 with errno set on: EPERM or ESRCH
extern pid_t getsid(pid_t pid);
///@brief creates a new session if the calling process is not a
/// process group leader. The calling process is the leader of the
/// new session (i.e., its session ID is made the same as its process
/// ID). The calling process also becomes the process group leader
/// of a new process group in the session (i.e., its process group ID
/// is made the same as its process ID).
///@return On success return SID of the session just created
/// Otherwise return -1 with errno : EPERM
extern pid_t setsid();
///@brief returns the group ID of the calling process.
///@return GID of the current process
extern pid_t getgid();
///@brief sets the effective group ID of the calling process.
///@param pid process identifier to
///@return On success, zero is returned.
/// Otherwise returns -1 with errno set to :EINVAL or EPERM
extern int setgid(pid_t pid);
/// @brief Returns the parent process ID (PPID) of the calling process.
/// @return pid_t parent process identifier.
extern pid_t getppid();
/// @brief Clone the calling process, but without copying the whole address space.
/// The calling process is suspended until the new process exits or is
/// replaced by a call to `execve'.
/// @return Return -1 for errors, 0 to the new process, and the process ID of
/// the new process to the old process.
extern pid_t fork();
/// @brief Replaces the current process image with a new process image (argument list).
/// @param path The absolute path to the binary file to execute.
/// @param arg A list of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @param ... The argument list.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execl(const char *path, const char *arg, ...);
/// @brief Replaces the current process image with a new process image (argument list).
/// @param file The name of the binary file to execute, which is searched inside the
/// paths specified inside the PATH environmental variable.
/// @param arg A list of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @param ... The argument list.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execlp(const char *file, const char *arg, ...);
/// @brief Replaces the current process image with a new process image (argument list).
/// @param path The absolute path to the binary file to execute.
/// @param arg A list of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @param ... The argument list which contains as last argument the environment.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execle(const char *path, const char *arg, ...);
/// @brief Replaces the current process image with a new process image (argument list).
/// @param file The name of the binary file to execute, which is searched inside the
/// paths specified inside the PATH environmental variable.
/// @param arg A list of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @param ... The argument list which contains as last argument the environment.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execlpe(const char *file, const char *arg, ...);
/// @brief Replaces the current process image with a new process image (argument vector).
/// @param path The absolute path to the binary file to execute.
/// @param argv A vector of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execv(const char *path, char *const argv[]);
/// @brief Replaces the current process image with a new process image (argument vector).
/// @param file The name of the binary file to execute, which is searched inside the
/// paths specified inside the PATH environmental variable.
/// @param argv A vector of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execvp(const char *file, char *const argv[]);
/// @brief Replaces the current process image with a new process
/// image (argument vector), allows the caller to specify
/// the environment of the executed program via `envp`.
/// @param path The absolute path to the binary file to execute.
/// @param argv A vector of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @param envp A vector of one or more pointers to null-terminated strings that represent
/// the environment list available to the executed program.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execve(const char *path, char *const argv[], char *const envp[]);
/// @brief Replaces the current process image with a new process
/// image (argument vector), allows the caller to specify
/// the environment of the executed program via `envp`.
/// @param file The name of the binary file to execute, which is searched inside the
/// paths specified inside the PATH environmental variable.
/// @param argv A vector of one or more pointers to null-terminated strings that represent
/// the argument list available to the executed program.
/// @param envp A vector of one or more pointers to null-terminated strings that represent
/// the environment list available to the executed program.
/// @return Returns -1 only if an error has occurred, and sets errno.
int execvpe(const char *file, char *const argv[], char *const envp[]);
/// @brief Adds inc to the nice value for the calling thread.
/// @param inc The value to add to the nice.
/// @return On success, the new nice value is returned. On error, -1 is
/// returned, and errno is set appropriately.
int nice(int inc);
/// @brief Reboots the system, or enables/disables the reboot keystroke.
/// @param magic1 fails (with the error EINVAL) unless equals LINUX_REBOOT_MAGIC1.
/// @param magic2 fails (with the error EINVAL) unless equals LINUX_REBOOT_MAGIC2.
/// @param cmd The command to send to the reboot.
/// @param arg Argument passed with some specific commands.
/// @return For the values of cmd that stop or restart the system, a
/// successful call to reboot() does not return. For the other cmd
/// values, zero is returned on success. In all cases, -1 is
/// returned on failure, and errno is set appropriately.
int reboot(int magic1, int magic2, unsigned int cmd, void *arg);
/// @brief Get current working directory.
/// @param buf The array where the CWD will be copied.
/// @param size The size of the array.
/// @return On success, returns the same pointer to buf.
/// On failure, returnr NULL, and errno is set to indicate the error.
char *getcwd(char *buf, size_t size);
/// @brief Changes the current working directory to the given path.
/// @param path The new current working directory.
int chdir(char const *path);
/// @brief Is identical to chdir(), the only difference is that the
/// directory is given as an open file descriptor.
/// @param fd The file descriptor of the open directory.
int fchdir(int fd);
/// Provide access to the directory entries.
/// @param fd The fd pointing to the opened directory.
/// @param dirp The buffer where de data should be placed.
/// @param count The size of the buffer.
/// @return On success, the number of bytes read is returned. On end of
/// directory, 0 is returned. On error, -1 is returned, and errno is set
/// appropriately.
int getdents(int fd, dirent_t *dirp, unsigned int count);
/// @brief Send signal to calling thread after desired seconds.
int alarm(int seconds);
+30
View File
@@ -0,0 +1,30 @@
/// MentOS, The Mentoring Operating system project
/// @file utsname.h
/// @brief Functions used to provide information about the machine & OS.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// Maximum length of the string used by utsname.
#define SYS_LEN 257
/// @brief Holds information concerning the machine and the os.
typedef struct utsname_t {
/// The name of the system.
char sysname[SYS_LEN];
/// The name of the node.
char nodename[SYS_LEN];
/// Operating system release (e.g., "2.6.28").
char release[SYS_LEN];
/// The version of the OS.
char version[SYS_LEN];
/// The name of the machine.
char machine[SYS_LEN];
} utsname_t;
/// @brief Returns system information in the structure pointed to by buf.
/// @param buf Buffer where the info will be placed.
/// @return 0 on success, a negative value on failure.
int uname(utsname_t* buf);
+77
View File
@@ -0,0 +1,77 @@
/// MentOS, The Mentoring Operating system project
/// @file wait.h
/// @brief Event management functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
/// @brief Return immediately if no child is there to be waited for.
#define WNOHANG 0x00000001
/// @brief Return for children that are stopped, and whose status has not
/// been reported.
#define WUNTRACED 0x00000002
/// @brief returns true if the child process exited because of a signal that
/// was not caught.
#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
/// @brief returns true if the child process that caused the return is
/// currently stopped; this is only possible if the call was done using
/// WUNTRACED().
#define WIFSTOPPED(status) (((status)&0xff) == 0x7f)
/// @brief evaluates to the least significant eight bits of the return code
/// of the child that terminated, which may have been set as the argument
/// to a call to exit() or as the argument for a return statement in the
/// main program. This macro can only be evaluated if WIFEXITED()
/// returned nonzero.
#define WEXITSTATUS(status) (((status)&0xff00) >> 8)
/// @brief returns the number of the signal that caused the child process to
/// terminate. This macro can only be evaluated if WIFSIGNALED() returned
/// nonzero.
#define WTERMSIG(status) ((status)&0x7f)
/// @brief Is nonzero if the child exited normally.
#define WIFEXITED(status) (WTERMSIG(status) == 0)
/// @brief returns the number of the signal that caused the child to stop.
/// This macro can only be evaluated if WIFSTOPPED() returned nonzero.
#define WSTOPSIG(status) (WEXITSTATUS(status))
//==== Task States ============================================================
#define TASK_RUNNING 0x00 ///< The process is either: 1) running on CPU or 2) waiting in a run queue.
#define TASK_INTERRUPTIBLE (1 << 0) ///< The process is sleeping, waiting for some event to occur.
#define TASK_UNINTERRUPTIBLE (1 << 1) ///< Similar to TASK_INTERRUPTIBLE, but it doesn't process signals.
#define TASK_STOPPED (1 << 2) ///< Stopped, it's not running, and not able to run.
#define TASK_TRACED (1 << 3) ///< Is being monitored by other processes such as debuggers.
#define EXIT_ZOMBIE (1 << 4) ///< The process has terminated.
#define EXIT_DEAD (1 << 5) ///< The final state.
//==============================================================================
/// @brief Suspends the execution of the calling thread until ANY child has
/// changed state.
/// @param status Variable where the new status of the child is stored.
/// @return On error, -1 is returned, otherwise it returns the pid of the
/// child that has unlocked the wait.
extern pid_t wait(int *status);
/// @brief Suspends the execution of the calling thread until a child
/// specified by pid argument has changed state.
/// @param pid Se details below for more information.
/// @param status Variable where the new status of the child is stored.
/// @param options Waitpid options.
/// @return On error, -1 is returned, otherwise it returns the pid of the
/// child that has unlocked the wait.
/// @details
/// By default, waitpid() waits only for terminated children, but this
/// behavior is modifiable via the options argument, as described below.
/// The value of pid can be:
/// - 1 meaning wait for any child process.
/// 0 meaning wait for any child process whose process group ID is
/// equal to that of the calling process.
/// > 0 meaning wait for the child whose process ID is equal to the
/// value of pid.
extern pid_t waitpid(pid_t pid, int *status, int options);
+308
View File
@@ -0,0 +1,308 @@
/// MentOS, The Mentoring Operating system project
/// @file syscall_types.h
/// @brief System Call numbers.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#define __NR_exit 1 ///< System-call number for `exit`
#define __NR_fork 2 ///< System-call number for `fork`
#define __NR_read 3 ///< System-call number for `read`
#define __NR_write 4 ///< System-call number for `write`
#define __NR_open 5 ///< System-call number for `open`
#define __NR_close 6 ///< System-call number for `close`
#define __NR_waitpid 7 ///< System-call number for `waitpid`
#define __NR_creat 8 ///< System-call number for `creat`
#define __NR_link 9 ///< System-call number for `link`
#define __NR_unlink 10 ///< System-call number for `unlink`
#define __NR_execve 11 ///< System-call number for `execve`
#define __NR_chdir 12 ///< System-call number for `chdir`
#define __NR_time 13 ///< System-call number for `time`
#define __NR_mknod 14 ///< System-call number for `mknod`
#define __NR_chmod 15 ///< System-call number for `chmod`
#define __NR_lchown 16 ///< System-call number for `lchown`
#define __NR_stat 18 ///< System-call number for `stat`
#define __NR_lseek 19 ///< System-call number for `lseek`
#define __NR_getpid 20 ///< System-call number for `getpid`
#define __NR_mount 21 ///< System-call number for `mount`
#define __NR_oldumount 22 ///< System-call number for `oldumount`
#define __NR_setuid 23 ///< System-call number for `setuid`
#define __NR_getuid 24 ///< System-call number for `getuid`
#define __NR_stime 25 ///< System-call number for `stime`
#define __NR_ptrace 26 ///< System-call number for `ptrace`
#define __NR_alarm 27 ///< System-call number for `alarm`
#define __NR_fstat 28 ///< System-call number for `fstat`
#define __NR_pause 29 ///< System-call number for `pause`
#define __NR_utime 30 ///< System-call number for `utime`
#define __NR_access 33 ///< System-call number for `access`
#define __NR_nice 34 ///< System-call number for `nice`
#define __NR_sync 36 ///< System-call number for `sync`
#define __NR_kill 37 ///< System-call number for `kill`
#define __NR_rename 38 ///< System-call number for `rename`
#define __NR_mkdir 39 ///< System-call number for `mkdir`
#define __NR_rmdir 40 ///< System-call number for `rmdir`
#define __NR_dup 41 ///< System-call number for `dup`
#define __NR_pipe 42 ///< System-call number for `pipe`
#define __NR_times 43 ///< System-call number for `times`
#define __NR_brk 45 ///< System-call number for `brk`
#define __NR_setgid 46 ///< System-call number for `setgid`
#define __NR_getgid 47 ///< System-call number for `getgid`
#define __NR_signal 48 ///< System-call number for `signal`
#define __NR_geteuid 49 ///< System-call number for `geteuid`
#define __NR_getegid 50 ///< System-call number for `getegid`
#define __NR_acct 51 ///< System-call number for `acct`
#define __NR_umount 52 ///< System-call number for `umount`
#define __NR_ioctl 54 ///< System-call number for `ioctl`
#define __NR_fcntl 55 ///< System-call number for `fcntl`
#define __NR_setpgid 57 ///< System-call number for `setpgid`
#define __NR_olduname 59 ///< System-call number for `olduname`
#define __NR_umask 60 ///< System-call number for `umask`
#define __NR_chroot 61 ///< System-call number for `chroot`
#define __NR_ustat 62 ///< System-call number for `ustat`
#define __NR_dup2 63 ///< System-call number for `dup2`
#define __NR_getppid 64 ///< System-call number for `getppid`
#define __NR_getpgrp 65 ///< System-call number for `getpgrp`
#define __NR_setsid 66 ///< System-call number for `setsid`
#define __NR_sigaction 67 ///< System-call number for `sigaction`
#define __NR_sgetmask 68 ///< System-call number for `sgetmask`
#define __NR_ssetmask 69 ///< System-call number for `ssetmask`
#define __NR_setreuid 70 ///< System-call number for `setreuid`
#define __NR_setregid 71 ///< System-call number for `setregid`
#define __NR_sigsuspend 72 ///< System-call number for `sigsuspend`
#define __NR_sigpending 73 ///< System-call number for `sigpending`
#define __NR_sethostname 74 ///< System-call number for `sethostname`
#define __NR_setrlimit 75 ///< System-call number for `setrlimit`
#define __NR_getrlimit 76 ///< System-call number for `getrlimit`
#define __NR_getrusage 77 ///< System-call number for `getrusage`
#define __NR_gettimeofday 78 ///< System-call number for `gettimeofday`
#define __NR_settimeofday 79 ///< System-call number for `settimeofday`
#define __NR_getgroups 80 ///< System-call number for `getgroups`
#define __NR_setgroups 81 ///< System-call number for `setgroups`
#define __NR_symlink 83 ///< System-call number for `symlink`
#define __NR_lstat 84 ///< System-call number for `lstat`
#define __NR_readlink 85 ///< System-call number for `readlink`
#define __NR_uselib 86 ///< System-call number for `uselib`
#define __NR_swapon 87 ///< System-call number for `swapon`
#define __NR_reboot 88 ///< System-call number for `reboot`
#define __NR_readdir 89 ///< System-call number for `readdir`
#define __NR_mmap 90 ///< System-call number for `mmap`
#define __NR_munmap 91 ///< System-call number for `munmap`
#define __NR_truncate 92 ///< System-call number for `truncate`
#define __NR_ftruncate 93 ///< System-call number for `ftruncate`
#define __NR_fchmod 94 ///< System-call number for `fchmod`
#define __NR_fchown 95 ///< System-call number for `fchown`
#define __NR_getpriority 96 ///< System-call number for `getpriority`
#define __NR_setpriority 97 ///< System-call number for `setpriority`
#define __NR_statfs 99 ///< System-call number for `statfs`
#define __NR_fstatfs 100 ///< System-call number for `fstatfs`
#define __NR_ioperm 101 ///< System-call number for `ioperm`
#define __NR_socketcall 102 ///< System-call number for `socketcall`
#define __NR_syslog 103 ///< System-call number for `syslog`
#define __NR_setitimer 104 ///< System-call number for `setitimer`
#define __NR_getitimer 105 ///< System-call number for `getitimer`
#define __NR_newstat 106 ///< System-call number for `newstat`
#define __NR_newlstat 107 ///< System-call number for `newlstat`
#define __NR_newfstat 108 ///< System-call number for `newfstat`
#define __NR_uname 109 ///< System-call number for `uname`
#define __NR_iopl 110 ///< System-call number for `iopl`
#define __NR_vhangup 111 ///< System-call number for `vhangup`
#define __NR_idle 112 ///< System-call number for `idle`
#define __NR_vm86old 113 ///< System-call number for `vm86old`
#define __NR_wait4 114 ///< System-call number for `wait4`
#define __NR_swapoff 115 ///< System-call number for `swapoff`
#define __NR_sysinfo 116 ///< System-call number for `sysinfo`
#define __NR_ipc 117 ///< System-call number for `ipc`
#define __NR_fsync 118 ///< System-call number for `fsync`
#define __NR_sigreturn 119 ///< System-call number for `sigreturn`
#define __NR_clone 120 ///< System-call number for `clone`
#define __NR_setdomainname 121 ///< System-call number for `setdomainname`
#define __NR_newuname 122 ///< System-call number for `newuname`
#define __NR_modify_ldt 123 ///< System-call number for `modify_ldt`
#define __NR_adjtimex 124 ///< System-call number for `adjtimex`
#define __NR_mprotect 125 ///< System-call number for `mprotect`
#define __NR_sigprocmask 126 ///< System-call number for `sigprocmask`
#define __NR_create_module 127 ///< System-call number for `create_module`
#define __NR_init_module 128 ///< System-call number for `init_module`
#define __NR_delete_module 129 ///< System-call number for `delete_module`
#define __NR_get_kernel_syms 130 ///< System-call number for `get_kernel_syms`
#define __NR_quotactl 131 ///< System-call number for `quotactl`
#define __NR_getpgid 132 ///< System-call number for `getpgid`
#define __NR_fchdir 133 ///< System-call number for `fchdir`
#define __NR_bdflush 134 ///< System-call number for `bdflush`
#define __NR_sysfs 135 ///< System-call number for `sysfs`
#define __NR_personality 136 ///< System-call number for `personality`
#define __NR_setfsuid 138 ///< System-call number for `setfsuid`
#define __NR_setfsgid 139 ///< System-call number for `setfsgid`
#define __NR_llseek 140 ///< System-call number for `llseek`
#define __NR_getdents 141 ///< System-call number for `getdents`
#define __NR_select 142 ///< System-call number for `select`
#define __NR_flock 143 ///< System-call number for `flock`
#define __NR_msync 144 ///< System-call number for `msync`
#define __NR_readv 145 ///< System-call number for `readv`
#define __NR_writev 146 ///< System-call number for `writev`
#define __NR_getsid 147 ///< System-call number for `getsid`
#define __NR_fdatasync 148 ///< System-call number for `fdatasync`
#define __NR_sysctl 149 ///< System-call number for `sysctl`
#define __NR_mlock 150 ///< System-call number for `mlock`
#define __NR_munlock 151 ///< System-call number for `munlock`
#define __NR_mlockall 152 ///< System-call number for `mlockall`
#define __NR_munlockall 153 ///< System-call number for `munlockall`
#define __NR_sched_setparam 154 ///< System-call number for `sched_setparam`
#define __NR_sched_getparam 155 ///< System-call number for `sched_getparam`
#define __NR_sched_setscheduler 156 ///< System-call number for `sched_setscheduler`
#define __NR_sched_getscheduler 157 ///< System-call number for `sched_getscheduler`
#define __NR_sched_yield 158 ///< System-call number for `sched_yield`
#define __NR_sched_get_priority_max 159 ///< System-call number for `sched_get_priority_max`
#define __NR_sched_get_priority_min 160 ///< System-call number for `sched_get_priority_min`
#define __NR_sched_rr_get_interval 161 ///< System-call number for `sched_rr_get_interval`
#define __NR_nanosleep 162 ///< System-call number for `nanosleep`
#define __NR_mremap 163 ///< System-call number for `mremap`
#define __NR_setresuid 164 ///< System-call number for `setresuid`
#define __NR_getresuid 165 ///< System-call number for `getresuid`
#define __NR_vm86 166 ///< System-call number for `vm86`
#define __NR_query_module 167 ///< System-call number for `query_module`
#define __NR_poll 168 ///< System-call number for `poll`
#define __NR_nfsservctl 169 ///< System-call number for `nfsservctl`
#define __NR_setresgid 170 ///< System-call number for `setresgid`
#define __NR_getresgid 171 ///< System-call number for `getresgid`
#define __NR_prctl 172 ///< System-call number for `prctl`
#define __NR_rt_sigreturn 173 ///< System-call number for `rt_sigreturn`
#define __NR_rt_sigaction 174 ///< System-call number for `rt_sigaction`
#define __NR_rt_sigprocmask 175 ///< System-call number for `rt_sigprocmask`
#define __NR_rt_sigpending 176 ///< System-call number for `rt_sigpending`
#define __NR_rt_sigtimedwait 177 ///< System-call number for `rt_sigtimedwait`
#define __NR_rt_sigqueueinfo 178 ///< System-call number for `rt_sigqueueinfo`
#define __NR_rt_sigsuspend 179 ///< System-call number for `rt_sigsuspend`
#define __NR_pread 180 ///< System-call number for `pread`
#define __NR_pwrite 181 ///< System-call number for `pwrite`
#define __NR_chown 182 ///< System-call number for `chown`
#define __NR_getcwd 183 ///< System-call number for `getcwd`
#define __NR_capget 184 ///< System-call number for `capget`
#define __NR_capset 185 ///< System-call number for `capset`
#define __NR_sigaltstack 186 ///< System-call number for `sigaltstack`
#define __NR_sendfile 187 ///< System-call number for `sendfile`
#define __NR_waitperiod 188 ///< System-call number for `waitperiod`
#define __NR_msgctl 189 ///< System-call number for `msgctl`
#define __NR_msgget 190 ///< System-call number for `msgget`
#define __NR_msgrcv 191 ///< System-call number for `msgrcv`
#define __NR_msgsnd 192 ///< System-call number for `msgsnd`
#define __NR_semctl 193 ///< System-call number for `semctl`
#define __NR_semget 194 ///< System-call number for `semget`
#define __NR_semop 195 ///< System-call number for `semop`
#define __NR_shmat 196 ///< System-call number for `shmat`
#define __NR_shmctl 197 ///< System-call number for `shmctl`
#define __NR_shmdt 198 ///< System-call number for `shmdt`
#define __NR_shmget 199 ///< System-call number for `shmget`
#define SYSCALL_NUMBER 200 ///< The total number of system-calls.
/// @brief Handle the value returned from a system call.
/// @param type Specifies the type of the returned value.
/// @param res The name of the variable where the result of the SC is stored.
#define __syscall_return(type, res) \
do { \
if ((unsigned int)(res) >= (unsigned int)(-125)) { \
errno = -(res); \
(res) = -1; \
} \
return (type)(res); \
} while (0)
/// @brief Heart of the code that calls a system call with 0 parameters.
#define __inline_syscall0(res, name) \
__asm__ __volatile__("int $0x80" \
: "=a"(res) \
: "0"(__NR_##name))
/// @brief Heart of the code that calls a system call with 1 parameter.
#define __inline_syscall1(res, name, arg1) \
__asm__ __volatile__("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
: "=a"(res) \
: "0"(__NR_##name), "ri"((int)(arg1)) \
: "memory");
/// @brief Heart of the code that calls a system call with 2 parameters.
#define __inline_syscall2(res, name, arg1, arg2) \
__asm__ __volatile__("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
: "=a"(res) \
: "0"(__NR_##name), "ri"((int)(arg1)), "c"((int)(arg2)) \
: "memory");
/// @brief Heart of the code that calls a system call with 3 parameters.
#define __inline_syscall3(res, name, arg1, arg2, arg3) \
__asm__ __volatile__("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
: "=a"(res) \
: "0"(__NR_##name), "ri"((int)(arg1)), "c"((int)(arg2)), \
"d"((int)(arg3)) \
: "memory");
/// @brief Heart of the code that calls a system call with 4 parameters.
#define __inline_syscall4(res, name, arg1, arg2, arg3, arg4) \
__asm__ __volatile__("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
: "=a"(res) \
: "0"(__NR_##name), "ri"((int)(arg1)), "c"((int)(arg2)), \
"d"((int)(arg3)), "S"((int)(arg4)) \
: "memory");
/// @brief Heart of the code that calls a system call with 5 parameters.
#define __inline_syscall5(res, name, arg1, arg2, arg3, arg4, arg5) \
__asm__ __volatile__("push %%ebx ; movl %2,%%ebx ; movl %1,%%eax ; " \
"int $0x80 ; pop %%ebx" \
: "=a"(res) \
: "i"(__NR_##name), "ri"((int)(arg1)), "c"((int)(arg2)), \
"d"((int)(arg3)), "S"((int)(arg4)), "D"((int)(arg5)) \
: "memory");
/// @brief System call with 0 parameters.
#define _syscall0(type, name) \
type name(void) \
{ \
long __res; \
__inline_syscall0(__res, name); \
__syscall_return(type, __res); \
}
/// @brief System call with 1 parameter.
#define _syscall1(type, name, type1, arg1) \
type name(type1 arg1) \
{ \
long __res; \
__inline_syscall1(__res, name, arg1); \
__syscall_return(type, __res); \
}
/// @brief System call with 2 parameters.
#define _syscall2(type, name, type1, arg1, type2, arg2) \
type name(type1 arg1, type2 arg2) \
{ \
long __res; \
__inline_syscall2(__res, name, arg1, arg2); \
__syscall_return(type, __res); \
}
/// @brief System call with 3 parameters.
#define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
type name(type1 arg1, type2 arg2, type3 arg3) \
{ \
long __res; \
__inline_syscall3(__res, name, arg1, arg2, arg3); \
__syscall_return(type, __res); \
}
/// @brief System call with 4 parameters.
#define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
{ \
long __res; \
__inline_syscall4(__res, name, arg1, arg2, arg3, arg4); \
__syscall_return(type, __res); \
}
/// @brief System call with 5 parameters.
#define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) \
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
{ \
long __res; \
__inline_syscall5(__res, name, arg1, arg2, arg3, arg4, arg5); \
__syscall_return(type, __res); \
}
+22
View File
@@ -0,0 +1,22 @@
/// MentOS, The Mentoring Operating system project
/// @file termios.h
/// @brief Defines the termios functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "bits/termios-struct.h"
/// @brief Put the state of FD into *TERMIOS_P.
/// @param fd
/// @param termios_p
/// @return
extern int tcgetattr(int fd, termios *termios_p);
/// @brief Set the state of FD to *TERMIOS_P.
/// @param fd
/// @param optional_actions
/// @param termios_p
/// @return
extern int tcsetattr(int fd, int optional_actions, const termios *termios_p);
+110
View File
@@ -0,0 +1,110 @@
/// MentOS, The Mentoring Operating system project
/// @file time.h
/// @brief Time-related functions.
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stddef.h"
/// Domains of interval timers
#define ITIMER_REAL 0
#define ITIMER_VIRTUAL 1
#define ITIMER_PROF 2
/// Used to store time values.
typedef unsigned int time_t;
/// Used to get information about the current time.
typedef struct tm_t {
/// Seconds [0 to 59]
int tm_sec;
/// Minutes [0 to 59]
int tm_min;
/// Hours [0 to 23]
int tm_hour;
/// Day of the month [1 to 31]
int tm_mday;
/// Month [0 to 11]
int tm_mon;
/// Year [since 1900]
int tm_year;
/// Day of the week [0 to 6]
int tm_wday;
/// Day in the year [0 to 365]
int tm_yday;
/// Is Daylight Saving Time.
int tm_isdst;
} tm_t;
/// Rappresents time
typedef struct _timeval {
time_t tv_sec; /* seconds */
time_t tv_usec; /* microseconds */
} timeval;
/// Rappresents a time interval
typedef struct _itimerval {
timeval it_interval; /* next value */
timeval it_value; /* current value */
} itimerval;
/// @brief Specify intervals of time with nanosecond precision.
typedef struct timespec {
time_t tv_sec; ///< Seconds.
long tv_nsec; ///< Nanoseconds.
} timespec;
/// @brief Returns the current time.
/// @param t Where the time should be stored.
/// @return The current time.
time_t time(time_t *t);
/// @brief Return the difference between the two time values.
/// @param time1 The first time value.
/// @param time2 The second time value.
/// @return The difference in terms of seconds.
time_t difftime(time_t time1, time_t time2);
/// @brief The current time broken down into a tm_t structure.
/// @param timep A pointer to a variable holding the current time.
/// @return The time broken down.
tm_t *localtime(const time_t *timep);
/// @brief Formats the time tm according to the format specification format
/// and places the result in the character array s of size max.
/// @param s The destination buffer.
/// @param max The maximum length of the buffer.
/// @param format The buffer used to generate the time.
/// @param tm The broken-down time.
/// @return The number of bytes (excluding the terminating null) placed in s.
size_t strftime(char *s, size_t max, const char *format, const tm_t *tm);
/// @brief Suspends the execution of the calling thread.
/// @param req The amount of time we want to sleep.
/// @param rem The remaining time we did not sleep.
/// @return If the call is interrupted by a signal handler, nanosleep()
/// returns -1, sets errno to EINTR, and writes the remaining time
/// into the structure pointed to by rem unless rem is NULL.
/// @details
/// The execution is suspended until either at least the time specified
/// in *req has elapsed, or the delivery of a signal that triggers the
/// invocation of a handler in the calling thread or that terminates
/// the process.
int nanosleep(const timespec *req, timespec *rem);
/// @brief Causes the calling thread to sleep either until the number of
/// real-time seconds specified in seconds have elapsed or
/// until a signal arrives which is not ignored.
/// @param seconds The number of seconds we want to sleep.
/// @return Zero if the requested time has elapsed, or the number of seconds
/// left to sleep, if the call was interrupted by a signal handler.
unsigned int sleep(unsigned int seconds);
/// @brief Fills the structure pointed to by curr_value with the current setting for the timer specified by which.
int getitimer(int which, itimerval *curr_value);
/// @brief The system provides each process with three interval timers, each decrementing in a distinct time domain.
/// When any timer expires, a signal is sent to the process, and the timer (potentially) restarts.
int setitimer(int which, const itimerval *new_value, itimerval *old_value);