mirror of git://git.suckless.org/ubase
Initial commit of ubase - the ugly/unportable base
This commit is contained in:
commit
987ec1ef09
|
@ -0,0 +1,21 @@
|
||||||
|
MIT/X Consortium License
|
||||||
|
|
||||||
|
© 2013 sin <sin@2f30.org>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,84 @@
|
||||||
|
include config.mk
|
||||||
|
|
||||||
|
.POSIX:
|
||||||
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
HDR = util.h arg.h ubase.h
|
||||||
|
LIB = \
|
||||||
|
$(OS)/grabmntinfo.o \
|
||||||
|
util/eprintf.o \
|
||||||
|
util/estrtol.o
|
||||||
|
|
||||||
|
SRC = \
|
||||||
|
df.c
|
||||||
|
|
||||||
|
OBJ = $(SRC:.c=.o) $(LIB)
|
||||||
|
BIN = $(SRC:.c=)
|
||||||
|
MAN = $(SRC:.c=.1)
|
||||||
|
|
||||||
|
all: binlib
|
||||||
|
|
||||||
|
binlib: util.a
|
||||||
|
$(MAKE) bin
|
||||||
|
|
||||||
|
bin: $(BIN)
|
||||||
|
|
||||||
|
$(OBJ): util.h config.mk
|
||||||
|
|
||||||
|
.o:
|
||||||
|
@echo LD $@
|
||||||
|
@$(LD) -o $@ $< util.a $(LDFLAGS)
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@echo CC $<
|
||||||
|
@$(CC) -c -o $@ $< $(CFLAGS)
|
||||||
|
|
||||||
|
util.a: $(LIB)
|
||||||
|
@echo AR $@
|
||||||
|
@$(AR) -r -c $@ $(LIB)
|
||||||
|
@ranlib $@
|
||||||
|
|
||||||
|
install: all
|
||||||
|
@echo installing executables to $(DESTDIR)$(PREFIX)/bin
|
||||||
|
@mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
|
@cp -f $(BIN) $(DESTDIR)$(PREFIX)/bin
|
||||||
|
@cd $(DESTDIR)$(PREFIX)/bin && chmod 755 $(BIN)
|
||||||
|
@echo installing manual pages to $(DESTDIR)$(MANPREFIX)/man1
|
||||||
|
@mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
||||||
|
@cp -f $(MAN) $(DESTDIR)$(MANPREFIX)/man1
|
||||||
|
@cd $(DESTDIR)$(MANPREFIX)/man1 && chmod 644 $(MAN)
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
@echo removing executables from $(DESTDIR)$(PREFIX)/bin
|
||||||
|
@cd $(DESTDIR)$(PREFIX)/bin && rm -f $(BIN)
|
||||||
|
@echo removing manual pages from $(DESTDIR)$(MANPREFIX)/man1
|
||||||
|
@cd $(DESTDIR)$(MANPREFIX)/man1 && rm -f $(MAN)
|
||||||
|
|
||||||
|
dist: clean
|
||||||
|
@echo creating dist tarball
|
||||||
|
@mkdir -p ubase-$(VERSION)
|
||||||
|
@cp -r LICENSE Makefile config.mk $(SRC) $(MAN) util $(HDR) ubase-$(VERSION)
|
||||||
|
@tar -cf ubase-$(VERSION).tar ubase-$(VERSION)
|
||||||
|
@gzip ubase-$(VERSION).tar
|
||||||
|
@rm -rf ubase-$(VERSION)
|
||||||
|
|
||||||
|
ubase-box: $(SRC) util.a
|
||||||
|
@echo creating box binary
|
||||||
|
@mkdir -p build
|
||||||
|
@cp $(HDR) build
|
||||||
|
@for f in $(SRC); do sed "s/^main(/`basename $$f .c`_&/" < $$f > build/$$f; done
|
||||||
|
@echo '#include <libgen.h>' > build/$@.c
|
||||||
|
@echo '#include <stdlib.h>' >> build/$@.c
|
||||||
|
@echo '#include <string.h>' >> build/$@.c
|
||||||
|
@echo '#include "util.h"' >> build/$@.c
|
||||||
|
@for f in $(SRC); do echo "int `basename $$f .c`_main(int, char **);" >> build/$@.c; done
|
||||||
|
@echo 'int main(int argc, char *argv[]) { char *s = basename(argv[0]); if(0) ;' >> build/$@.c
|
||||||
|
@for f in $(SRC); do echo "else if(!strcmp(s, \"`basename $$f .c`\")) `basename $$f .c`_main(argc, argv);" >> build/$@.c; done
|
||||||
|
@printf 'else eprintf("%%s: unknown program\\n", s); return EXIT_SUCCESS; }\n' >> build/$@.c
|
||||||
|
@echo LD $@
|
||||||
|
@$(LD) -o $@ build/*.c util.a $(CFLAGS) $(LDFLAGS)
|
||||||
|
@rm -r build
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo cleaning
|
||||||
|
@rm -f $(BIN) $(OBJ) $(LIB) util.a ubase-box
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copy me if you can.
|
||||||
|
* by 20h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ARG_H__
|
||||||
|
#define __ARG_H__
|
||||||
|
|
||||||
|
extern char *argv0;
|
||||||
|
|
||||||
|
#define USED(x) ((void)(x))
|
||||||
|
|
||||||
|
/* use main(int argc, char *argv[]) */
|
||||||
|
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
|
||||||
|
argv[0] && argv[0][1]\
|
||||||
|
&& argv[0][0] == '-';\
|
||||||
|
argc--, argv++) {\
|
||||||
|
char _argc;\
|
||||||
|
char **_argv;\
|
||||||
|
int brk;\
|
||||||
|
if (argv[0][1] == '-' && argv[0][2] == '\0') {\
|
||||||
|
argv++;\
|
||||||
|
argc--;\
|
||||||
|
break;\
|
||||||
|
}\
|
||||||
|
for (brk = 0, argv[0]++, _argv = argv;\
|
||||||
|
argv[0][0] && !brk;\
|
||||||
|
argv[0]++) {\
|
||||||
|
if (_argv != argv)\
|
||||||
|
break;\
|
||||||
|
_argc = argv[0][0];\
|
||||||
|
switch (_argc)
|
||||||
|
|
||||||
|
#define ARGEND }\
|
||||||
|
USED(_argc);\
|
||||||
|
}\
|
||||||
|
USED(argv);\
|
||||||
|
USED(argc);
|
||||||
|
|
||||||
|
#define ARGC() _argc
|
||||||
|
|
||||||
|
#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
||||||
|
((x), abort(), (char *)0) :\
|
||||||
|
(brk = 1, (argv[0][1] != '\0')?\
|
||||||
|
(&argv[0][1]) :\
|
||||||
|
(argc--, argv++, argv[0])))
|
||||||
|
|
||||||
|
#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
||||||
|
(char *)0 :\
|
||||||
|
(brk = 1, (argv[0][1] != '\0')?\
|
||||||
|
(&argv[0][1]) :\
|
||||||
|
(argc--, argv++, argv[0])))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# ubase version
|
||||||
|
VERSION = 0.0
|
||||||
|
|
||||||
|
# paths
|
||||||
|
PREFIX = /usr/local
|
||||||
|
MANPREFIX = $(PREFIX)/share/man
|
||||||
|
|
||||||
|
# OS to build against
|
||||||
|
OS = linux
|
||||||
|
#OS = openbsd
|
||||||
|
|
||||||
|
#CC = gcc
|
||||||
|
#CC = musl-gcc
|
||||||
|
LD = $(CC)
|
||||||
|
CPPFLAGS = -D_BSD_SOURCE -D_GNU_SOURCE
|
||||||
|
CFLAGS = -g -ansi -Wall -Wno-long-long -pedantic $(CPPFLAGS)
|
||||||
|
LDFLAGS = -g
|
||||||
|
|
||||||
|
#CC = tcc
|
||||||
|
#LD = $(CC)
|
||||||
|
#CPPFLAGS = -D_POSIX_C_SOURCE=200112L
|
||||||
|
#CFLAGS = -Os -Wall $(CPPFLAGS)
|
||||||
|
#LDFLAGS =
|
|
@ -0,0 +1,69 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "ubase.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
static void mnt_show(const char *fsname, const char *dir);
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
eprintf("usage: %s\n", argv0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct mntinfo *minfo = NULL;
|
||||||
|
int siz, i;
|
||||||
|
|
||||||
|
ARGBEGIN {
|
||||||
|
case 'a':
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
case 'h':
|
||||||
|
case 'i':
|
||||||
|
eprintf("not implemented\n");
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
} ARGEND;
|
||||||
|
|
||||||
|
printf("Filesystem 512-blocks Used Avail Capacity Mounted on\n");
|
||||||
|
siz = grabmntinfo(&minfo);
|
||||||
|
if (!siz)
|
||||||
|
eprintf("grabmntinfo:");
|
||||||
|
|
||||||
|
for (i = 0; i < siz; i++)
|
||||||
|
mnt_show(minfo[i].fsname, minfo[i].mntdir);
|
||||||
|
free(minfo);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mnt_show(const char *fsname, const char *dir)
|
||||||
|
{
|
||||||
|
struct statvfs s;
|
||||||
|
unsigned long long total, used, avail;
|
||||||
|
int capacity = 0;
|
||||||
|
int bs;
|
||||||
|
|
||||||
|
statvfs(dir, &s);
|
||||||
|
|
||||||
|
bs = s.f_frsize / 512;
|
||||||
|
total = s.f_blocks * bs;
|
||||||
|
avail = s.f_bfree * bs;
|
||||||
|
used = total - avail;
|
||||||
|
|
||||||
|
if (used + avail) {
|
||||||
|
capacity = (used * 100) / (used + avail);
|
||||||
|
if (used * 100 != capacity * (used + avail))
|
||||||
|
capacity++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%-12s %9llu %9llu %9llu %7d%% %s\n",
|
||||||
|
fsname, total, used, avail, capacity,
|
||||||
|
dir);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <mntent.h>
|
||||||
|
#include "../ubase.h"
|
||||||
|
#include "../util.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
grabmntinfo(struct mntinfo **minfo)
|
||||||
|
{
|
||||||
|
struct mntent *me;
|
||||||
|
struct mntinfo *mi = NULL;
|
||||||
|
int siz = 0;
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
fp = setmntent("/proc/mounts", "r");
|
||||||
|
if (!fp)
|
||||||
|
eprintf("setmntent:");
|
||||||
|
while ((me = getmntent(fp))) {
|
||||||
|
mi = realloc(mi, (siz + 1) * sizeof(*mi));
|
||||||
|
if (!mi)
|
||||||
|
eprintf("realloc:");
|
||||||
|
mi[siz].fsname = strdup(me->mnt_fsname);
|
||||||
|
mi[siz].mntdir = strdup(me->mnt_dir);
|
||||||
|
siz++;
|
||||||
|
}
|
||||||
|
endmntent(fp);
|
||||||
|
*minfo = mi;
|
||||||
|
return siz;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "../ubase.h"
|
||||||
|
#include "../util.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
grabmntinfo(struct mntinfo **minfo)
|
||||||
|
{
|
||||||
|
int siz, i;
|
||||||
|
struct statfs *mntbuf;
|
||||||
|
struct mntinfo *mi;
|
||||||
|
|
||||||
|
siz = getmntinfo(&mntbuf, MNT_WAIT);
|
||||||
|
if (!siz)
|
||||||
|
eprintf("getmntinfo:");
|
||||||
|
mi = malloc(siz * sizeof(*mi));
|
||||||
|
if (!mi)
|
||||||
|
eprintf("malloc:");
|
||||||
|
for (i = 0; i < siz; i++) {
|
||||||
|
mi[i].fsname = strdup(mntbuf[i].f_mntfromname);
|
||||||
|
mi[i].mntdir = strdup(mntbuf[i].f_mntonname);
|
||||||
|
}
|
||||||
|
*minfo = mi;
|
||||||
|
return siz;
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
struct mntinfo {
|
||||||
|
const char *fsname;
|
||||||
|
const char *mntdir;
|
||||||
|
};
|
||||||
|
|
||||||
|
int grabmntinfo(struct mntinfo **minfo);
|
|
@ -0,0 +1,11 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include "arg.h"
|
||||||
|
|
||||||
|
#define UTF8_POINT(c) (((c) & 0xc0) != 0x80)
|
||||||
|
#define LEN(x) (sizeof (x) / sizeof *(x))
|
||||||
|
|
||||||
|
extern char *argv0;
|
||||||
|
|
||||||
|
void eprintf(const char *, ...);
|
||||||
|
void enprintf(int, const char *, ...);
|
||||||
|
long estrtol(const char *, int);
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../util.h"
|
||||||
|
|
||||||
|
char *argv0;
|
||||||
|
|
||||||
|
static void venprintf(int, const char *, va_list);
|
||||||
|
|
||||||
|
void
|
||||||
|
eprintf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
venprintf(EXIT_FAILURE, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
enprintf(int status, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
venprintf(status, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
venprintf(int status, const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
/*fprintf(stderr, "%s: ", argv0);*/
|
||||||
|
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
|
||||||
|
if(fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
||||||
|
fputc(' ', stderr);
|
||||||
|
perror(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(status);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "../util.h"
|
||||||
|
|
||||||
|
long
|
||||||
|
estrtol(const char *s, int base)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
long n;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
n = strtol(s, &end, base);
|
||||||
|
if(*end != '\0') {
|
||||||
|
if(base == 0)
|
||||||
|
eprintf("%s: not an integer\n", s);
|
||||||
|
else
|
||||||
|
eprintf("%s: not a base %d integer\n", s, base);
|
||||||
|
}
|
||||||
|
if(errno != 0)
|
||||||
|
eprintf("%s:", s);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue