On Aug 3, 2013, at 5:04 AM, Robert Huff wrote:

> 
> Fbsd8 writes:
> 
>> I have a .sh script that I need to determine if the entered IP
>> address is IPv4 or IPv6.
>> 
>> Is there some .sh command that does this?
> 
>       Not that I know of.
>       But ... how hard can it be to figure out whether it uses '.' or
> ':'?
> 

Actually, there's /usr/share/bsdconfig/media/tcpip.subr

Function family:

f_validate_ipaddr6 $ipv6_addr
        # Should be complete; I digested multiple RFCs on IPv6

f_validate_ipaddr $ipv4_addr [$netmask]
        # optional netmask to validate IP is within doubly-valid
        
f_validate_hostname $hostname
        # To RFC specifications 952 and 1123

But if you need to prompt the user to enter a value and then validate it, the 
above functions return meaningful exit status for determining what's wrong with 
their entry (why did it fail specification, for example).

To help decode the exit status, the functions you want to use are:

# In /usr/share/bsdconfig/networking/ipaddr.subr

Function family:

f_dialog_iperror $status $ipv4_addr
f_dialog_ip6error $status $ipv6_addr

As is implied with the "_dialog_" in their name, they take the $? exit status 
from the previously mentioned f_validate_*() functions and display a dialog(1) 
error appropriate to what's wrong.

For example, you might see:

ERROR! One or more individual octets within the IPv4 address\n(separated by 
dots) contains one or more invalid characters.\nOctets must contain only the 
characters 0-9.\n\nInvalid IP Address: %s

or

ERROR! The IP address entered has either too few (less than 3), too\nmany (more 
than 8), or not enough segments, separated by colons.\n\nInvalid IPv6 Address: 
%s

And then, in the same function family above (as the *ip[6]error()):

f_dialog_vaildate_ipaddr $ipv4_addr
f_dialog_validate_ipaddr6 $ipv6_addr

These are like:

f_validate_ipaddr $ipv4_addr
f_validate_ipaddr6 $ipv6_addr

Except as implied by the extra "_dialog_" in their name, they will actually run 
f_validate_* and then f_dialog_ip[6]error() for you with the result.

Finally, last, but not least...

The process of actually *getting* the values has been simplified too. In the 
same family function (as f_dialog_ip[6]error and f_dialog_validate_ipaddr[6]()) 
is:

f_dialog_input_ipaddr $interface $ipaddr
        # $interface is displayed in the prompt text
        # $ipaddr is used as default text in the input box

If user doesn't press escape or select cancel, $ipaddr will hold the users 
entry.

This function validates, displays errors, and is an all-around solution if you 
need to prompt the user to enter the info and only proceed if they enter a 
valid entry (the above function is IPv4 centric and supports CIDR notation).

The IPv6 version of the latter (f_dialog_input_ipaddr6) does not yet exist. I'm 
getting there. For now, if you need to prompt for an entry that could be IPv6, 
use the generic f_dialog_input() routine and sanitize it with the 
aforementioned API.
-- 
Cheers,
Devin

_____________
The information contained in this message is proprietary and/or confidential. 
If you are not the intended recipient, please: (i) delete the message and all 
copies; (ii) do not disclose, distribute or use the message in any manner; and 
(iii) notify the sender immediately. In addition, please be aware that any 
message addressed to our domain is subject to archiving and review by persons 
other than the intended recipient. Thank you.
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to