Compare commits

..

35 Commits

Author SHA1 Message Date
Jonas 'Sortie' Termansen f860767ea0 fixup! Add nginx port. 2023-04-06 12:58:32 +02:00
Jonas 'Sortie' Termansen 3405b2ca45 Mix in the current random seed when writing the new one.
This behavior lets the sysadmin add entropy to the random seed effective
after the next reboot.
2023-04-04 20:49:41 +02:00
Jonas 'Sortie' Termansen 6ebd830c33 Revert "Parallelize driver initialization."
This reverts commit 0fef08bbc4.
2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen 1ba8e80ffb Aurora procedural wallpaper. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen ebe9eb45fe Work around pty deadlock. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen 07485eebfd Add cdrom mounting live environment. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen bdd3d20e30 Parallelize driver initialization. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen 26b8c18495 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-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen 52efe24135 Decrease PS/2 timeouts. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen a26e5600f1 Add uptime(1) -pr options. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen 84ce6c5337 Add iso9660 filesystem implementation. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen f935d2881b Add kernel virtual address space usage debug information. 2023-04-04 20:44:39 +02:00
Jonas 'Sortie' Termansen 7beb3aa8a9 Revert "Update to bison-3.8.2."
This reverts commit b82fae810b42c5426d21c4dc153b32f086dd7fde.
2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen c1feca2142 Update to bison-3.8.2. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen e268b4aaba Debug TCP socket state listing. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen d50da14469 Add kernel heap allocation tracing debug facility. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen acf98e900e Add m4, perl, and texinfo to the basic ports set. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 07bd8a813d Trianglix 4. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 21fbc106dc Add tix-check(8). 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 08cc3b4b6f Add automatic installer and upgrader. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 80bdac32ec Volatile release. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 458f147c96 Add tix-upgrade(8). 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 9469e84320 Add display server. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen a5b75353aa Add pty(1). 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 49df7adf2f Revert "Debug system calls exiting without interrupts enabled."
This reverts commit c0bc774c9aa8aa3834f40afc7ad5aa909afc61a1.
2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen fc59c9ce7b Debug system calls exiting without interrupts enabled. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 4d86a57912 Add signify port. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen de23e79c05 Add irc(1).
Co-authored-by: Juhani Krekelä <juhani@krekelä.fi>
2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 0d5977d2e4 Add getaddrinfo(1). 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen eb3a28a162 Add host(1). 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 89b10bf354 Add nginx port. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen 0a7ecf1ed2 Enable stack smash protection by default. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen c6317a0a69 Enable undefined behavior sanitization by default. 2023-04-04 20:44:38 +02:00
Jonas 'Sortie' Termansen af92d5cae8 Fix strftime(3) %I off by one. 2023-04-04 20:44:38 +02:00
dzwdz d3aee98c1a Allow overriding the login session, refactor special users. 2023-04-04 21:00:00 +03:00
8 changed files with 130 additions and 49 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_WRONLY | O_CREAT | O_NOFOLLOW, 0600);
int fd = open(path, O_RDWR | O_CREAT | O_NOFOLLOW, 0600);
if ( fd < 0 )
{
if ( errno != ENOENT && errno != EROFS )
@ -2568,6 +2568,10 @@ 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.
@ -2576,7 +2580,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];
buf[i] ^= newbuf[i] ^ old[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 % 12 + 1, 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('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,6 +1,7 @@
/*
* 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
@ -87,6 +88,8 @@ 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
{
@ -655,7 +658,7 @@ static void think(struct glogin* state)
}
if ( result )
{
if ( !login(textbox_username.text) )
if ( !login(username, session) )
state->warning = strerror(errno);
state->stage = STAGE_USERNAME;
textbox_reset(&textbox_username);
@ -676,24 +679,28 @@ 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:
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);
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);
state->stage = STAGE_PASSWORD;
textbox_reset(&textbox_password);
break;
case STAGE_PASSWORD:
state->stage = STAGE_CHECKING;
if ( !check_begin(&state->chk, textbox_username.text,
if ( !check_begin(&state->chk, username,
textbox_password.text, true) )
{
state->stage = STAGE_USERNAME;

View File

@ -34,6 +34,9 @@ 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,5 +1,6 @@
/*
* 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
@ -22,6 +23,7 @@
#include <sys/wait.h>
#include <assert.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
@ -201,7 +203,7 @@ static int setcloexecfrom(int from)
return 0;
}
bool login(const char* username)
bool login(const char* username, const char* session)
{
char login_pid[sizeof(pid_t) * 3];
snprintf(login_pid, sizeof(login_pid), "%" PRIiPID, getpid());
@ -217,6 +219,8 @@ bool login(const char* username)
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);
@ -252,11 +256,14 @@ bool login(const char* username)
tcsetpgrp(0, getpgid(0)) ||
sigprocmask(SIG_SETMASK, &oldset, NULL) < 0 ||
settermmode(0, TERMMODE_NORMAL) < 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));
(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)));
write(pipe_fds[1], &errno, sizeof(errno));
_exit(127);
}
@ -318,6 +325,61 @@ 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 |
@ -326,6 +388,9 @@ 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];
@ -333,9 +398,9 @@ int textual(void)
gethostname(hostname, sizeof(hostname));
printf("%s login: ", hostname);
fflush(stdout);
char username[256];
char input[256];
errno = 0;
if ( !read_terminal_line(username, sizeof(username)) )
if ( !read_terminal_line(input, sizeof(input)) )
{
printf("\n");
if ( errno && errno != EINTR )
@ -347,14 +412,17 @@ int textual(void)
continue;
}
if ( !strcmp(username, "exit") )
exit(0);
if ( !strcmp(username, "poweroff") )
exit(0);
if ( !strcmp(username, "reboot") )
exit(1);
if ( !strcmp(username, "halt") )
exit(2);
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 ( settermmode(0, pw_termmode) < 0 )
err(2, "settermmode");
@ -389,11 +457,10 @@ int textual(void)
continue;
}
if ( !login(username) )
if ( !login(username, session) )
{
warn("logging in as %s", username);
printf("\n");
continue;
}
}

View File

@ -1,5 +1,6 @@
/*
* 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
@ -35,7 +36,15 @@ struct check
bool pipe_nonblock;
};
bool login(const char* username);
enum special_action
{
SPECIAL_ACTION_NONE,
SPECIAL_ACTION_POWEROFF,
SPECIAL_ACTION_REBOOT,
SPECIAL_ACTION_HALT,
};
bool login(const char* username, const char* session);
bool check_real(const char* username, const char* password);
bool check_begin(struct check* chk,
const char* username,
@ -46,4 +55,10 @@ 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,19 +560,6 @@ 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,9 +219,8 @@ 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 = start; i < end; i++ )
for ( size_t i = 0; i < end; i++ )
scrollback[i] = scrollback[i + dist];
for ( size_t i = end; i < end + dist; i++ )
scrollback[i] = with;
@ -232,9 +231,8 @@ 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 = start; i < end; i++ )
for ( size_t i = end-1; dist <= i; i-- )
scrollback[i] = scrollback[i - dist];
for ( size_t i = 0; i < dist; i++ )
scrollback[i] = with;