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