platform: strchrnul is missing if __APPLE__
[platform/upstream/busybox.git] / applets / busybox.mksuid
1 #!/bin/sh
2 # Make list of configuration variables regarding suid handling
3
4 # input $1: full path to autoconf.h
5 # input $2: full path to applets.h
6 # input $3: full path to .config
7 # output (stdout): list of CONFIG_ that do or may require suid
8
9 # If the environment variable SUID is not set or set to DROP,
10 # lists all config options that do not require suid permissions.
11 # Otherwise, lists all config options for applets that DO or MAY require
12 # suid permissions.
13
14 # Maintainer: Bernhard Reutner-Fischer
15
16 export LC_ALL=POSIX
17 export LC_CTYPE=POSIX
18
19 CONFIG_H=${1:-include/autoconf.h}
20 APPLETS_H=${2:-include/applets.h}
21 DOT_CONFIG=${3:-.config}
22
23 case ${SUID:-DROP} in
24 [dD][rR][oO][pP]) USE="DROP" ;;
25 *) USE="suid" ;;
26 esac
27
28 $HOSTCC -E -DMAKE_SUID -include $CONFIG_H $APPLETS_H |
29   awk -v USE=${USE} '
30     /^SUID[ \t]/{
31       if (USE == "DROP") {
32         if ($2 != "BB_SUID_DROP") next
33       } else {
34         if ($2 == "BB_SUID_DROP") next
35       }
36       cfg = $NF
37       gsub("\"", "", cfg)
38       cfg = substr(cfg, 8)
39       s[i++] = "CONFIG_" cfg
40       s[i++] = "CONFIG_FEATURE_" cfg "_.*"
41     }
42     END{
43       while (getline < ARGV[2]) {
44         for (j in s) {
45           if ($0 ~ "^" s[j] "=y$") {
46             sub(/=.*/, "")
47             print
48             if (s[j] !~ /\*$/) delete s[j] # can drop this applet now
49           }
50         }
51       }
52     }
53 ' - $DOT_CONFIG
54