From 01d4457763cba69329ab65cd9c82c2a26b5c7b80 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Wed, 15 Sep 2021 14:39:02 +0200 Subject: [PATCH] heh --- err.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ err.h | 16 ++++++++++++++++ fstr.c | 15 ++++++++++++--- fstr.h | 1 + makefile | 4 ++-- msh | Bin 0 -> 28576 bytes msh.c | 42 ++++++++++++++++++++++++++++++++++++------ 7 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 err.c create mode 100644 err.h create mode 100755 msh diff --git a/err.c b/err.c new file mode 100644 index 0000000..9d711d6 --- /dev/null +++ b/err.c @@ -0,0 +1,55 @@ +#define _POSIX_C_SOURCE 200809l + +#include +#include +#include +#include +#include + +#include "err.h" + +void die(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vfprintf(stderr, fmt, ap); + + if (fmt[0] && fmt[strlen(fmt) - 1] == ':') + fprintf(stderr, " %s", strerror(errno)); + else + fputc('\n', stderr); + + va_end(ap); + exit(errno ? errno : EXIT_FAILURE); +} + +void *emalloc(size_t s) +{ + if (!s || s == (size_t)-1) + die("bad malloc: invalid size"); + void *p = malloc(s); + if (!p) + die("bad malloc:"); + return p; +} + +void *erealloc(void *p, size_t s) +{ + if (!s || s == (size_t)-1) + die("bad realloc: invalid size"); + void *r = realloc(p, s); + if (!r) + die("bad realloc:"); + return r; +} + +char *estrdup(const char *s) +{ + if (!s) + die("bad strdup: cannot duplicate NULL pointer"); + char *r = strdup(s); + if (!r) + die("bad strdup:"); + return r; +} diff --git a/err.h b/err.h new file mode 100644 index 0000000..aa3c406 --- /dev/null +++ b/err.h @@ -0,0 +1,16 @@ +#ifndef _ACRON_ERR_H +#define _ACRON_ERR_H + +/* Helper error/error-ing functions, like die() and dying versions of memory + * allocating functions */ + +#include + +void die(const char *, ...); + +/* Erroring functions */ +void *emalloc(size_t); +void *erealloc(void *, size_t); +char *estrdup(const char *); + +#endif diff --git a/fstr.c b/fstr.c index 0b9e3a8..4d25f87 100644 --- a/fstr.c +++ b/fstr.c @@ -3,11 +3,12 @@ #include #include "fstr.h" +#include "err.h" #include "config.h" void fstr_add_space(fstr_t *fs) { - erealloc(fs->s, fs->len + fs->space + DEF_CHUNKSIZE + 1); + fs->s = erealloc(fs->s, fs->len + fs->space + DEF_CHUNKSIZE + 1); fs->space += DEF_CHUNKSIZE; } @@ -17,7 +18,15 @@ void fstr_append_char(fstr_t *fs, char c) return; if (fs->space < 1) fstr_add_space(fs); - fs->s[fs->len++] = c; - fs->s[fs->len] = '\0'; + // I don't know if this is faster + if (fs->s[fs->len] != c) + fs->s[fs->len] = c; + fs->s[++fs->len] = '\0'; fs->space--; } + +void fstr_clear(fstr_t *fs) +{ + fs->space += fs->len; + fs->len = 0; +} diff --git a/fstr.h b/fstr.h index 635b103..ca4552d 100644 --- a/fstr.h +++ b/fstr.h @@ -10,5 +10,6 @@ typedef struct _fstr { } fstr_t; void fstr_append_char(fstr_t *, char); +void fstr_clear(fstr_t *); #endif diff --git a/makefile b/makefile index 769f902..713b10d 100644 --- a/makefile +++ b/makefile @@ -1,8 +1,8 @@ .POSIX: -CFLAGS = -Wall -Werror -pedantic -Wextra -std=c11 +CFLAGS = -Wall -Werror -pedantic -Wextra -std=c11 -O0 -g -msh: msh.c fstr.c +msh: msh.c fstr.c err.c clean: rm -f msh *.o diff --git a/msh b/msh new file mode 100755 index 0000000000000000000000000000000000000000..1287695a4362d3a18098afd27e587c42436eee60 GIT binary patch literal 28576 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 literal 0 HcmV?d00001 diff --git a/msh.c b/msh.c index 374163a..c2b25f4 100644 --- a/msh.c +++ b/msh.c @@ -2,13 +2,15 @@ #include -#include #include +#include #include #include +#include #include "config.h" #include "fstr.h" +#include "err.h" fstr_t PS1 = {0}; unsigned int histsize = DEF_HISTSIZE; @@ -26,6 +28,12 @@ struct { char tag; } shinfo; +struct { + struct termios tio; + struct termios tio_before; +} terminfo; + +void sh_setup_terminal(void); void sh_update_uinfo(void); void sh_update_shinfo(void); void sh_update_ps1(void); @@ -35,19 +43,40 @@ int main(int argc, char **argv) { (void)argc; (void)argv; + char i; + sh_setup_terminal(); for (;;) { sh_update_uinfo(); sh_update_shinfo(); sh_update_ps1(); sh_print_ps1(); - for(;;); + fflush(stdout); + while (1) { + read(STDIN_FILENO, &i, 1); // This blocks + fputc(i, stdout); + fflush(stdout); + if (i == '\n') + break; + } } return EXIT_SUCCESS; } -void sh_fill_uinfo(void) +void sh_setup_terminal(void) +{ + if (tcgetattr(STDOUT_FILENO, &terminfo.tio_before) == -1) + die("tcgetattr:"); + terminfo.tio = terminfo.tio_before; + /* Do not echo and input is available immediately */ + terminfo.tio.c_lflag &= ~ECHO; + terminfo.tio.c_lflag &= ~ICANON; + if (tcsetattr(STDOUT_FILENO, TCSANOW, &terminfo.tio) == -1) + die("tcsetattr:"); +} + +void sh_update_uinfo(void) { struct passwd *pw; uid_t nuid; @@ -58,7 +87,7 @@ void sh_fill_uinfo(void) pw = getpwuid(uinfo.uid); // User not found if (!pw) - exit(EXIT_FAILURE); + die("getpwuid:"); uinfo.gid = pw->pw_gid; uinfo.name = estrdup(pw->pw_name); uinfo.home = estrdup(pw->pw_dir); @@ -69,13 +98,14 @@ void sh_update_shinfo(void) shinfo.tag = uinfo.uid ? '$' : '#'; } -inline void sh_print_ps1(void) +void sh_print_ps1(void) { - puts(PS1.s); + fputs(PS1.s, stdout); } void sh_update_ps1(void) { + fstr_clear(&PS1); fstr_append_char(&PS1, shinfo.tag); fstr_append_char(&PS1, ' '); }