1455ce1c7SJeremy Kerr#!/bin/bash
2455ce1c7SJeremy Kerr
3455ce1c7SJeremy Kerrefivarfs_mount=/sys/firmware/efi/efivars
4455ce1c7SJeremy Kerrtest_guid=210be57c-9849-4fc7-a635-e6382d1aec27
5455ce1c7SJeremy Kerr
6455ce1c7SJeremy Kerrcheck_prereqs()
7455ce1c7SJeremy Kerr{
8455ce1c7SJeremy Kerr	local msg="skip all tests:"
9455ce1c7SJeremy Kerr
10455ce1c7SJeremy Kerr	if [ $UID != 0 ]; then
11455ce1c7SJeremy Kerr		echo $msg must be run as root >&2
12455ce1c7SJeremy Kerr		exit 0
13455ce1c7SJeremy Kerr	fi
14455ce1c7SJeremy Kerr
15455ce1c7SJeremy Kerr	if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then
16455ce1c7SJeremy Kerr		echo $msg efivarfs is not mounted on $efivarfs_mount >&2
17455ce1c7SJeremy Kerr		exit 0
18455ce1c7SJeremy Kerr	fi
19455ce1c7SJeremy Kerr}
20455ce1c7SJeremy Kerr
21455ce1c7SJeremy Kerrrun_test()
22455ce1c7SJeremy Kerr{
23455ce1c7SJeremy Kerr	local test="$1"
24455ce1c7SJeremy Kerr
25455ce1c7SJeremy Kerr	echo "--------------------"
26455ce1c7SJeremy Kerr	echo "running $test"
27455ce1c7SJeremy Kerr	echo "--------------------"
28455ce1c7SJeremy Kerr
29455ce1c7SJeremy Kerr	if [ "$(type -t $test)" = 'function' ]; then
30455ce1c7SJeremy Kerr		( $test )
31455ce1c7SJeremy Kerr	else
32455ce1c7SJeremy Kerr		( ./$test )
33455ce1c7SJeremy Kerr	fi
34455ce1c7SJeremy Kerr
35455ce1c7SJeremy Kerr	if [ $? -ne 0 ]; then
36455ce1c7SJeremy Kerr		echo "  [FAIL]"
37455ce1c7SJeremy Kerr		rc=1
38455ce1c7SJeremy Kerr	else
39455ce1c7SJeremy Kerr		echo "  [PASS]"
40455ce1c7SJeremy Kerr	fi
41455ce1c7SJeremy Kerr}
42455ce1c7SJeremy Kerr
43455ce1c7SJeremy Kerrtest_create()
44455ce1c7SJeremy Kerr{
45455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
46455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
47455ce1c7SJeremy Kerr
48455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
49455ce1c7SJeremy Kerr
50455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
51455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
52455ce1c7SJeremy Kerr		exit 1
53455ce1c7SJeremy Kerr	fi
54455ce1c7SJeremy Kerr
55455ce1c7SJeremy Kerr	if [ $(stat -c %s $file) -ne 5 ]; then
56455ce1c7SJeremy Kerr		echo "$file has invalid size" >&2
57455ce1c7SJeremy Kerr		exit 1
58455ce1c7SJeremy Kerr	fi
59455ce1c7SJeremy Kerr}
60455ce1c7SJeremy Kerr
61455ce1c7SJeremy Kerrtest_delete()
62455ce1c7SJeremy Kerr{
63455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
64455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
65455ce1c7SJeremy Kerr
66455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
67455ce1c7SJeremy Kerr
68455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
69455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
70455ce1c7SJeremy Kerr		exit 1
71455ce1c7SJeremy Kerr	fi
72455ce1c7SJeremy Kerr
73455ce1c7SJeremy Kerr	rm $file
74455ce1c7SJeremy Kerr
75455ce1c7SJeremy Kerr	if [ -e $file ]; then
76455ce1c7SJeremy Kerr		echo "$file couldn't be deleted" >&2
77455ce1c7SJeremy Kerr		exit 1
78455ce1c7SJeremy Kerr	fi
79455ce1c7SJeremy Kerr
80455ce1c7SJeremy Kerr}
81455ce1c7SJeremy Kerr
82455ce1c7SJeremy Kerr# test that we can remove a variable by issuing a write with only
83455ce1c7SJeremy Kerr# attributes specified
84455ce1c7SJeremy Kerrtest_zero_size_delete()
85455ce1c7SJeremy Kerr{
86455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
87455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
88455ce1c7SJeremy Kerr
89455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
90455ce1c7SJeremy Kerr
91455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
92455ce1c7SJeremy Kerr		echo "$file does not exist" >&2
93455ce1c7SJeremy Kerr		exit 1
94455ce1c7SJeremy Kerr	fi
95455ce1c7SJeremy Kerr
96455ce1c7SJeremy Kerr	printf "$attrs" > $file
97455ce1c7SJeremy Kerr
98455ce1c7SJeremy Kerr	if [ -e $file ]; then
99455ce1c7SJeremy Kerr		echo "$file should have been deleted" >&2
100455ce1c7SJeremy Kerr		exit 1
101455ce1c7SJeremy Kerr	fi
102455ce1c7SJeremy Kerr}
103455ce1c7SJeremy Kerr
104455ce1c7SJeremy Kerrtest_open_unlink()
105455ce1c7SJeremy Kerr{
106455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
107455ce1c7SJeremy Kerr	./open-unlink $file
108455ce1c7SJeremy Kerr}
109455ce1c7SJeremy Kerr
110455ce1c7SJeremy Kerrcheck_prereqs
111455ce1c7SJeremy Kerr
112455ce1c7SJeremy Kerrrc=0
113455ce1c7SJeremy Kerr
114455ce1c7SJeremy Kerrrun_test test_create
115455ce1c7SJeremy Kerrrun_test test_delete
116455ce1c7SJeremy Kerrrun_test test_zero_size_delete
117455ce1c7SJeremy Kerrrun_test test_open_unlink
118455ce1c7SJeremy Kerr
119455ce1c7SJeremy Kerrexit $rc
120