Add sandman

master
Curtis McEnroe 2018-11-30 15:41:21 -05:00
parent 908b834c1a
commit deec27410a
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
4 changed files with 119 additions and 8 deletions

View File

@ -1,2 +1,4 @@
LIBRESSL_PREFIX = /usr/local/opt/libressl LIBRESSL_PREFIX = /usr/local/opt/libressl
LDLIBS = -lcurses -ltls LDLIBS = -lcurses -ltls -framework Cocoa
BINS += sandman
MANS += sandman.1

View File

@ -9,6 +9,9 @@ CFLAGS += -I$(LIBRESSL_PREFIX)/include
LDFLAGS += -L$(LIBRESSL_PREFIX)/lib LDFLAGS += -L$(LIBRESSL_PREFIX)/lib
LDLIBS = -lcursesw -ltls LDLIBS = -lcursesw -ltls
BINS = catgirl
MANS = catgirl.1
-include config.mk -include config.mk
OBJS += chat.o OBJS += chat.o
@ -29,7 +32,7 @@ OBJS += url.o
TESTS += format.t TESTS += format.t
TESTS += term.t TESTS += term.t
all: tags catgirl test all: tags $(BINS) test
$(OBJS): chat.h $(OBJS): chat.h
@ -47,14 +50,14 @@ test: $(TESTS)
tags: *.h *.c tags: *.h *.c
ctags -w *.h *.c ctags -w *.h *.c
install: catgirl catgirl.1 install: $(BINS) $(MANS)
install -d $(PREFIX)/bin $(MANDIR)1 install -d $(PREFIX)/bin $(MANDIR)1
install catgirl $(PREFIX)/bin/catgirl install $(BINS) $(PREFIX)/bin
install -m 644 catgirl.1 $(MANDIR)1/catgirl.1 install -m 644 $(MANS) $(MANDIR)1
uninstall: uninstall:
rm -f $(PREFIX)/bin/catgirl rm -f $(BINS:%=$(PREFIX)/bin/%)
rm -f $(MANDIR)1/catgirl.1 rm -f $(MAN:%=%(MANDIR)1/%)
chroot.tar: catgirl catgirl.1 man.sh chroot.tar: catgirl catgirl.1 man.sh
install -d -o root -g wheel \ install -d -o root -g wheel \
@ -92,7 +95,7 @@ install-chroot: chroot.tar
tar -xf chroot.tar -C /home/$(CHROOT_USER) tar -xf chroot.tar -C /home/$(CHROOT_USER)
clean: clean:
rm -fr $(OBJS) catgirl $(TESTS) tags root chroot.tar rm -fr $(OBJS) $(BINS) $(TESTS) tags root chroot.tar
README: catgirl.7 README: catgirl.7
mandoc catgirl.7 | col -bx > README mandoc catgirl.7 | col -bx > README

34
sandman.1 100644
View File

@ -0,0 +1,34 @@
.Dd November 30, 2018
.Dt SANDMAN 1
.Os "Causal Agency"
.
.Sh NAME
.Nm sandman
.Nd signal sleep
.
.Sh SYNOPSIS
.Nm
.Ar command ...
.
.Sh DESCRIPTION
.Nm
is a utility for Darwin systems.
.Nm
runs the
.Ar command
in a child process
and sends it
.Dv SIGTSTP
and
.Dv SIGCONT
signals
when the computer goes to sleep
and wakes from sleep,
respectively.
.
.Sh EXIT STATUS
.Nm
exits with the exit status of the child process.
.
.Sh SEE ALSO
.Xr signal 3

72
sandman.m 100644
View File

@ -0,0 +1,72 @@
/* Copyright (C) 2018 Curtis McEnroe <june@causal.agency>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#import <err.h>
#import <signal.h>
#import <stdlib.h>
#import <sysexits.h>
#import <unistd.h>
void sigchld(int sig) {
(void)sig;
int status;
pid_t pid = wait(&status);
if (pid < 0) err(EX_OSERR, "wait");
if (WIFSIGNALED(status)) {
_exit(128 + WTERMSIG(status));
} else {
_exit(WEXITSTATUS(status));
}
}
int main(int argc, char *argv[]) {
if (argc < 2) return EX_USAGE;
signal(SIGCHLD, sigchld);
pid_t pid = fork();
if (pid < 0) err(EX_OSERR, "fork");
if (!pid) {
execvp(argv[1], &argv[1]);
err(EX_NOINPUT, "%s", argv[1]);
}
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSNotificationCenter *center = [workspace notificationCenter];
NSOperationQueue *main = [NSOperationQueue mainQueue];
[center addObserverForName:NSWorkspaceWillSleepNotification
object:nil
queue:main
usingBlock:^(NSNotification *note) {
(void)note;
int error = kill(pid, SIGTSTP);
if (error) err(EX_UNAVAILABLE, "kill %d", pid);
}];
[center addObserverForName:NSWorkspaceDidWakeNotification
object:nil
queue:main
usingBlock:^(NSNotification *note) {
(void)note;
int error = kill(pid, SIGCONT);
if (error) err(EX_UNAVAILABLE, "kill %d", pid);
}];
[[NSApplication sharedApplication] run];
}