On Thu, Jun 15, 2017 at 12:09:20AM +0200, Klemens Nanni wrote:
> Instead of ignoring SSIDs containing whitespaces, slightly adjust the
> commands to take everything in between 'nwid ' and ' chan' as SSID; if
> it has double quotes at start *and* end, simply remove those.
> 
> This enables users to select networks such as "Unitymedia WifiSpot"
> "FRITZ!Box 7490" for example which are common among the quoted ones at
> least here in germany.
> 
> The only SSIDs known to break this are those containing ' chan ' as this
> substring is used as delimiter. Picking "some chan 4 me" would therefore
> result in _nwid being assigned '"some' (literal double quote), but than
> reasonably acceptable (compared to the current behaviour).
> 
> 
> Since cat's -n flag already takes care of the space between numbers and
> input lines, remove the leading tab to avoid excessive widths for lines
> with long SSIDs.
> 
> Feedback/OK?

I agree, that supporting SSIDs containing whitespaces would be an improvement.

> 
> Index: install.sub
> ===================================================================
> RCS file: /cvs/src/distrib/miniroot/install.sub,v
> retrieving revision 1.1014
> diff -u -p -r1.1014 install.sub
> --- install.sub       3 Jun 2017 22:27:41 -0000       1.1014
> +++ install.sub       14 Jun 2017 22:06:47 -0000
> @@ -1060,10 +1060,9 @@ v6_config() {
>  # Perform an 802.11 network scan on interface $1.
>  # The result is cached in $WLANLIST.
>  ieee80211_scan() {
> -     # N.B. Skipping quoted nwid's for now.
>       [[ -f $WLANLIST ]] ||
>               ifconfig $1 scan |
> -             sed -n 's/^             nwid \([^"]\)/\1/p' >$WLANLIST
> +                     sed -n 's/^[[:space:]]*nwid //p' >$WLANLIST
>       cat $WLANLIST
>  }
>  
> @@ -1078,15 +1077,16 @@ ieee80211_config() {
>       # Empty scan cache.
>       rm -f $WLANLIST
>  
> -     while [[ -z $_nwid ]]; do
> +     while [[ -z "$_nwid" ]]; do
>               ask_until "Access point? (ESSID, 'any', list# or '?')" "any"
>               case "$resp" in
>               +([0-9]))
> -                     _nwid=$(ieee80211_scan $_if | sed -n "${resp}s/ .*//p")
> +                     _nwid=$(ieee80211_scan $_if | sed -n ${resp}'{s/ chan 
> .*//p;q;}')
>                       [[ -z $_nwid ]] && echo "There is no line $resp."
> +                     [[ $_nwid = \"*\" ]] && _nwid=${_nwid#\"} 
> _nwid=${_nwid%\"}
>                       ;;
>               \?)     ieee80211_scan $_if |
> -                             sed -n 's/^\([^ ]*\) chan .* bssid \([^ ]*\) 
> .*$/       \1 (\2)/p' |
> +                             sed -n 's/^\(.*\) chan .* bssid \([^ ]*\) 
> .*$/\1 (\2)/p' |
>                               cat -n | more -c
>                       ;;
>               *)      _nwid=$resp

Here's a slightly different but completely untested approach ...

ieee80211_scan()
  - Extract the needed information (nwid, bssid) using a very specific
    sed expression. Any line, not matching this expr is ignored.

  - Remove leading and trailing double-quotes in case of nwids with
    spaces.

  - Write nwid and bssid into WLANLIST as '<nwid><space>(<bssid>)'.

ieee80211_config()
  - just print WLANLIST using ieee80211_scan() if the user chooses
    '?' which has the right format already

  - in case the user selects an entry from WLANLIST using a number,
    remove the '<space>(<bssid>)' part from the line, resulting in
    the nwid (without double-quotes)

  - using the quote() function with the ifconfig command ensures,
    that the nwid is quoted properly with single-quotes in case it
    contains spaces

  - using the quote() function when writing the nwid to the hostname.if
    files ensures that the nwid is quoted properly with single-quotes
    in case it contains spaces

The parse_hn_line() function in netstart does handle quoted nwids
properly when processing the hostname.if config lines as far as I
can see.


Index: install.sub
===================================================================
RCS file: /cvs/src/distrib/miniroot/install.sub,v
retrieving revision 1.1019
diff -u -p -p -u -r1.1019 install.sub
--- install.sub 2 Jul 2017 12:45:43 -0000       1.1019
+++ install.sub 2 Jul 2017 16:21:42 -0000
@@ -1060,10 +1060,10 @@ v6_config() {
 # Perform an 802.11 network scan on interface $1.
 # The result is cached in $WLANLIST.
 ieee80211_scan() {
-       # N.B. Skipping quoted nwid's for now.
        [[ -f $WLANLIST ]] ||
                ifconfig $1 scan |
-               sed -n 's/^             nwid \([^"]\)/\1/p' >$WLANLIST
+               sed -En 's/^[[:space:]]+nwid (.*) chan [0-9]+ bssid 
([[:xdigit:]:]+) .*$/\1 (\2)/p' |
+               sed 's/"\(.*\)"/\1/' >$WLANLIST
        cat $WLANLIST
 }
 
@@ -1082,12 +1082,11 @@ ieee80211_config() {
                ask_until "Access point? (ESSID, 'any', list# or '?')" "any"
                case "$resp" in
                +([0-9]))
-                       _nwid=$(ieee80211_scan $_if | sed -n "${resp}s/ .*//p")
+                       _nwid=$(ieee80211_scan $_if |
+                               sed -En "${resp}s/ \([[:xdigit:]:]+\)//p")
                        [[ -z $_nwid ]] && echo "There is no line $resp."
                        ;;
-               \?)     ieee80211_scan $_if |
-                               sed -n 's/^\([^ ]*\) chan .* bssid \([^ ]*\) 
.*$/       \1 (\2)/p' |
-                               cat -n | more -c
+               \?)     ieee80211_scan $_if | cat -n | more -c
                        ;;
                *)      _nwid=$resp
                        ;;
@@ -1096,7 +1095,7 @@ ieee80211_config() {
 
        # 'any' implies that only open access points are considered.
        if [[ $_nwid != any ]]; then
-               ifconfig $_if nwid "$_nwid"
+               ifconfig $_if nwid $(quote "$_nwid")
                quote nwid "$_nwid" >>$_hn
 
                _prompt="Security protocol? (O)pen, (W)EP"
===================================================================
Stats: --- 7 lines 291 chars
Stats: +++ 6 lines 286 chars
Stats: -1 lines
Stats: -5 chars

Reply via email to