Compare commits

..

31 Commits

Author SHA1 Message Date
Jonas 'Sortie' Termansen 70c5499709 Revert "Parallelize driver initialization."
This reverts commit 0fef08bbc4.
2023-04-03 00:22:20 +02:00
Jonas 'Sortie' Termansen 2ccbb69032 Aurora procedural wallpaper. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 49e25c1bd4 Work around pty deadlock. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen b9d8175545 Add cdrom mounting live environment. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 0fef08bbc4 Parallelize driver initialization. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen b304e34d56 Speed up ata(4) 400 ns waits.
Waiting for any non-zero duration currently waits for at least one timer
cycle (10 ms), which is especially expensive during early boot.

The current workaround of simply reading the status 14 times seems really
suspicious although the osdev wiki documents it, but let's see how well it
works on real hardware, it's probably good enough.

Try to determine the initial selected drive to save one drive selection.
2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 40e3432faf Decrease PS/2 timeouts. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 9ba552a1b5 Add uptime(1) -pr options. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 54f99f8269 Add iso9660 filesystem implementation. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 263a1ec1f1 Add kernel virtual address space usage debug information. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 2d8f7bc57a Revert "Update to bison-3.8.2."
This reverts commit b82fae810b42c5426d21c4dc153b32f086dd7fde.
2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 5948a2be00 Update to bison-3.8.2. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 2f36596b6d Debug TCP socket state listing. 2023-03-27 00:16:19 +02:00
Jonas 'Sortie' Termansen 7e0555f2c2 Add kernel heap allocation tracing debug facility. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 8730de52de Add m4, perl, and texinfo to the basic ports set. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 3eeab1d368 Trianglix 4. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 8990553795 Add tix-check(8). 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen fb76556f95 Add automatic installer and upgrader. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen d9aef1d8d9 Volatile release. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 72814b830c Add tix-upgrade(8). 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 4a455be70a Add display server. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 0305241095 Add pty(1). 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen ef75110afb Revert "Debug system calls exiting without interrupts enabled."
This reverts commit c0bc774c9aa8aa3834f40afc7ad5aa909afc61a1.
2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 0482958335 Debug system calls exiting without interrupts enabled. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen f6257155cc Add signify port. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen d93fb760d5 Add irc(1).
Co-authored-by: Juhani Krekelä <juhani@krekelä.fi>
2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen ee5f69c0c3 Add getaddrinfo(1). 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen bb570bbbf2 Add host(1). 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 42a8e34e80 Add nginx port. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 60471c9f52 Enable stack smash protection by default. 2023-03-27 00:16:18 +02:00
Jonas 'Sortie' Termansen 4227cbfa94 Enable undefined behavior sanitization by default. 2023-03-27 00:16:18 +02:00
8 changed files with 49 additions and 130 deletions

View File

