suckless unix tools https://core.suckless.org/sbase
Go to file
sin a25a57f6ac tail: Add rudimentary support to detect file truncation
We cannot in general detect that truncation happened.  At the moment
we use a heuristic to compare the file size before and after a write
happened.  If the new file size is smaller than the old, we correctly
handle truncation and dump the entire file to stdout.

If it so happened that the new size is larger or equal to the old size
after the file had been truncated without any reads in between, we will
assume the data was appended to the file.

There is no known way around this other than using inotify or kevent
which is outside the scope of sbase.
2015-02-09 14:47:35 +00:00
libutf Add explicit boundary to loop in readrune() 2015-02-01 04:20:02 +01:00
libutil Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
arg.h ARGNUMF() only works on base 10 as it uses strtonum underneath 2015-01-30 16:45:44 +00:00
basename.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
basename.c basename: make usage line the same as the man page 2015-02-01 19:26:49 +01:00
cal.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cal.c Convert cal(1) to strtonum 2015-01-30 16:01:37 +01:00
cat.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cat.c read stdin if arg is exactly "-" not just begins with '-' 2014-11-18 21:53:37 +00:00
chgrp.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
chgrp.c chgrp: Only check errno if getgrnam() fails 2014-12-21 12:14:26 +00:00
chmod.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
chmod.c Add mandoc-manpage for chmod(1) 2015-01-17 21:59:37 +00:00
chown.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
chown.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
chroot.1 Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
chroot.c Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
cksum.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
cksum.c Add mandoc-manpage for cksum(1) and clean up code 2015-01-17 23:09:41 +00:00
cmp.1 Refactor cmp(1) code and manpage 2015-02-07 21:05:33 +01:00
cmp.c No need to check for stdin on fclose() 2015-02-07 21:42:41 +01:00
cols.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cols.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
comm.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
comm.c Add mandoc-manpage for comm(1) and clean up code 2015-01-17 23:10:07 +00:00
compat.h Add compat.h 2014-11-17 15:46:28 +00:00
config.mk Import strcasestr() from musl and remove -D_GNU_SOURCE 2014-11-20 23:46:06 +00:00
cp.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cp.c cp: Rename -d option to -P 2014-12-08 10:02:56 +00:00
cron.1 cron.1: path macro for /etc/crontab 2015-02-06 15:43:23 +01:00
cron.c Rename crond to cron 2014-12-16 11:04:07 +00:00
crypt.h checksum tools: implement -c 2014-03-23 18:02:39 +00:00
cut.1 man pages: fix some typos 2015-02-01 21:28:17 +01:00
cut.c Add unescape() to libutil 2015-01-29 21:52:44 +01:00
date.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
date.c Do not rely on the underlying type of time_t in date(1) and touch(1) 2015-02-08 23:45:03 +00:00
dirname.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
dirname.c man pages: improve consistency 2015-02-01 20:52:28 +01:00
du.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
du.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
echo.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
echo.c Add mandoc-manpage for echo(1) 2015-01-23 23:49:24 +01:00
env.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
env.c Add mandoc-manpage for env(1) 2015-01-24 00:22:06 +01:00
expand.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
expand.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
expr.1 man pages: fix some typos 2015-02-01 21:28:17 +01:00
expr.c Relax with caps in usage 2015-01-25 18:31:25 +00:00
false.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
false.c Simplify true(1) and false(1) 2014-10-03 00:03:08 +01:00
fold.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
fold.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
fs.h Fix return values in rm(1) and mv(1) 2015-01-30 12:45:54 +01:00
grep.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
grep.c grep: getline returns signed (ssize_t) 2015-01-31 15:19:42 +01:00
head.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
head.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
hostname.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
hostname.c Fix coding style 2014-11-13 18:08:43 +00:00
kill.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
kill.c Un-boolify sbase 2014-11-14 10:54:20 +00:00
LICENSE Various cal(1) improvements 2015-01-02 13:14:41 +00:00
link.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
link.c Add mandoc-manpage for link(1) 2015-01-25 22:44:47 +01:00
ln.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
ln.c ln: usage, just use %s 2015-01-31 15:23:59 +01:00
logger.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
logger.c logger: Don't bother freeing buf 2014-12-16 20:14:40 +00:00
logname.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
logname.c Fix coding style 2014-11-13 18:08:43 +00:00
ls.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
ls.c ls: Implement -c and update manpage 2015-01-20 16:50:37 +00:00
Makefile support llvm-ar 2015-02-03 10:08:26 +00:00
md5.h Add crypt.[ch] and update md5sum and sha1sum 2013-07-18 09:51:17 -04:00
md5sum.1 Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
md5sum.c Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
mkdir.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
mkdir.c Add full mode support to mkdir(1) and fix return values 2015-01-28 20:57:32 +01:00
mkfifo.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
mkfifo.c Add mandoc-manpage for mkfifo(1) and add full mode support 2015-01-28 20:55:50 +01:00
mktemp.1 Finish up printenv(1) 2015-02-01 00:23:38 +01:00
mktemp.c Fix coding style 2014-11-13 18:08:43 +00:00
mv.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
mv.c Staticise mv_status 2015-01-30 11:48:33 +00:00
nice.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
nice.c Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
nl.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
nl.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
nohup.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
nohup.c Add mandoc-manpage for nohup(1) 2015-01-28 23:55:57 +01:00
paste.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
paste.c Add unescape() to libutil 2015-01-29 21:52:44 +01:00
printenv.1 Finish up printenv(1) 2015-02-01 00:23:38 +01:00
printenv.c Style fix 2014-11-16 13:17:06 +00:00
printf.1 add some mandoc pages and fix some warnings 2015-01-30 21:21:50 +01:00
printf.c Import printf(1) from OpenBSD 2014-09-28 15:12:15 +01:00
pwd.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
pwd.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
queue.h Use queue.h in grep(1) 2014-11-16 12:39:15 +00:00
readlink.1 Edit readlink.1 and document missing flags 2015-02-01 00:43:43 +01:00
readlink.c Edit readlink.1 and document missing flags 2015-02-01 00:43:43 +01:00
README Add r-flag to touch(1), refactor manpage and code 2015-02-09 00:41:57 +01:00
renice.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
renice.c Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
rm.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
rm.c Fix return values in rm(1) and mv(1) 2015-01-30 12:45:54 +01:00
rmdir.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
rmdir.c Properly report return value in rmdir(1) 2015-01-30 12:43:55 +01:00
runetypebody.h Import libutf from http://git.suckless.org/libutf 2014-11-17 15:46:01 +00:00
seq.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
seq.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
setsid.1 Finish up setsid(1) 2015-02-01 00:47:32 +01:00
setsid.c Sort includes and more cleanup and fixes in util/ 2014-11-14 10:54:10 +00:00
sha1.h Add crypt.[ch] and update md5sum and sha1sum 2013-07-18 09:51:17 -04:00
sha1sum.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sha1sum.c Staticise globals 2014-11-17 13:39:11 +00:00
sha256.h Add sha256sum(1) 2013-07-20 13:20:16 -04:00
sha256sum.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sha256sum.c Staticise globals 2014-11-17 13:39:11 +00:00
sha512.h Add sha512sum(1) 2013-08-04 11:00:34 -04:00
sha512sum.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sha512sum.c Staticise globals 2014-11-17 13:39:11 +00:00
sleep.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
sleep.c Remember to include limits.h for UINT_MAX 2015-01-30 14:02:59 +00:00
sort.1 sort: minor manual page adjustments 2015-02-01 21:46:58 +01:00
sort.c Use size_t for number of lines in linebuf 2015-01-31 22:49:43 +00:00
split.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
split.c split: fixes 2015-02-01 16:30:12 +01:00
sponge.1 Refactor sponge(1) code and manpage 2015-02-08 22:17:21 +01:00
sponge.c Refactor sponge(1) code and manpage 2015-02-08 22:17:21 +01:00
strings.1 man pages: fix some typos 2015-02-01 21:28:17 +01:00
strings.c Respect exit status in strings(1) and update manpage 2014-11-23 12:44:38 +00:00
sync.1 Refactor sync(1) code and manpage 2015-02-08 22:08:14 +01:00
sync.c Add arg.h-handling to sync(1) and unlink(1) 2015-02-08 22:13:50 +01:00
tail.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
tail.c tail: Add rudimentary support to detect file truncation 2015-02-09 14:47:35 +00:00
tar.1 Refactor tar(1) manpage 2015-02-08 23:16:27 +01:00
tar.c No need to specify "rb" and "wb" in fopen, use "r" and "w" 2015-02-01 15:55:30 +00:00
tee.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
tee.c tee: -i option ignores SIGINT 2015-01-22 21:35:36 +00:00
test.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
test.c Un-boolify sbase 2014-11-14 10:54:20 +00:00
text.h Use size_t for number of lines in linebuf 2015-01-31 22:49:43 +00:00
TODO Update TODO with current roadmap 2015-02-08 23:28:00 +01:00
touch.1 2014 -> 2015 in touch.1 2015-02-09 12:38:31 +01:00
touch.c Do not rely on the underlying type of time_t in date(1) and touch(1) 2015-02-08 23:45:03 +00:00
tr.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
tr.c tr : Revert 97c5986146 2015-02-07 18:09:04 +01:00
true.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
true.c Simplify true(1) and false(1) 2014-10-03 00:03:08 +01:00
tty.1 Refactor tty(1) code and manpage 2015-02-07 22:00:28 +01:00
tty.c Refactor tty(1) code and manpage 2015-02-07 22:00:28 +01:00
uname.1 Refactor uname(1) code and manpage 2015-02-07 22:15:56 +01:00
uname.c Refactor uname(1) code and manpage 2015-02-07 22:15:56 +01:00
unexpand.1 Refactor unexpand(1) code and manpage, adding tablist support 2015-02-08 21:24:22 +01:00
unexpand.c Remove wchar.h from unexpand(1) 2015-02-09 00:20:02 +01:00
uniq.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uniq.c remove agetline 2014-11-18 21:05:28 +00:00
unlink.1 Refactor unlink(1) code and manpage 2015-02-08 21:59:59 +01:00
unlink.c Add arg.h-handling to sync(1) and unlink(1) 2015-02-08 22:13:50 +01:00
utf.h Rewrite tr(1) in a sane way 2015-01-10 14:26:30 +00:00
util.h Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
uudecode.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uudecode.c remove agetline 2014-11-18 21:05:28 +00:00
uuencode.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uuencode.c Fix coding style 2014-11-13 18:08:43 +00:00
wc.1 Finish up wc(1) 2015-02-01 03:01:11 +01:00
wc.c wc: Make output POSIX compliant 2015-02-06 19:46:45 +00:00
xargs.1 xargs.1: dont justify text, remove " " 2015-02-06 15:43:46 +01:00
xargs.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
yes.1 Finish up yes(1) by adding multiple string support 2015-02-01 02:13:47 +01:00
yes.c yes: Minor style fix 2015-02-01 01:27:05 +00:00

