From 79c6e8d3a1b0116fa56de453c63d0f362bbabc4d Mon Sep 17 00:00:00 2001 From: Ryan Kes Date: Sun, 17 Mar 2019 16:51:40 +0100 Subject: [PATCH] deleted comment --- PKGBUILD | 1 - pre/slock-1.4/LICENSE | 24 ++ pre/slock-1.4/Makefile | 61 ++++ pre/slock-1.4/README | 24 ++ pre/slock-1.4/arg.h | 65 +++++ pre/slock-1.4/config.def.h | 21 ++ pre/slock-1.4/config.h | 18 ++ pre/slock-1.4/config.mk | 32 ++ pre/slock-1.4/explicit_bzero.c | 19 ++ pre/slock-1.4/explicit_bzero.o | Bin 0 -> 1408 bytes pre/slock-1.4/slock | Bin 0 -> 18296 bytes pre/slock-1.4/slock.1 | 39 +++ pre/slock-1.4/slock.c | 437 ++++++++++++++++++++++++++++ pre/slock-1.4/slock.o | Bin 0 -> 12560 bytes pre/slock-1.4/util.h | 2 + slock-1.2-background-image.diff | 108 +++++++ slock-message-20180626-35633d4.diff | 171 +++++++++++ 17 files changed, 1021 insertions(+), 1 deletion(-) create mode 100644 pre/slock-1.4/LICENSE create mode 100644 pre/slock-1.4/Makefile create mode 100644 pre/slock-1.4/README create mode 100644 pre/slock-1.4/arg.h create mode 100644 pre/slock-1.4/config.def.h create mode 100644 pre/slock-1.4/config.h create mode 100644 pre/slock-1.4/config.mk create mode 100644 pre/slock-1.4/explicit_bzero.c create mode 100644 pre/slock-1.4/explicit_bzero.o create mode 100755 pre/slock-1.4/slock create mode 100644 pre/slock-1.4/slock.1 create mode 100644 pre/slock-1.4/slock.c create mode 100644 pre/slock-1.4/slock.o create mode 100644 pre/slock-1.4/util.h create mode 100644 slock-1.2-background-image.diff create mode 100644 slock-message-20180626-35633d4.diff diff --git a/PKGBUILD b/PKGBUILD index 0dd35a9..2b22abf 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -9,7 +9,6 @@ url="http://tools.suckless.org/slock" license=('MIT') depends=('libxext' 'libxrandr') source=("http://dl.suckless.org/tools/$pkgname-$pkgver.tar.gz") -#source=("slock-$pkgver.tar.bz2::http://hg.suckless.org/slock/archive/$_pkgver.tar.gz") sha256sums=('b53849dbc60109a987d7a49b8da197305c29307fd74c12dc18af0d3044392e6a' '97c09fd6f7e0aff3002a24dabe57798bcfaa1467a043cf7b7119177f005e5848' diff --git a/pre/slock-1.4/LICENSE b/pre/slock-1.4/LICENSE new file mode 100644 index 0000000..2e4419b --- /dev/null +++ b/pre/slock-1.4/LICENSE @@ -0,0 +1,24 @@ +MIT/X Consortium License + +© 2015-2016 Markus Teich +© 2014 Dimitris Papastamos +© 2006-2014 Anselm R Garbe +© 2014-2016 Laslo Hunhold + +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. diff --git a/pre/slock-1.4/Makefile b/pre/slock-1.4/Makefile new file mode 100644 index 0000000..f4ffbb7 --- /dev/null +++ b/pre/slock-1.4/Makefile @@ -0,0 +1,61 @@ +# slock - simple screen locker +# See LICENSE file for copyright and license details. + +include config.mk + +SRC = slock.c ${COMPATSRC} +OBJ = ${SRC:.c=.o} + +all: options slock + +options: + @echo slock build options: + @echo "CFLAGS = ${CFLAGS}" + @echo "LDFLAGS = ${LDFLAGS}" + @echo "CC = ${CC}" + +.c.o: + @echo CC $< + @${CC} -c ${CFLAGS} $< + +${OBJ}: config.h config.mk arg.h util.h + +config.h: + @echo creating $@ from config.def.h + @cp config.def.h $@ + +slock: ${OBJ} + @echo CC -o $@ + @${CC} -o $@ ${OBJ} ${LDFLAGS} + +clean: + @echo cleaning + @rm -f slock ${OBJ} slock-${VERSION}.tar.gz + +dist: clean + @echo creating dist tarball + @mkdir -p slock-${VERSION} + @cp -R LICENSE Makefile README slock.1 config.mk \ + ${SRC} explicit_bzero.c 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 + @echo installing executable file to ${DESTDIR}${PREFIX}/bin + @mkdir -p ${DESTDIR}${PREFIX}/bin + @cp -f slock ${DESTDIR}${PREFIX}/bin + @chmod 755 ${DESTDIR}${PREFIX}/bin/slock + @chmod u+s ${DESTDIR}${PREFIX}/bin/slock + @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 + @mkdir -p ${DESTDIR}${MANPREFIX}/man1 + @sed "s/VERSION/${VERSION}/g" ${DESTDIR}${MANPREFIX}/man1/slock.1 + @chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1 + +uninstall: + @echo removing executable file from ${DESTDIR}${PREFIX}/bin + @rm -f ${DESTDIR}${PREFIX}/bin/slock + @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 + @rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1 + +.PHONY: all options clean dist install uninstall diff --git a/pre/slock-1.4/README b/pre/slock-1.4/README new file mode 100644 index 0000000..a81290d --- /dev/null +++ b/pre/slock-1.4/README @@ -0,0 +1,24 @@ +slock - simple screen locker +============================ +simple screen locker utility for X. + + +Requirements +------------ +In order to build slock you need the Xlib header files. + + +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 + + +Running slock +------------- +Simply invoke the 'slock' command. To get out of it, enter your password. diff --git a/pre/slock-1.4/arg.h b/pre/slock-1.4/arg.h new file mode 100644 index 0000000..0b23c53 --- /dev/null +++ b/pre/slock-1.4/arg.h @@ -0,0 +1,65 @@ +/* + * Copy me if you can. + * by 20h + */ + +#ifndef ARG_H__ +#define ARG_H__ + +extern char *argv0; + +/* use main(int argc, char *argv[]) */ +#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ + argv[0] && argv[0][0] == '-'\ + && argv[0][1];\ + 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_) + +/* Handles obsolete -NUM syntax */ +#define ARGNUM case '0':\ + case '1':\ + case '2':\ + case '3':\ + case '4':\ + case '5':\ + case '6':\ + case '7':\ + case '8':\ + case '9' + +#define ARGEND }\ + } + +#define ARGC() argc_ + +#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX)) + +#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]))) + +#define LNGARG() &argv[0][0] + +#endif diff --git a/pre/slock-1.4/config.def.h b/pre/slock-1.4/config.def.h new file mode 100644 index 0000000..932b728 --- /dev/null +++ b/pre/slock-1.4/config.def.h @@ -0,0 +1,21 @@ +/* user and group to drop privileges to */ +static const char *user = "nobody"; +static const char *group = "nobody"; + +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; + +/* time in seconds before the monitor shuts down */ +static const int monitortime = 5; + +/* treat a cleared input like a wrong password */ +static const int failonclear = 1; + +/* time to cancel lock with mouse movement in seconds */ +static const int timetocancel = 3; diff --git a/pre/slock-1.4/config.h b/pre/slock-1.4/config.h new file mode 100644 index 0000000..a6306fb --- /dev/null +++ b/pre/slock-1.4/config.h @@ -0,0 +1,18 @@ +/* user and group to drop privileges to */ +static const char *user = "nobody"; +static const char *group = "nobody"; + +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; + +/* time in seconds before the monitor shuts down */ +static const int monitortime = 5; + +/* time to cancel lock with mouse movement in seconds */ +static const int timetocancel = 3; diff --git a/pre/slock-1.4/config.mk b/pre/slock-1.4/config.mk new file mode 100644 index 0000000..bb846fc --- /dev/null +++ b/pre/slock-1.4/config.mk @@ -0,0 +1,32 @@ +# slock version +VERSION = 1.4 + +# 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} +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 = + +# compiler and linker +CC = cc diff --git a/pre/slock-1.4/explicit_bzero.c b/pre/slock-1.4/explicit_bzero.c new file mode 100644 index 0000000..3e33ca8 --- /dev/null +++ b/pre/slock-1.4/explicit_bzero.c @@ -0,0 +1,19 @@ +/* $OpenBSD: explicit_bzero.c,v 1.3 2014/06/21 02:34:26 matthew Exp $ */ +/* + * Public domain. + * Written by Matthew Dempsky. + */ + +#include + +__attribute__((weak)) void +__explicit_bzero_hook(void *buf, size_t len) +{ +} + +void +explicit_bzero(void *buf, size_t len) +{ + memset(buf, 0, len); + __explicit_bzero_hook(buf, len); +} diff --git a/pre/slock-1.4/explicit_bzero.o b/pre/slock-1.4/explicit_bzero.o new file mode 100644 index 0000000000000000000000000000000000000000..d37bfbe507fb71877ba7ebb65003197f94918f60 GIT binary patch literal 1408 zcmbtUJ4*vW5S}wW;sbmZLM#poQP9N;f+2+*1Wgc8P%NyDOFT)4$%Wh%F^#tA{0Y`p z{sh4vp?|?nu@fQATz2BRo{dh(eY4-Zc4qhPa(i!Qz%YQtfGzl1F$-`t@TJ?4YQqGK z!-I8S=)4v>?{Bw-&f{}r$>(xeb2-0%ykcfVT3BX!-O5;2dK0a4kq3a$J_MsRWuzuX zlGj*p3i$=LNhEGv>N6651KRT-ymsU4iP(++68MXg1ZIkp1PsT~m}TS_e&`2JeJm>b z;aM*uKZ884`~7;Y#(AYw37ulwYx<%Dj`N*z%D!KP?;OCStW2FG@&D27i79zHPUT2p zL*scLAcBip=oS&fW)I7(HNA6JgkCEIaq5OHh++_cDEYOTS4Xbyhn~P&uoi@FsR|-; z_sY&$)2(^3+`qxZ476AMWNhR}W_!?o_WP1d3Xx`H%QeH3bexyOC?ZibOA_XnP$yo$ zNk`-qBYOQ+^r4)8jkhqCa`JnEY9w5r`csALGiK4qy6RU~7mBX?9>{q0E|Ggf#@G@W zcz(RzMI~1Ql QF)rSen>ta0QP<-?0Z8Cnc>n+a literal 0 HcmV?d00001 diff --git a/pre/slock-1.4/slock b/pre/slock-1.4/slock new file mode 100755 index 0000000000000000000000000000000000000000..33de3e0404ea94a2b9c22d0d25a0fd99ffd4b9d3 GIT binary patch literal 18296 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 V9g%Y1qMX0MY#kCo)VUsq{|{R879Icq literal 0 HcmV?d00001 diff --git a/pre/slock-1.4/slock.1 b/pre/slock-1.4/slock.1 new file mode 100644 index 0000000..82cdcd6 --- /dev/null +++ b/pre/slock-1.4/slock.1 @@ -0,0 +1,39 @@ +.Dd 2016-08-23 +.Dt SLOCK 1 +.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 Op Ar arg ... +is executed after the screen has been locked. +.Sh OPTIONS +.Bl -tag -width Ds +.It Fl v +Print version information to stdout and exit. +.El +.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 -offset left +Section "ServerFlags" + Option "DontVTSwitch" "True" + Option "DontZap" "True" +EndSection +.Ed +.Sh EXAMPLES +$ +.Nm +/usr/sbin/s2ram +.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. diff --git a/pre/slock-1.4/slock.c b/pre/slock-1.4/slock.c new file mode 100644 index 0000000..5d392aa --- /dev/null +++ b/pre/slock-1.4/slock.c @@ -0,0 +1,437 @@ +/* See LICENSE file for license details. */ +#define _XOPEN_SOURCE 500 +#if HAVE_SHADOW_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "arg.h" +#include "util.h" + +static time_t tim; + +char *argv0; + +enum { + INIT, + INPUT, + FAILED, + NUMCOLS +}; + +struct lock { + int screen; + Window root, win; + Pixmap pmap; + unsigned long colors[NUMCOLS]; +}; + +struct xrandr { + int active; + int evbase; + int errbase; +}; + +#include "config.h" + +static void +die(const char *errstr, ...) +{ + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(1); +} + +#ifdef __linux__ +#include +#include + +static void +dontkillme(void) +{ + FILE *f; + const char oomfile[] = "/proc/self/oom_score_adj"; + + if (!(f = fopen(oomfile, "w"))) { + if (errno == ENOENT) + return; + die("slock: fopen %s: %s\n", oomfile, strerror(errno)); + } + fprintf(f, "%d", OOM_SCORE_ADJ_MIN); + if (fclose(f)) { + if (errno == EACCES) + die("slock: unable to disable OOM killer. " + "Make sure to suid or sgid slock.\n"); + else + die("slock: fclose %s: %s\n", oomfile, strerror(errno)); + } +} +#endif + +static const char * +gethash(void) +{ + const char *hash; + struct passwd *pw; + + /* Check if the current user has a password entry */ + errno = 0; + if (!(pw = getpwuid(getuid()))) { + if (errno) + die("slock: getpwuid: %s\n", strerror(errno)); + else + die("slock: cannot retrieve password entry\n"); + } + hash = pw->pw_passwd; + +#if HAVE_SHADOW_H + if (!strcmp(hash, "x")) { + struct spwd *sp; + if (!(sp = getspnam(pw->pw_name))) + die("slock: getspnam: cannot retrieve shadow entry. " + "Make sure to suid or sgid slock.\n"); + hash = sp->sp_pwdp; + } +#else + if (!strcmp(hash, "*")) { +#ifdef __OpenBSD__ + if (!(pw = getpwuid_shadow(getuid()))) + die("slock: getpwnam_shadow: cannot retrieve shadow entry. " + "Make sure to suid or sgid slock.\n"); + hash = pw->pw_passwd; +#else + die("slock: getpwuid: cannot retrieve shadow entry. " + "Make sure to suid or sgid slock.\n"); +#endif /* __OpenBSD__ */ + } +#endif /* HAVE_SHADOW_H */ + + return hash; +} + +static void +readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + const char *hash) +{ + XRRScreenChangeNotifyEvent *rre; + char buf[32], passwd[256], *inputhash; + int num, screen, running, failure, oldc; + unsigned int len, color; + KeySym ksym; + XEvent ev; + + len = 0; + running = 1; + failure = 0; + oldc = INIT; + + while (running && !XNextEvent(dpy, &ev)) { + running = !((time(NULL) - tim < timetocancel) && (ev.type == MotionNotify)); + if (ev.type == KeyPress) { + explicit_bzero(&buf, sizeof(buf)); + num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); + if (IsKeypadKey(ksym)) { + if (ksym == XK_KP_Enter) + ksym = XK_Return; + else if (ksym >= XK_KP_0 && ksym <= XK_KP_9) + ksym = (ksym - XK_KP_0) + XK_0; + } + if (IsFunctionKey(ksym) || + IsKeypadKey(ksym) || + IsMiscFunctionKey(ksym) || + IsPFKey(ksym) || + IsPrivateKeypadKey(ksym)) + continue; + switch (ksym) { + case XK_Return: + passwd[len] = '\0'; + errno = 0; + if (!(inputhash = crypt(passwd, hash))) + fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); + else + running = !!strcmp(inputhash, hash); + if (running) { + XBell(dpy, 100); + failure = 1; + } + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; + break; + case XK_Escape: + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; + break; + case XF86XK_AudioRaiseVolume: + XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev); + break; + case XF86XK_AudioLowerVolume: + XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev); + break; + case XF86XK_AudioMute: + XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev); + break; + case XF86XK_MonBrightnessUp: + XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev); + break; + case XF86XK_MonBrightnessDown: + XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev); + break; + case XK_BackSpace: + if (len) + passwd[len--] = '\0'; + break; + default: + if (num && !iscntrl((int)buf[0]) && + (len + num < sizeof(passwd))) { + memcpy(passwd + len, buf, num); + len += num; + } + break; + } + color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); + if (running && oldc != color) { + for (screen = 0; screen < nscreens; screen++) { + XSetWindowBackground(dpy, + locks[screen]->win, + locks[screen]->colors[color]); + XClearWindow(dpy, locks[screen]->win); + } + oldc = color; + } + } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) { + rre = (XRRScreenChangeNotifyEvent*)&ev; + for (screen = 0; screen < nscreens; screen++) { + if (locks[screen]->win == rre->window) { + XResizeWindow(dpy, locks[screen]->win, + rre->width, rre->height); + XClearWindow(dpy, locks[screen]->win); + } + } + } else for (screen = 0; screen < nscreens; screen++) + XRaiseWindow(dpy, locks[screen]->win); + } +} + +static struct lock * +lockscreen(Display *dpy, struct xrandr *rr, int screen) +{ + char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; + int i, ptgrab, kbgrab; + struct lock *lock; + XColor color, dummy; + XSetWindowAttributes wa; + Cursor invisible; + + if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) + return NULL; + + lock->screen = screen; + lock->root = RootWindow(dpy, lock->screen); + + for (i = 0; i < NUMCOLS; i++) { + XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), + colorname[i], &color, &dummy); + lock->colors[i] = color.pixel; + } + + /* init */ + wa.override_redirect = 1; + wa.background_pixel = lock->colors[INIT]; + lock->win = XCreateWindow(dpy, lock->root, 0, 0, + DisplayWidth(dpy, lock->screen), + DisplayHeight(dpy, lock->screen), + 0, DefaultDepth(dpy, lock->screen), + CopyFromParent, + DefaultVisual(dpy, lock->screen), + CWOverrideRedirect | CWBackPixel, &wa); + lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); + invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, + &color, &color, 0, 0); + XDefineCursor(dpy, lock->win, invisible); + + /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ + for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { + if (ptgrab != GrabSuccess) { + ptgrab = XGrabPointer(dpy, lock->root, False, + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask, GrabModeAsync, + GrabModeAsync, None, invisible, CurrentTime); + } + if (kbgrab != GrabSuccess) { + kbgrab = XGrabKeyboard(dpy, lock->root, True, + GrabModeAsync, GrabModeAsync, CurrentTime); + } + + /* input is grabbed: we can lock the screen */ + if (ptgrab == GrabSuccess && kbgrab == GrabSuccess) { + XMapRaised(dpy, lock->win); + if (rr->active) + XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); + + XSelectInput(dpy, lock->root, SubstructureNotifyMask); + tim = time(NULL); + return lock; + } + + /* retry on AlreadyGrabbed but fail on other errors */ + if ((ptgrab != AlreadyGrabbed && ptgrab != GrabSuccess) || + (kbgrab != AlreadyGrabbed && kbgrab != GrabSuccess)) + break; + + usleep(100000); + } + + /* we couldn't grab all input: fail out */ + if (ptgrab != GrabSuccess) + fprintf(stderr, "slock: unable to grab mouse pointer for screen %d\n", + screen); + if (kbgrab != GrabSuccess) + fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", + screen); + return NULL; +} + +static void +monitorreset(Display* dpy, CARD16 standby, CARD16 suspend, CARD16 off) +{ + DPMSSetTimeouts(dpy, standby, suspend, off); + DPMSForceLevel(dpy, DPMSModeOn); + XFlush(dpy); +} + +static void +usage(void) +{ + die("usage: slock [-v] [cmd [arg ...]]\n"); +} + +int +main(int argc, char **argv) { + struct xrandr rr; + struct lock **locks; + struct passwd *pwd; + struct group *grp; + uid_t duid; + gid_t dgid; + const char *hash; + Display *dpy; + int s, nlocks, nscreens; + CARD16 standby, suspend, off; + + ARGBEGIN { + case 'v': + fprintf(stderr, "slock-"VERSION"\n"); + return 0; + default: + usage(); + } ARGEND + + /* validate drop-user and -group */ + errno = 0; + if (!(pwd = getpwnam(user))) + die("slock: getpwnam %s: %s\n", user, + errno ? strerror(errno) : "user entry not found"); + duid = pwd->pw_uid; + errno = 0; + if (!(grp = getgrnam(group))) + die("slock: getgrnam %s: %s\n", group, + errno ? strerror(errno) : "group entry not found"); + dgid = grp->gr_gid; + +#ifdef __linux__ + dontkillme(); +#endif + + hash = gethash(); + errno = 0; + if (!crypt("", hash)) + die("slock: crypt: %s\n", strerror(errno)); + + if (!(dpy = XOpenDisplay(NULL))) + die("slock: cannot open display\n"); + + /* drop privileges */ + if (setgroups(0, NULL) < 0) + die("slock: setgroups: %s\n", strerror(errno)); + if (setgid(dgid) < 0) + die("slock: setgid: %s\n", strerror(errno)); + if (setuid(duid) < 0) + die("slock: setuid: %s\n", strerror(errno)); + + /* check for Xrandr support */ + rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); + + /* get number of screens in display "dpy" and blank them */ + nscreens = ScreenCount(dpy); + if (!(locks = calloc(nscreens, sizeof(struct lock *)))) + die("slock: out of memory\n"); + for (nlocks = 0, s = 0; s < nscreens; s++) { + if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) + nlocks++; + else + break; + } + XSync(dpy, 0); + + /* did we manage to lock everything? */ + if (nlocks != nscreens) + return 1; + + /* DPMS-magic to disable the monitor */ + if (!DPMSCapable(dpy)) + die("slock: DPMSCapable failed\n"); + if (!DPMSEnable(dpy)) + die("slock: DPMSEnable failed\n"); + if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off)) + die("slock: DPMSGetTimeouts failed\n"); + if (!standby || !suspend || !off) + /* set values if there arent some */ + standby = suspend = off = 300; + + DPMSSetTimeouts(dpy, monitortime, monitortime, monitortime); + XFlush(dpy); + + /* run post-lock command */ + if (argc > 0) { + switch (fork()) { + case -1: + die("slock: fork failed: %s\n", strerror(errno)); + case 0: + monitorreset(dpy, standby, suspend, off); + + if (close(ConnectionNumber(dpy)) < 0) + die("slock: close: %s\n", strerror(errno)); + execvp(argv[0], argv); + fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno)); + _exit(1); + } + } + + /* everything is now blank. Wait for the correct password */ + readpw(dpy, &rr, locks, nscreens, hash); + + /* reset DPMS values to inital ones */ + monitorreset(dpy, standby, suspend, off); + + return 0; +} diff --git a/pre/slock-1.4/slock.o b/pre/slock-1.4/slock.o new file mode 100644 index 0000000000000000000000000000000000000000..c43ffa5d4d171b35573b2ec76a977444f923b09d GIT binary patch literal 12560 zcmb`Ne{fvIeZW`0Y}p8%{DUG4g>(E&tbh-l46$r1qLc3IclOCvY&pmnbDZv;tV1W= z&AWG&MED^_IyaBwh^IJA(lRa6aXPdiDNSj?K#fdnE3~ws?$D4)8oM)0L8B08QygQ5 zT)*G_ar)|6Z<;^4o_o9d+3$Y$yWicnyKm)3Ly@hO6%|Z{3U(Kp%PGp(+qcf8+j+8` zEn^K#f9x0ULRPmeZJloSXwAAE(OM&RP-~AsN}rsvHhP+ZTDPYuqTTOl>d`Wurf0Nq zsN-omrXAt&^V+jKeo=dY$FFHq5GV9P_1bli&_P?He@ZV-YUg?Ol5YP8!dkr;)VzA3 z4JbQ-W=~gZwHO7p>Sl;hsG)QXq}c0NERun{178X34cqSodiMH1+@srR`Nd?7-)*SLrMeN`5(un=O zD6miJprctY9vNq)l0I>%ZA8=CiY3N!SLtA2^VN`?U8b*p0b*!>$w-YD9a-yHQR^zt z;a9QWWi|JE4*#V9V8%!KW0y)$-*fnBWNnqD+6K?$3UK7eTD=Whu)6iO>rrBoPlC2u zOy@U(#LOyq=xxh*mGhu%q*iaMg52zKy=^(C{{U2PTfx&OAUy+>*_p{(8*!xc;`16N zq#p_vjI;ew*q)w-!ZOZJ<(dM8FDYm7f#&{~b3(UI`lm$c?6ta3G7SSEP<{%>B9y;i z)t^XUn`$&)!B^k}KA=r77zPM!nZu&K|HHuR;21V@6dqmn`QsqNUcm=w(&H27F?I6% zV!dkO156e&axTv96BY9xTKC!?l>X_=WHs;fY#{$8%)E8hCfOs;iKBdK=mmD6y1O#B zT8~39p&zV`C*^d?H~W@*u-ZQq3cS4U;j8TFOpR2C-^bi=-1DJB9D| z{sVz~0|x^41)@KI##uI%jt_43#?7&ewb{EiyOia!hUqniEpyB}oVL9E>D+LF9W>Lq z%oUVZUhntajE`2 z8-g}PyV4Ti2TjUHRE_?0#uzS(uT3bP8;|1W8fE=+=43{o);t^Iv0-$LX;@~`IAnM;v21oE zZ6<_+mag?2fMrWbjC7#)cRw|lrg6Wi$Y>(7bw|gSUt%h1I*5P9mUYnpk(t$4aavLF-DE} zp-g$mZ_AkJ_-$Du)qh($JrvEx)20!PB_3dXsaSlFt!Zw)`6=sx@z(V@&4Vs%$b`^;mDVRbF?Q@~6& zw2ewo*=$iR0isN|Pdj&y&letsn%u~Isk~y?Z|KE4aFvisXFGz0fd-kG4q=Jfm|zFG z^>@;m zw0$A9Ye6kYgY&MD#md)bX7+(!l?Pwb3+-@R6JCYM&XQ8%ukIisNhdPK~SB-+=Rxs&_|*f zH=!O7(u+M>k6yI2ZrH`7RqW#I zFCN$7^bW^>m9^pcq6i$V2O{>T^J-!)2)l3fl&UZp2_FYMzFs-z)y6?BanZ91zyH(_|JlZlBI!-qIv+{yopoZ zP`;FVC{P#i3PP{5v^*$r<& zVB&Jc$lAa}sbb_NUin0d;jjqDD!t?nkbfXpjmrPi` z%Ki&w*Kn`Gac(6X_%u%*v*j}RvctkQ`PIv~e5sd5tTD*rg6r_1G>Q{%0AI6SVG*gm z1;qMc6ndG}fbjscYB3&Vxoi4i@JDa0z-T~3y|-2z#~0%je4N0?T+_-1sO)8)Ctrs` z(b~ktlC=b0+f_5)0k*)ZG#l}}1Xg-pLM!cao|npo5_gmvDtuLbEWpCDY5{F>O@@!q zaAAukOqdfB0~0RPsSyj?V$D~3Cixu3Gkqfr?n-oB1PtJ(>kpt4%*|jBQXf%egK;`M zq2bmKNANoS;a=WQA3KF-1ji8^8*mTXIy*Oe*KOOmx5?Y;Yw`KLEzSN`zrSUpsIpSl ztaxxYs~BylxV~<2?Gb1L`3eoF{6R2-Kyr{Fjbz<@M`t#LQKdY*51r(@X2O=N}RXXZn8TuMjABP`?Amp98I#5># zbp=q@w)(d#t2(Re->n2&Dm&{xfM!3g4Ax(Sc)ThKrTtJAg0g!d4nTe%#9ffzC1tx% zgXUrlH{*&2_PLt<7k(yQ5vurtd&|i5~82DN@Dom6;!|hAhgL zJU=u-wgT2m6)>+t72%3uT*a=U*>bvy)s@pK@j0Hj(*Dm& z&KEo-46(QttKsvDVCI+dgA_vgi;^#Q@H-_p9lTv~(f(XvNb<+$5KnEFyv{L{yClc0 ziH07YsbR+`g!Da6rIT!wk z3y;CPTu4tf_;(@hap5anc#{jqJIRIg>n?n!3&;7lkRHQ@r(C${!XI|w1sDFT3;(VQ zf7ONm(1rg5_;Rui^ZgFS_UFKtvHvcql~~2^x#;=OgB7fdINsndf#!cV*Kw_W%-7yb(ue#wPb zxU3tCUHA$YexnQbx$wJOc*uosci~sN^lP7s{QWLm+=u$&ERi&rX~Ytl5oRTaSUjCd zyj?@nXX3LS#GdhEIZ#l~nRm5e8?Xy1c|nHEBk zbb2tC*#lSA!v|5sG>6ksxb=@&$@DPe7yr2 z4+UdZOv!X7M}cPvCM9C2Ka0D?mb4zh+E;|OwK}| zk_^__AurP5FD)s{NUD^ru5)CiUIju@KgNX z2>%k{vxK)3zD0hQqMiWZI|--qCgB}K9xsqFpq@_nDSLbfAz=6L8&2^tgb;HP*V zAq3>q&qYp!e(L9MNsjWkuPZ&``$Ndn`S7R(CtY9deVxrNA6{VjxFL-cGS9NSRs z?j!v72=62OTEYhBu5+ZPDIJSMfi1upCx+e z{88V(*zOJ@ufBg#|0=>iA^NF*E))IK&KeYgfYJ5vQ+BSB9NVSxtBE|`>nZtW!hfIe zHo|Wtdv<~e!{7qjV^k&6CNdc`U$_E@FAjq9pR4<`557O zB9DDgc7B`4_YwX)k^chWpAz{v;gyRa0|9j>;HUJjAlxAQ3xw16%P%?l{}v*@lgQI{ z_YvMt5fp89jCycolAr2bq%IQ6HG@J`Y$BzeGX6{pPFDv_7s z@HY{`Z;>3&ei#(rAi0-Q@jjycD&U@l0U7>Y#0-Q<5plLerg`McjtyC{KIVguWf2dk zlxd`5J`29lnJDPkgS&#V5RjN@J(X{V#6tedtQHcj@=p`!KWszUul$F5D(ZBY$;Rai zq2xe>2lbw)Jf0C2YX3Q0JR#^J;@`s9wzK^~VAy`MlvB|+WkWbWXi)uEu?2-HP38W^ zX{ao8%G$C%eYa8cWm#W+N6G4C`&E7t5)1YJ;|2O(2eQuoqdm^HQTG&nY(e-~E+QUC o!c!tDKb`ge7wkB3rvLx| literal 0 HcmV?d00001 diff --git a/pre/slock-1.4/util.h b/pre/slock-1.4/util.h new file mode 100644 index 0000000..6f748b8 --- /dev/null +++ b/pre/slock-1.4/util.h @@ -0,0 +1,2 @@ +#undef explicit_bzero +void explicit_bzero(void *, size_t); diff --git a/slock-1.2-background-image.diff b/slock-1.2-background-image.diff new file mode 100644 index 0000000..df7549a --- /dev/null +++ b/slock-1.2-background-image.diff @@ -0,0 +1,108 @@ +diff --git config.mk config.mk +index 8cc3f68..0b2b096 100644 +--- a/config.mk ++++ b/config.mk +@@ -11,7 +11,7 @@ X11LIB = /usr/X11R6/lib + + # includes and libs + INCS = -I. -I/usr/include -I${X11INC} +-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext ++LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lImlib2 + + # flags + CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_SHADOW_H -DCOLOR1=\"black\" -DCOLOR2=\"\#005577\" +diff --git slock.c slock.c +index d281965..e1f40a2 100644 +--- a/slock.c ++++ b/slock.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + + #if HAVE_BSD_AUTH + #include +@@ -27,6 +28,7 @@ typedef struct { + int screen; + Window root, win; + Pixmap pmap; ++ Pixmap bgmap; + unsigned long colors[2]; + } Lock; + +@@ -34,6 +36,8 @@ static Lock **locks; + static int nscreens; + static Bool running = True; + ++Imlib_Image image; ++ + static void + die(const char *errstr, ...) { + va_list ap; +@@ -160,7 +164,10 @@ readpw(Display *dpy, const char *pws) + } + } else if(llen != 0 && len == 0) { + for(screen = 0; screen < nscreens; screen++) { +- XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); ++ if(locks[screen]->bgmap) ++ XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); ++ else ++ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); + XClearWindow(dpy, locks[screen]->win); + } + } +@@ -204,12 +211,27 @@ lockscreen(Display *dpy, int screen) { + + lock->root = RootWindow(dpy, lock->screen); + ++ if(image) { ++ lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen)); ++ imlib_context_set_image(image); ++ imlib_context_set_display(dpy); ++ imlib_context_set_visual(DefaultVisual(dpy, lock->screen)); ++ imlib_context_set_colormap(DefaultColormap(dpy, lock->screen)); ++ imlib_context_set_drawable(lock->bgmap); ++ imlib_render_image_on_drawable(0, 0); ++ imlib_free_image(); ++ } ++ + /* init */ + wa.override_redirect = 1; + wa.background_pixel = BlackPixel(dpy, lock->screen); + lock->win = XCreateWindow(dpy, lock->root, 0, 0, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), + 0, DefaultDepth(dpy, lock->screen), CopyFromParent, + DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa); ++ ++ if(lock->bgmap) ++ XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); ++ + XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR2, &color, &dummy); + lock->colors[1] = color.pixel; + XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR1, &color, &dummy); +@@ -246,7 +268,7 @@ lockscreen(Display *dpy, int screen) { + + static void + usage(void) { +- fprintf(stderr, "usage: slock [-v]\n"); ++ fprintf(stderr, "\nusage: slock [options]\noptions:\n\t-v\tPrint version and exit.\n\t-i\t\n"); + exit(EXIT_FAILURE); + } + +@@ -258,8 +280,15 @@ main(int argc, char **argv) { + Display *dpy; + int screen; + +- if((argc == 2) && !strcmp("-v", argv[1])) ++ if((argc == 2) && !strcmp("-v", argv[1])) { + die("slock-%s, © 2006-2012 Anselm R Garbe\n", VERSION); ++ } ++ if((argc == 3) && !strcmp("-i", argv[1])) { ++ image = imlib_load_image(argv[2]); ++ if(!image) { ++ die("slock: unable to load image.\n"); ++ } ++ } + else if(argc != 1) + usage(); + diff --git a/slock-message-20180626-35633d4.diff b/slock-message-20180626-35633d4.diff new file mode 100644 index 0000000..21f006a --- /dev/null +++ b/slock-message-20180626-35633d4.diff @@ -0,0 +1,171 @@ +From 8384a863057f024868bd8455a82013f716197ab0 Mon Sep 17 00:00:00 2001 +From: Blair Drummond +Date: Tue, 26 Jun 2018 15:09:13 -0400 +Subject: [PATCH] Adds [-m message] option to leave a message on the lockscreen + +--- + config.def.h | 9 ++++++ + slock.1 | 4 +++ + slock.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 87 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 9855e21..7eb7a0d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = { + + /* treat a cleared input like a wrong password (color) */ + static const int failonclear = 1; ++ ++/* default message */ ++static const char * message = "Suckless: Software that sucks less."; ++ ++/* text color */ ++static const char * text_color = "#ffffff"; ++ ++/* text size (must be a valid size) */ ++static const char * text_size = "6x10"; +diff --git a/slock.1 b/slock.1 +index 82cdcd6..541a264 100644 +--- a/slock.1 ++++ b/slock.1 +@@ -6,6 +6,7 @@ + .Sh SYNOPSIS + .Nm + .Op Fl v ++.Op Fl m Ar message + .Op Ar cmd Op Ar arg ... + .Sh DESCRIPTION + .Nm +@@ -16,6 +17,9 @@ is executed after the screen has been locked. + .Bl -tag -width Ds + .It Fl v + Print version information to stdout and exit. ++.It Fl m Ar message ++Overrides default slock lock message. ++.TP + .El + .Sh SECURITY CONSIDERATIONS + To make sure a locked screen can not be bypassed by switching VTs +diff --git a/slock.c b/slock.c +index 5ae738c..6a9a03f 100644 +--- a/slock.c ++++ b/slock.c +@@ -61,6 +61,71 @@ die(const char *errstr, ...) + #include + #include + ++static void ++writemessage(Display *dpy, Window win, int screen) ++{ ++ int len, line_len, width, height, i, j, k, tab_replace, tab_size; ++ XGCValues gr_values; ++ XFontStruct *fontinfo; ++ XColor color, dummy; ++ GC gc; ++ fontinfo = XLoadQueryFont(dpy, text_size); ++ tab_size = 8 * XTextWidth(fontinfo, " ", 1); ++ ++ XAllocNamedColor(dpy, DefaultColormap(dpy, screen), ++ text_color, &color, &dummy); ++ ++ gr_values.font = fontinfo->fid; ++ gr_values.foreground = color.pixel; ++ gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); ++ ++ ++ /* ++ * Start formatting and drawing text ++ */ ++ ++ len = strlen(message); ++ ++ /* Max max line length (cut at '\n') */ ++ line_len = 0; ++ k = 0; ++ for (i = j = 0; i < len; i++) { ++ if (message[i] == '\n') { ++ if (i - j > line_len) ++ line_len = i - j; ++ k++; ++ i++; ++ j = i; ++ } ++ } ++ /* If there is only one line */ ++ if (line_len == 0) ++ line_len = len; ++ ++ height = DisplayHeight(dpy, screen)*3/7 - (k*20)/3; ++ width = (DisplayWidth(dpy, screen) - XTextWidth(fontinfo, message, line_len))/2; ++ ++ /* Look for '\n' and print the text between them. */ ++ for (i = j = k = 0; i <= len; i++) { ++ /* i == len is the special case for the last line */ ++ if (i == len || message[i] == '\n') { ++ tab_replace = 0; ++ while (message[j] == '\t' && j < i) { ++ tab_replace++; ++ j++; ++ } ++ ++ XDrawString(dpy, win, gc, width + tab_size*tab_replace, height + 20*k, message + j, i - j); ++ while (i < len && message[i] == '\n') { ++ i++; ++ j = i; ++ k++; ++ } ++ } ++ } ++} ++ ++ + static void + dontkillme(void) + { +@@ -194,6 +259,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + locks[screen]->win, + locks[screen]->colors[color]); + XClearWindow(dpy, locks[screen]->win); ++ writemessage(dpy, locks[screen]->win, screen); + } + oldc = color; + } +@@ -300,7 +366,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) + static void + usage(void) + { +- die("usage: slock [-v] [cmd [arg ...]]\n"); ++ die("usage: slock [-v] [-m message] [cmd [arg ...]]\n"); + } + + int +@@ -319,6 +385,9 @@ main(int argc, char **argv) { + case 'v': + fprintf(stderr, "slock-"VERSION"\n"); + return 0; ++ case 'm': ++ message = EARGF(usage()); ++ break; + default: + usage(); + } ARGEND +@@ -363,10 +432,12 @@ main(int argc, char **argv) { + if (!(locks = calloc(nscreens, sizeof(struct lock *)))) + die("slock: out of memory\n"); + for (nlocks = 0, s = 0; s < nscreens; s++) { +- if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) ++ if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) { ++ writemessage(dpy, locks[s]->win, s); + nlocks++; +- else ++ } else { + break; ++ } + } + XSync(dpy, 0); + +-- +2.17.1 +