master chld/dot / bin / 0x0
 1#!/bin/sh -e
 2
 3storefile="${XDG_CACHE_HOME:-"$HOME/.cache"}/0x0"
 4host="https://f.9larp.net/"
 5cr="$(printf '\r')"
 6
 7usage() {
 8	cat >&2 <<-EOF
 9	usage: 0x0 [-s] [-e expire] file|url
10	       0x0 [-d|-e expire|-t token] url
11	       0x0 -h url
12	       0x0
13	EOF
14	exit "${1:-0}"
15}
16
17while getopts de:t:hs arg; do case $arg in
18	d) delete=1 ;;
19	e) expire="$OPTARG" ;;
20	t) token="$OPTARG" ;;
21	h) shorten=1 ;;
22	s) secret=1 ;;
23	?) usage 1 ;;
24	*) usage ;;
25esac; done
26shift "$((OPTIND-1))"
27
28[ "$#" = "1" ] || { cat "$storefile"; exit 0; }
29
30case "$1" in
31	"$host"*)
32		if [ "$shorten" ]; then
33			shorten="$1"
34		elif [ "$delete" ] || [ "$expire" ]; then
35			host="$1"
36		else
37			url="$1"
38		fi
39	;;
40	http[s]://*) url="$1" ;;
41	*) file="$1" ;;
42esac
43
44# To read the 0x0 output and the debug output 
45# together requires hacks such as line prefixes to
46# indicate which line is debug and output.
47# Temporary files are unfortunately used for this cause.
48dbg="$(mktemp)"
49trap 'rm -f -- "$dbg"' INT TERM HUP EXIT
50
51resp="$(
52	curl "$host" -f# -D"$dbg" \
53		${file:+-F"file=@$file"} \
54		${url:+-F"url=$url"} \
55		${shorten:+-Fshorten="$shorten"} \
56		${secret:+-Fsecret=""} \
57		${delete:+-Fdelete=""} \
58		${token:+-Ftoken="$token"} \
59		${expire:+-Fexpires="$expire"}
60)"
61
62while IFS=': ' read -r k v; do case "$k" in
63	"X-Token"|"x-token")     resp_token="${v%%"$cr"}" ;;
64	"X-Expires"|"x-expires") resp_expires="${v%%"$cr"}" ;;
65esac; done < "$dbg"
66
67[ "$resp_token" ] &&
68	echo "$resp_expires $resp_token $file $resp" >> "$storefile"
69[ "$delete" ] && exit 0
70
71echo "$resp" 2>&1
72