diff --git a/Makefile b/Makefile index 6d74b21..a995e6f 100644 --- a/Makefile +++ b/Makefile @@ -1,46 +1,90 @@ -# slock - simple screen locker -# See LICENSE file for copyright and license details. +UNAME_M := $(shell uname -m) -include config.mk +ifeq ($(UNAME_M),x86_64) + ARCH := ARCHITECTURE_X64 +else ifneq ($(filter $(UNAME_M),i686,i386),) + ARCH := ARCHITECTURE_X86 +else ifneq ($(filter $(UNAME_M),aarch64 arm64),) + ARCH := ARCHITECTURE_ARM64 +else ifneq ($(filter $(UNAME_M),armv7l armv6l),) + ARCH := ARCHITECTURE_ARM32 +endif -SRC = slock.c ${COMPATSRC} -OBJ = ${SRC:.c=.o} +UNAME_E := $(shell [ $$(printf '\01\00' | od -An -tu2) -eq 1 ] && \ + echo "little" || echo "big") -all: slock +ifeq ($(UNAME_E),little) + ENDIANESS := LITTLE_ENDIAN +else ifeq ($(UNAME_E),little) + ENDIANESS := BIG_ENDIAN +endif -.c.o: - ${CC} -c ${CFLAGS} $< +UNAME_S := $(shell uname -s) -${OBJ}: config.h config.mk arg.h util.h +ifeq ($(UNAME_S),Darwin) + OS := OS_MACOS +else ifeq ($(UNAME_S),Linux) + OS := OS_LINUX +endif -config.h: - cp config.def.h $@ +CC = gcc -slock: ${OBJ} - ${CC} -o $@ ${OBJ} ${LDFLAGS} +ifeq ($(CC),clang) + COMP := COMPILER_CLANG +else ifeq ($(CC),gcc) + COMP := COMPILER_GCC +endif + +# -ansi -pedantic -pedantic-errors +CFLAGS = -Wno-long-long -Wall -Wextra \ + -Wincompatible-pointer-types \ + -Wint-conversion -Wformat \ + -Wno-strict-prototypes -Wno-missing-field-initializers \ + -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable \ + -Wno-unused-but-set-variable \ + -fno-show-column + +ifeq ($(COMP),COMPILER_CLANG) + CFLAGS += -fno-caret-diagnostics +else ifeq ($(COMP),COMPILER_GCC) + CFLAGS += -fno-diagnostics-show-caret +endif + +ifeq ($(OS),OS_MACOS) + FLAGS = -glldb + INCLUDE = + LIBS = + FRAMEWORKS = +else ifeq ($(OS),OS_LINUX) + FLAGS = -O3 # -ggdb -DDEBUG=1 -DINTERNAL=1 + INCLUDE = -I/usr/include -I/usr/X11R6/include + LIBS = -lc -lcrypt -lX11 -lXext -lXrandr + FRAMEWORKS = +endif + +EXE = slock +VERSION = "\"1.7\"" + +default: $(EXE) + +$(EXE): $(EXE).c explicit_bzero.c + $(CC) $(CFLAGS) $(FLAGS) \ + -D$(ARCH)=1 -D$(ENDIANESS)=1 -D$(OS)=1 -D$(COMP)=1 \ + -DVERSION=$(VERSION) -D_DEFAULT_SOURCE -DHAVE_SHADOW_H \ + $(INCLUDE) $^ $(LIBS) \ + $(FRAMEWORKS) -o $@ $(ifneq $(filter $(OS), OS_MACOS OS_LINUX), \ + /link /FORCE:MULTIPLE) + +watch: + @ while true; do \ + inotifywait -q -q -e 'modify' . && clear && make -B; \ + done + +perf: + perf record --call-graph dwarf ./$(EXE) + +run: + @ clear; ./$(EXE) clean: - rm -f slock ${OBJ} slock-${VERSION}.tar.gz - -dist: clean - mkdir -p slock-${VERSION} - cp -R LICENSE Makefile README slock.1 config.mk \ - ${SRC} config.def.h arg.h util.h slock-${VERSION} - tar -cf slock-${VERSION}.tar slock-${VERSION} - gzip slock-${VERSION}.tar - rm -rf slock-${VERSION} - -install: all - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f slock ${DESTDIR}${PREFIX}/bin - chmod 755 ${DESTDIR}${PREFIX}/bin/slock - chmod u+s ${DESTDIR}${PREFIX}/bin/slock - mkdir -p ${DESTDIR}${MANPREFIX}/man1 - sed "s/VERSION/${VERSION}/g" ${DESTDIR}${MANPREFIX}/man1/slock.1 - chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1 - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/slock - rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1 - -.PHONY: all clean dist install uninstall + @ rm -rf $(EXE) $(EXE).dSYM diff --git a/README b/README index dcacd01..971e482 100644 --- a/README +++ b/README @@ -8,17 +8,31 @@ Requirements In order to build slock you need the Xlib header files. +Notes +------------ +As of right now, this implementation assumes that the user has no automatic +display management utilities, like mutter. + + Installation ------------ -Edit config.mk to match your local setup (slock is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install slock -(if necessary as root): - - make clean install +# make +# chmod u+s ./slock +# mv ./slock /usr/local/bin Running slock ------------- Simply invoke the 'slock' command. To get out of it, enter your password. + + +Security Considerations +------------- +To make sure a locked screen can not be bypassed by switching VTs or killing +the X server with Ctrl+Alt+Backspace, it is recommended to disable both in +xorg.conf for maximum security: + +Section "ServerFlags" + Option "DontVTSwitch" "True" + Option "DontZap" "True" +EndSection diff --git a/config.def.h b/config.def.h deleted file mode 100644 index d2a6588..0000000 --- a/config.def.h +++ /dev/null @@ -1,36 +0,0 @@ -/* user and group to drop privileges to */ -/* NOTE: Leave these empty if you want them to be determined automatically. */ -static const char *user = ""; -static const char *group = ""; - -static const int displaytimeout = 5; /* 0 to disable */ - -static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ -}; - -/* treat a cleared input like a wrong password (color) */ -static const int failonclear = 1; - -static const Passthrough passthroughs[] = { - /* Modifier Key */ - { 0, XF86XK_AudioRaiseVolume }, - { 0, XF86XK_AudioLowerVolume }, - { 0, XF86XK_AudioMute }, - { 0, XF86XK_AudioPause }, - { 0, XF86XK_AudioStop }, - { 0, XF86XK_AudioNext }, - { 0, XF86XK_AudioPrev }, - { 0, XF86XK_MonBrightnessUp }, - { 0, XF86XK_MonBrightnessDown }, -}; - -/*static const char *dspoffcmd[] = { "xset", "dpms", "force", "off", NULL };*/ - -static const Key keys[] = { - /* modifier key function argument */ - 0 - /*{ 0, XK_Escape, spawn, {.v = dspoffcmd } }*/ -}; diff --git a/config.mk b/config.mk deleted file mode 100644 index f5bad35..0000000 --- a/config.mk +++ /dev/null @@ -1,36 +0,0 @@ -# slock version -VERSION = 1.7 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# includes and libs -INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr - -# flags -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} -#CFLAGS = -std=c99 -pedantic -Wno-long-long -Wall -Wextra \ -# -Wincompatible-pointer-types \ -# -Wint-conversion -Wformat \ -# -Wno-strict-prototypes -Wno-missing-field-initializers \ -# -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable \ -# -Wno-unused-but-set-variable \ -# -fno-show-column -fno-diagnostics-show-caret -ggdb ${INCS} ${CPPFLAGS} -LDFLAGS = -s ${LIBS} -COMPATSRC = explicit_bzero.c - -# On OpenBSD and Darwin remove -lcrypt from LIBS -#LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr -# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS -# On NetBSD add -D_NETBSD_SOURCE to CPPFLAGS -#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE -D_NETBSD_SOURCE -# On OpenBSD set COMPATSRC to empty -#COMPATSRC = diff --git a/slock.1 b/slock.1 deleted file mode 100644 index 40c15e1..0000000 --- a/slock.1 +++ /dev/null @@ -1,45 +0,0 @@ -.Dd October 6, 2023 -.Dt SLOCK 1 -.Os -.Sh NAME -.Nm slock -.Nd simple X screen locker -.Sh SYNOPSIS -.Nm -.Op Fl v -.Op Ar cmd Op Ar arg ... -.Sh DESCRIPTION -.Nm -is a simple X screen locker. -If provided, -.Ar cmd -is executed after the screen has been locked. -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl v -Print version information to stdout and exit. -.El -.Sh EXIT STATUS -.Ex -std -.Sh EXAMPLES -$ -.Nm -/usr/sbin/s2ram -.Sh SECURITY CONSIDERATIONS -To make sure a locked screen can not be bypassed by switching VTs -or killing the X server with Ctrl+Alt+Backspace, it is recommended -to disable both in -.Xr xorg.conf 5 -for maximum security: -.Bd -literal -Section "ServerFlags" - Option "DontVTSwitch" "True" - Option "DontZap" "True" -EndSection -.Ed -.Sh CUSTOMIZATION -.Nm -can be customized by creating a custom config.h from config.def.h and -(re)compiling the source code. -This keeps it fast, secure and simple.