sbase - suckless unix tools
===========================

sbase  is a  collection of  unix  tools that  are inherently  portable
across UNIX and UNIX-like systems.

The following tools are implemented ('*' == finished, '#' == UTF-8 support,
'=' == implicit UTF-8 support):

   UTILITY         POSIX 2008 COMPLIANT         MISSING OPTIONS
   -------         --------------------         ---------------
=* basename        yes                          none
=* cal             yes                          none
=* cat             yes                          none
=  chgrp           no                           -h, -H, -L, -P
=* chmod           yes                          none
=  chown           no                           -h, -H, -L, -P
=* chroot          non-posix                    none
=* cksum           yes                          none
=* cmp             yes                          none
#* cols            non-posix                    none
=* comm            yes                          none
=  cp              no                           -H, (-i), -L
=* cron            non-posix                    none
#* cut             yes                          none
=* date            yes                          none
=* dirname         yes                          none
=  du              no                           -H, -L, (-x)
=* echo            yes                          none
=* env             yes                          none
#* expand          yes                          none
=* expr            yes                          none
=* false           yes                          none
#* fold            yes                          none
=* grep            yes                          none
=* head            yes                          none
=* hostname        non-posix                    none
=* kill            yes                          none
=* link            yes                          none
=* ln              yes                          none
=* logger          yes                          none
=* logname         yes                          none
=  ls              no                           -C, -R, -q, -u
=* md5sum          non-posix                    none
=* mkdir           yes                          none
=* mkfifo          yes                          none
=* mktemp          non-posix                    none
=* mv              yes                          none (-i)
=* nice            yes                          none
=  nl              no                           -d, -f, -h, -l, -n, -p, -v, -w
=* nohup           yes                          none
#* paste           yes                          none
=* printenv        non-posix                    none
   printf          stolen                       stolen