@ -2549,7 +2549,7 @@ static void write_random_seed(void)
{
const char* will_not = "next boot will not have fresh randomness";
const char* path = "/boot/random.seed";
int fd = open(path, O_RDWR | O_CREAT | O_NOFOLLOW, 0600);
int fd = open(path, O_WRONLY | O_CREAT | O_NOFOLLOW, 0600);
if ( fd < 0 )
{
if ( errno != ENOENT && errno != EROFS )
@ -2568,10 +2568,6 @@ static void write_random_seed(void)
close(fd);
return;
}
// Mix in the old random seed so the sysadmin can add new randomness here.
unsigned char old[256] = {0};
readall(fd, old, sizeof(old));
lseek(fd, 0, SEEK_SET);
// Write out randomness, but mix in some fresh kernel randomness in case the
// randomness used to seed arc4random didn't have enough entropy, there may
// be more now.
@ -2580,7 +2576,7 @@ static void write_random_seed(void)
unsigned char newbuf[256];
getentropy(newbuf, sizeof(newbuf));
for ( size_t i = 0; i < 256; i++ )
buf[i] ^= newbuf[i] ^ old[i];
buf[i] ^= newbuf[i];
size_t done = writeall(fd, buf, sizeof(buf));
explicit_bzero(buf, sizeof(buf));
if ( done < sizeof(buf) )

View File

@ -268,7 +268,7 @@ size_t STRFTIME(STRFTIME_CHAR* s,
continue;
case STRFTIME_L('h'): OUTPUT_STRING(GetMonthAbbreviated(tm)); break;
case STRFTIME_L('H'): OUTPUT_INT_PADDED(tm->tm_hour, 2, STRFTIME_L('0')); break; /*O*/
case STRFTIME_L('I'): OUTPUT_INT_PADDED((tm->tm_hour + 11) % 12 + 1, 2, STRFTIME_L('0')); break; /*O*/
case STRFTIME_L('I'): OUTPUT_INT_PADDED(tm->tm_hour % 12 + 1, 2, STRFTIME_L('0')); break; /*O*/
case STRFTIME_L('j'): OUTPUT_INT_PADDED(tm->tm_yday + 1, 3, STRFTIME_L('0')); break;
case STRFTIME_L('m'): OUTPUT_INT_PADDED(tm->tm_mon + 1, 2, STRFTIME_L('0')); break; /*O*/
case STRFTIME_L('M'): OUTPUT_INT_PADDED(tm->tm_min, 2, STRFTIME_L('0')); break; /*O*/

View File

@ -1,7 +1,6 @@
/*
* Copyright (c) 2014, 2015, 2016 Jonas 'Sortie' Termansen.
* Copyright (c) 2021 Juhani 'nortti' Krekelä.
* Copyright (c) 2023 dzwdz.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -88,8 +87,6 @@ static inline void arrow_initialize()
static struct textbox textbox_username;
static struct textbox textbox_password;
static char* username = NULL;
static char* session = NULL;
struct glogin
{
@ -658,7 +655,7 @@ static void think(struct glogin* state)
}
if ( result )
{
if ( !login(username, session) )
if ( !login(textbox_username.text) )
state->warning = strerror(errno);
state->stage = STAGE_USERNAME;
textbox_reset(&textbox_username);
@ -679,28 +676,24 @@ static void keyboard_event(struct glogin* state, uint32_t codepoint)
{
if ( codepoint == '\n' )
{
enum special_action action;
state->warning = NULL;
switch ( state->stage )
{
case STAGE_USERNAME:
free(username);
free(session);
username = NULL;
session = NULL;
if ( !parse_username(textbox_username.text, &username,
&session, &action) )
{
state->warning = "Invalid username";
break;
}
handle_special(action);
if ( !strcmp(textbox_username.text, "exit") )
exit(0);
if ( !strcmp(textbox_username.text, "poweroff") )
exit(0);
if ( !strcmp(textbox_username.text, "reboot") )
exit(1);
if ( !strcmp(textbox_username.text, "halt") )
exit(2);
state->stage = STAGE_PASSWORD;
textbox_reset(&textbox_password);
break;
case STAGE_PASSWORD:
state->stage = STAGE_CHECKING;
if ( !check_begin(&state->chk, username,
if ( !check_begin(&state->chk, textbox_username.text,
textbox_password.text, true) )
{
state->stage = STAGE_USERNAME;

View File

@ -34,9 +34,6 @@ script if it exists and is executable, otherwise attempting
.Pa /etc/session ,
and ultimately falling back on the user's shell from
.Xr passwd 5 .
It can be overriden by suffixing the username with a colon and the name of the
program to launch.
If the program name is skipped, the login shell is launched.
.Pp
Type a special username to perform special options:
.Pp

View File

@ -1,6 +1,5 @@
/*
* Copyright (c) 2014, 2015, 2018, 2022 Jonas 'Sortie' Termansen.
* Copyright (c) 2023 dzwdz.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -23,7 +22,6 @@
#include <sys/wait.h>
#include <assert.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
@ -203,7 +201,7 @@ static int setcloexecfrom(int from)
return 0;
}
bool login(const char* username, const char* session)
bool login(const char* username)
{
char login_pid[sizeof(pid_t) * 3];
snprintf(login_pid, sizeof(login_pid), "%" PRIiPID, getpid());
@ -219,8 +217,6 @@ bool login(const char* username, const char* session)
char* login_shell;
if ( asprintf(&login_shell, "-%s", pwd->pw_shell) < 0 )
return close(pipe_fds[0]), close(pipe_fds[1]), false;
if ( session && *session == '\0' )
session = login_shell;
sigset_t oldset, sigttou;
sigemptyset(&sigttou);
sigaddset(&sigttou, SIGTTOU);
@ -256,14 +252,11 @@ bool login(const char* username, const char* session)
tcsetpgrp(0, getpgid(0)) ||
sigprocmask(SIG_SETMASK, &oldset, NULL) < 0 ||
settermmode(0, TERMMODE_NORMAL) < 0 ||
(session ?
execlp(session + (session[0] == '-'), session, (const char*) NULL) < 0
:
(execlp("./.session", "./.session", (const char*) NULL) < 0 &&
errno != ENOENT && errno != EACCES) ||
(execlp("/etc/session", "/etc/session", (const char*) NULL) < 0 &&
errno != ENOENT && errno != EACCES) ||
execlp(pwd->pw_shell, login_shell, (const char*) NULL)));
(execlp("./.session", "./.session", (const char*) NULL) < 0 &&
errno != ENOENT && errno != EACCES) ||
(execlp("/etc/session", "/etc/session", (const char*) NULL) < 0 &&
errno != ENOENT && errno != EACCES) ||
execlp(pwd->pw_shell, login_shell, (const char*) NULL));
write(pipe_fds[1], &errno, sizeof(errno));
_exit(127);
}
@ -325,61 +318,6 @@ static bool read_terminal_line(char* buffer, size_t size)
return true;
}
bool parse_username(const char* input,
char** username,
char** session,
enum special_action* action)
{
*username = NULL;
*session = NULL;
*action = SPECIAL_ACTION_NONE;
if ( !strcmp(input, "exit") )
return *action = SPECIAL_ACTION_POWEROFF, true;
else if ( !strcmp(input, "poweroff") )
return *action = SPECIAL_ACTION_POWEROFF, true;
else if ( !strcmp(input, "reboot") )
return *action = SPECIAL_ACTION_REBOOT, true;
else if ( !strcmp(input, "halt") )
return *action = SPECIAL_ACTION_HALT, true;
// Skip leading spaces to allow logging in as special accounts.
while ( isspace(*input) )
input++;
char* colon = strchr(input, ':');
if ( !colon )
{
*username = strdup(input);
return *username != NULL;
}
if ( strchr(colon + 1, ':') )
{
// Input contains more than one colon.
return false;
}
*username = strndup(input, colon - input);
if ( !*username )
return false;
*session = strdup(colon + 1);
if ( !*session )
{
free(*username);
*username = NULL;
return false;
}
return true;
}
void handle_special(enum special_action action)
{
switch ( action )
{
case SPECIAL_ACTION_NONE: return;
case SPECIAL_ACTION_POWEROFF: exit(0);
case SPECIAL_ACTION_REBOOT: exit(1);
case SPECIAL_ACTION_HALT: exit(2);
}
}
int textual(void)
{
unsigned int termmode = TERMMODE_UNICODE | TERMMODE_SIGNAL | TERMMODE_UTF8 |
@ -388,9 +326,6 @@ int textual(void)
err(2, "settermmode");
unsigned int pw_termmode = termmode & ~(TERMMODE_ECHO);
char* username = NULL;
char* session = NULL;
while ( true )
{
char hostname[HOST_NAME_MAX + 1];
@ -398,9 +333,9 @@ int textual(void)
gethostname(hostname, sizeof(hostname));
printf("%s login: ", hostname);
fflush(stdout);
char input[256];
char username[256];
errno = 0;
if ( !read_terminal_line(input, sizeof(input)) )
if ( !read_terminal_line(username, sizeof(username)) )
{
printf("\n");
if ( errno && errno != EINTR )
@ -412,17 +347,14 @@ int textual(void)
continue;
}
enum special_action action;
free(username);
free(session);
username = NULL;
session = NULL;
if ( !parse_username(input, &username, &session, &action) )
{
printf("Invalid username\n\n");
continue;
}
handle_special(action);
if ( !strcmp(username, "exit") )
exit(0);
if ( !strcmp(username, "poweroff") )
exit(0);
if ( !strcmp(username, "reboot") )
exit(1);
if ( !strcmp(username, "halt") )
exit(2);
if ( settermmode(0, pw_termmode) < 0 )
err(2, "settermmode");
@ -457,10 +389,11 @@ int textual(void)
continue;
}
if ( !login(username, session) )
if ( !login(username) )
{
warn("logging in as %s", username);
printf("\n");
continue;
}
}

View File

@ -1,6 +1,5 @@
/*
* Copyright (c) 2014, 2015 Jonas 'Sortie' Termansen.
* Copyright (c) 2023 dzwdz.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -36,15 +35,7 @@ struct check
bool pipe_nonblock;
};
enum special_action
{
SPECIAL_ACTION_NONE,
SPECIAL_ACTION_POWEROFF,
SPECIAL_ACTION_REBOOT,
SPECIAL_ACTION_HALT,
};
bool login(const char* username, const char* session);
bool login(const char* username);
bool check_real(const char* username, const char* password);
bool check_begin(struct check* chk,
const char* username,
@ -55,10 +46,4 @@ bool check(const char* username, const char* password);
int graphical(void);
int textual(void);
bool parse_username(const char* input,
char** out_username,
char** out_session,
enum special_action* action);
void handle_special(enum special_action action);
#endif

View File

@ -560,6 +560,19 @@ diff -Paur --no-dereference -- nginx.upstream/src/core/ngx_config.h nginx/src/co
#define NGX_INT32_LEN (sizeof("-2147483648") - 1)
#define NGX_INT64_LEN (sizeof("-9223372036854775808") - 1)
diff -Paur --no-dereference -- nginx.upstream/src/core/ngx_inet.c nginx/src/core/ngx_inet.c
--- nginx.upstream/src/core/ngx_inet.c
+++ nginx/src/core/ngx_inet.c
@@ -1130,7 +1130,8 @@
ngx_memzero(&hints, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
-#ifdef AI_ADDRCONFIG
+/* PATCH: AI_ADDRCONFIG is defined on Sortix but is unimplemented. */
+#if defined(AI_ADDRCONFIG) && !defined(__sortix__)
hints.ai_flags = AI_ADDRCONFIG;
#endif
diff -Paur --no-dereference -- nginx.upstream/src/event/ngx_event.c nginx/src/event/ngx_event.c
--- nginx.upstream/src/event/ngx_event.c
+++ nginx/src/event/ngx_event.c

View File

@ -219,8 +219,9 @@ static void scroll(ssize_t offsigned, struct entry with)
if ( rows < off )
off = rows;
size_t dist = off * columns;
size_t start = 0;
size_t end = rows * columns - dist;
for ( size_t i = 0; i < end; i++ )
for ( size_t i = start; i < end; i++ )
scrollback[i] = scrollback[i + dist];
for ( size_t i = end; i < end + dist; i++ )
scrollback[i] = with;
@ -231,8 +232,9 @@ static void scroll(ssize_t offsigned, struct entry with)
if ( rows < off )
off = rows;
size_t dist = off * columns;
size_t start = dist;
size_t end = rows * columns;
for ( size_t i = end-1; dist <= i; i-- )
for ( size_t i = start; i < end; i++ )
scrollback[i] = scrollback[i - dist];
for ( size_t i = 0; i < dist; i++ )
scrollback[i] = with;