1
1
#! /bin/sh
2
- # Copyright (c) 2007-2023 Roy Marples
2
+ # Copyright (c) 2007-2025 Roy Marples
3
3
# All rights reserved
4
4
5
5
# Redistribution and use in source and binary forms, with or without
25
25
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
26
27
27
RESOLVCONF=" $0 "
28
- OPENRESOLV_VERSION=" 3.13.2 "
28
+ OPENRESOLV_VERSION=" 3.14.0 "
29
29
SYSCONFDIR=@SYSCONFDIR@
30
30
LIBEXECDIR=@LIBEXECDIR@
31
31
VARDIR=@VARDIR@
@@ -34,7 +34,7 @@ RESTARTCMD=@RESTARTCMD@
34
34
35
35
if [ " $1 " = " --version" ]; then
36
36
echo " openresolv $OPENRESOLV_VERSION "
37
- echo " Copyright (c) 2007-2020 Roy Marples"
37
+ echo " Copyright (c) 2007-2025 Roy Marples"
38
38
exit 0
39
39
fi
40
40
@@ -48,6 +48,27 @@ dynamic_order="tap[0-9]* tun[0-9]* vpn vpn[0-9]* wg[0-9]* ppp[0-9]* ippp[0-9]*"
48
48
interface_order=" lo lo[0-9]*"
49
49
name_server_blacklist=" 0.0.0.0"
50
50
51
+ # Poor mans cat
52
+ # /usr might not be available
53
+ cat ()
54
+ {
55
+ OIFS=" $IFS "
56
+ IFS=' '
57
+ if [ -n " $1 " ]; then
58
+ while read -r line; do
59
+ printf " %s\n" " $line "
60
+ done < " $1 "
61
+ else
62
+ while read -r line; do
63
+ printf " %s\n" " $line "
64
+ done
65
+ fi
66
+ retval=$?
67
+ IFS=" $OIFS "
68
+ return $retval
69
+ }
70
+
71
+
51
72
# Support original resolvconf configuration layout
52
73
# as well as the openresolv config file
53
74
if [ -f " $SYSCONFDIR " /resolvconf.conf ]; then
@@ -98,6 +119,7 @@ usage()
98
119
pattern
99
120
-l [\$ PATTERN] Show DNS information, optionally from interfaces
100
121
that match the specified pattern
122
+ -L [\$ PATTERN] Same as -l, but adjusted by our config
101
123
102
124
-u Run updates from our current DNS information
103
125
--version Echo the ${RESOLVCONF##*/ } version
@@ -434,12 +456,68 @@ deprecated_interface()
434
456
return 1
435
457
}
436
458
459
+ match ()
460
+ {
461
+ match=" $1 "
462
+ file=" $2 "
463
+ retval=1
464
+ count=0
465
+
466
+ while read -r keyword value; do
467
+ new_match=
468
+ for om in $match ; do
469
+ m=" $om "
470
+ keep=
471
+ while [ -n " $m " ]; do
472
+ k=" ${m%%/* } "
473
+ r=" ${m#*/ } "
474
+ f=" ${r%%/* } "
475
+ r=" ${r#*/ } "
476
+ # If the length of m is the same as k/f then
477
+ # we know that we are done
478
+ if [ ${# m} = $(( ${# k} + 1 + ${# f} )) ]; then
479
+ r=
480
+ fi
481
+ m=" $r "
482
+ matched=false
483
+ case " $keyword " in
484
+ $k )
485
+ case " $value " in
486
+ $f )
487
+ matched=true
488
+ ;;
489
+ esac
490
+ ;;
491
+ esac
492
+ if ! $matched ; then
493
+ keep=" $keep ${keep: +/ } $k /$f "
494
+ fi
495
+ done
496
+ if [ -n " $om " ] && [ -z " $keep " ]; then
497
+ retval=0
498
+ break 2
499
+ fi
500
+ new_match=" ${new_match}${new_match: + }${keep} "
501
+ done
502
+ match=" ${new_match} "
503
+ done < " $file "
504
+ return $retval
505
+ }
506
+
437
507
list_resolv ()
438
508
{
439
509
[ -d " $IFACEDIR " ] || return 0
440
510
441
- cmd=" $1 "
442
- shift
511
+ OPTIND=
512
+ list_cmd=
513
+ while getopts iLl OPT; do
514
+ case " $OPT " in
515
+ ' ?' ) exit 1;;
516
+ * ) list_cmd=" $OPT " ;;
517
+ esac
518
+ done
519
+ shift $(( $OPTIND - 1 ))
520
+
443
521
pattern_specified=" $1 "
444
522
445
523
excl=false
@@ -540,7 +618,7 @@ list_resolv()
540
618
continue
541
619
fi
542
620
543
- if ! $ALLIFACES ; then
621
+ if [ " $list_cmd " = L ] ; then
544
622
if [ -n " $allow_interfaces " ]; then
545
623
x=false
546
624
for j in $allow_interfaces ; do
@@ -555,16 +633,20 @@ list_resolv()
555
633
continue 2
556
634
fi
557
635
done
636
+
637
+ if [ -n " $exclude " ] && match " $exclude " " $i " ; then
638
+ continue
639
+ fi
558
640
fi
559
641
560
- if [ " $cmd " = i ] || [ " $cmd " = " -i " ]; then
642
+ if [ " $list_cmd " = i ]; then
561
643
printf %s " $i "
562
644
else
563
645
echo_resolv " $i " && echo
564
646
fi
565
647
[ $? = 0 ] && [ " $retval " = 1 ] && retval=0
566
648
done
567
- [ " $cmd " = i ] || [ " $cmd " = " -i " ] && echo
649
+ [ " $list_cmd " = i ] && echo
568
650
return $retval
569
651
}
570
652
@@ -674,7 +756,7 @@ make_vars()
674
756
if [ -z " $VFLAG " ]; then
675
757
IF_EXCLUSIVE=1
676
758
list_resolv -i " $@ " > /dev/null || IF_EXCLUSIVE=0
677
- eval " $( list_resolv -l " $@ " | replace | parse_resolv) "
759
+ eval " $( list_resolv -L " $@ " | replace | parse_resolv) "
678
760
fi
679
761
if [ -n " ${name_servers_append}${search_domains_append} " ]; then
680
762
eval " $( echo_append | parse_resolv) "
@@ -724,7 +806,7 @@ make_vars()
724
806
725
807
force=false
726
808
VFLAG=
727
- while getopts a:C:c:Dd:fhIilm :pRruvVx OPT; do
809
+ while getopts a:C:c:Dd:fhIiLlm :pRruvVx OPT; do
728
810
case " $OPT " in
729
811
f) force=true;;
730
812
h) usage;;
762
844
763
845
# -l lists our resolv files, optionally for a specific interface
764
846
if [ " $cmd " = l ] || [ " $cmd " = i ]; then
765
- ALLIFACES=true
766
- list_resolv " $cmd " " $args "
847
+ list_resolv " -$cmd " " $args "
767
848
exit $?
768
849
fi
769
- ALLIFACES=false
850
+ # -L is the same as -l, but post-processed from our config
851
+ if [ " $cmd " = L ]; then
852
+ list_resolv " -$cmd " " $args " | replace
853
+ exit $? 2
854
+ fi
770
855
771
856
# Restart a service or echo the command to restart a service
772
857
if [ " $cmd " = r ] || [ " $cmd " = R ]; then
@@ -1077,7 +1162,7 @@ export RESTARTCMD RCDIR _NOINIT_WARNED
1077
1162
1078
1163
eval " $( make_vars) "
1079
1164
export RESOLVCONF DOMAINS SEARCH NAMESERVERS LOCALNAMESERVERS
1080
- : ${list_resolv:= list_resolv -l }
1165
+ : ${list_resolv:= list_resolv -L }
1081
1166
retval=0
1082
1167
1083
1168
# Run scripts in the same directory resolvconf is run from
0 commit comments