Add mount.cifs as a wrapper for mount.cifs.
[ira/wip.git] / examples / scripts / mount / mount.smbfs
1 #!/bin/bash
2 # Debian mount.smbfs compatibility wrapper
3 # Copyright 2007, Steve Langasek <vorlon at debian.org>
4 # Licensed under the GNU General Public License, version 2.  See the
5 # file /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
6
7 # This script accepts all documented mount options for mount.smbfs,
8 # passing through those that are also recognized by mount.cifs,
9 # converting those that are not recognized but map to available cifs
10 # options, and warning about the use of options for which no equivalent
11 # exists.
12
13 # known bugs: quoted spaces in arguments are not passed intact
14
15 set -e
16
17 # reverse the order of username and password in a "username" parameter,
18 # taking care to leave any "%password" bit intact
19
20 reverse_username_workgroup() {
21         local workgroup password username
22
23         username="$1"
24         case "$username" in
25         *%*)    password="${username#*%}"
26                 username="${username%%%*}"
27                 ;;
28         *) ;;
29         esac
30         case "$username" in
31         */*)    workgroup="${username#*/}"
32                 username="${username%%/*}"
33                 ;;
34         *) ;;
35         esac
36         if [ -n "$workgroup" ]; then
37                 username="$workgroup\\$username"
38         fi
39         if [ -n "$password" ]; then
40                 username="$username%$password"
41         fi
42         echo "$username"
43 }
44
45
46 # parse out the mount options that have been specified using -o, and if
47 # necessary, convert them for use by mount.cifs
48
49 parse_mount_options () {
50         local OLD_IFS IFS options option username
51         OLD_IFS="$IFS"
52         IFS=","
53         options=""
54         workgroup=""
55         password=""
56
57         for option in $@; do
58                 case "$option" in
59                 sockopt=* | scope=* | codepage=* | ttl=* | debug=*)
60                         echo "Warning: ignoring deprecated smbfs option '$option'" >&2
61                         ;;
62
63                 krb)
64                         options="$options${options:+,}sec=krb5"
65                         ;;
66
67                 guest)
68                         echo "Warning: mapping 'guest' to 'guest,sec=none'" >&2
69                         options="$options${options:+,}guest,sec=none"
70                         ;;
71
72                 # username and workgroup are reversed in username= arguments,
73                 # so need to be parsed out
74                 username=*/*)
75                         IFS="$OLD_IFS"
76                         username="${option#username=}"
77                         username="$(reverse_username_workgroup "$username")"
78                         IFS=","
79                         options="$options${options:+,}username=$username"
80                         ;;
81
82                 *)
83                         options="$options${options:+,}$option"
84                         ;;
85                 esac
86         done
87         IFS="$OLD_IFS"
88         echo $options
89 }
90
91 args=()
92 while [ "$#" -gt 0 ]; do
93         case "$1" in
94         -o*)
95                 arg=${1#-o}
96                 shift
97                 if [ -z "$arg" ]; then
98                         arg=$1
99                         shift
100                 fi
101                 arg="$(parse_mount_options "$arg")"
102                 if [ -n "$arg" ]; then
103                         args=("${args[@]}" "-o" "$arg")
104                 fi
105                 ;;
106         *)
107                 args=("${args[@]}" "$1")
108                 shift
109                 ;;
110         esac
111 done
112
113 USER="$(reverse_username_workgroup "$USER")"
114
115 exec /sbin/mount.cifs "${args[@]}"