=* pwd             yes                          none
=  readlink        non-posix                    -e, -m
=* renice          yes                          none
=* rm              yes                          none (-i)
=* rmdir           yes                          none
=* setsid          non-posix                    none
=* sleep           yes                          none
   sort            no                           -m, -o, -d, -f, -i
=* split           yes                          none
=* sponge          non-posix                    none
   strings         no                           -a, -n, -t
=* sync            non-posix                    none
=  tail            no                           -c, -f
=* tar             non-posix                    none
=* tee             yes                          none
   test            yes                          none
=* touch           yes                          none
#* tr              yes                          none
=* true            yes                          none
=* tty             yes                          none
=* uname           yes                          none
#* unexpand        yes                          none
=  uniq            no                           -f, -s
=* unlink          yes                          none
=  uudecode        no                           -o
=  uuencode        no                           -m
   seq             non-posix                    none
=  sha1sum         non-posix                    none
=  sha256sum       non-posix                    none
=  sha512sum       non-posix                    none
#* wc              yes                          none
=  xargs           no                           -I, -L, -p, -s, -t, -x
=* yes             non-posix                    none

The  complement of  sbase  is  ubase[1] which  is  Linux-specific  and
provides all  the non-portable tools.   Together they are  intended to
form a base system similar to busybox but much smaller and suckless.

Building
--------

To  build sbase,  simply  type  make.  You  may  have  to fiddle  with
config.mk depending on your system.

You  can  also  build  sbase-box,  which  generates  a  single  binary
containing  all  the  required  tools.    You  can  then  symlink  the
individual tools to sbase-box.

Ideally you will  want to statically link sbase.  If  you are on Linux
we recommend using musl-libc[2].

Portability
-----------

sbase has been  compiled on a variety of  different operating systems,
including Linux, *BSD, OSX, Haiku, Solaris, SCO OpenServer and others.

Various combinations of operating  systems and architectures have also
been built.

You can build sbase with gcc, clang, tcc, nwcc and pcc.

[1] http://git.suckless.org/ubase/
[2] http://www.musl-libc.org/