Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 637394 | Differences between
and this patch

Collapse All | Expand All

(-)a/net/iproute2.sh (-21 / +103 lines)
Lines 195-202 _add_address() Link Here
195
				error|fatal) msgfunc=eerror rc=1;;
195
				error|fatal) msgfunc=eerror rc=1;;
196
				*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;;
196
				*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;;
197
			esac
197
			esac
198
			eval $msgfunc "Address ${address}${netmask:+/}${netmask} already existed!"
198
			$msgfunc "Address ${address}${netmask:+/}${netmask} already existed!"
199
			eval $msgfunc \"$(ip addr show to "${address}/${family_maxnetmask}" dev "${IFACE}" 2>&1)\"
199
			$msgfunc "$(ip -o addr show to "${address}/${family_maxnetmask}" dev "${IFACE}" 2>&1)"
200
		else
200
		else
201
			: # TODO: Handle other errors
201
			: # TODO: Handle other errors
202
		fi
202
		fi
Lines 204-209 _add_address() Link Here
204
	return $rc
204
	return $rc
205
}
205
}
206
206
207
_filter_metric()
208
{
209
	# ip route show does not allow to filter by metric
210
	# so we need to filter metric manually
211
	local metric_value="$1"
212
	shift
213
214
	if [ "${metric_value}" -eq 0 ]; then
215
		# metric 0 is not displayed
216
		ip -o "$@" | fgrep -vs " metric "
217
	else
218
		# add trailing space for matching
219
		ip -o "$@" | sed 's/$/ /' | fgrep -s " metric ${metric_value} "
220
	fi
221
}
222
223
_is_route_type()
224
{
225
	case "$1" in
226
		unicast|multicast|local|broadcast|throw|unreachable|prohibit|blackhole) true ;;
227
		*) false ;;
228
	esac
229
}
230
207
_add_route()
231
_add_route()
208
{
232
{
209
	local family=
233
	local family=
Lines 219-259 _add_route() Link Here
219
		shift
243
		shift
220
	fi
244
	fi
221
245
222
	if [ $# -eq 3 ]; then
246
	if _is_route_type "$2"; then
247
		:
248
	elif [ $# -eq 3 ]; then
223
		set -- "$1" "$2" via "$3"
249
		set -- "$1" "$2" via "$3"
224
	elif [ "$3" = "gw" ]; then
250
	elif [ "$3" = "gw" ]; then
225
		local one=$1 two=$2
251
		local one="$1" two="$2"
226
		shift; shift; shift
252
		shift; shift; shift
227
		set -- "${one}" "${two}" via "$@"
253
		set -- "${one}" "${two}" via "$@"
228
	fi
254
	fi
229
255
230
	local cmd= cmd_nometric= have_metric=false
256
	local cmd_prefix= cmd_add= cmd_show= metric_value= table_value=
257
	local have_metric=false have_table=false have_prefix=false nodev=false
231
	while [ -n "$1" ]; do
258
	while [ -n "$1" ]; do
232
		case "$1" in
259
		case "$1" in
233
			metric) metric=$2 ; cmd="${cmd} metric $2" ; shift ; have_metric=true ;;
260
			metric|priority|preference)
234
			netmask) x="/$(_netmask2cidr "$2")" ; cmd="${cmd}${x}" ; cmd_nometric="${cmd}${x}" ; shift;;
261
				cmd_prefix="${cmd_prefix} ${1} ${2}"
262
				metric_value="$2"
263
				have_metric=true
264
				shift ;;
265
			netmask)
266
				x="/$(_netmask2cidr "$2")"
267
				cmd_prefix="${cmd_prefix}${x}"
268
				cmd_show="${cmd_show}${x}"
269
				have_prefix=true
270
				shift ;;
271
			tos)
272
				cmd_add="${cmd_add} ${1} ${2}"
273
				cmd_show="${cmd_show} ${1} ${2}"
274
				shift ;;
275
			table)
276
				cmd_add="${cmd_add} ${1} ${2}"
277
				cmd_show="${cmd_show} ${1} ${2}"
278
				have_table=true
279
				shift ;;
280
			unicast|multicast)
281
				cmd_prefix="${cmd_prefix} ${1}"
282
				;;
283
			local|broadcast)
284
				# those are added to table local by default
285
				cmd_prefix="${cmd_prefix} ${1}"
286
				table_value="local"
287
				;;
288
			throw|unreachable|prohibit|blackhole)
289
				cmd_prefix="${cmd_prefix} ${1}"
290
				nodev=true
291
				;;
235
			-host|-net);;
292
			-host|-net);;
236
			*) cmd="${cmd} ${1}" ; cmd_nometric="${cmd_nometric} ${1}" ;;
293
			*)
294
				if ${have_prefix}; then
295
					cmd_add="${cmd_add} ${1}"
296
				else
297
					cmd_prefix="${cmd_prefix} ${1}"
298
					cmd_show="${cmd_show} ${1}"
299
					have_prefix=true
300
				fi ;;
237
		esac
301
		esac
238
		shift
302
		shift
239
	done
303
	done
240
304
241
	# We cannot use a metric if we're using a nexthop
305
	# Add table for special types
242
	if ! ${have_metric} && \
306
	if ! ${have_table} && [ -n "${table_value}" ]; then
243
		[ -n "${metric}" -a \
307
		cmd_show="${cmd_show} table ${table_value}"
244
			"${cmd##* nexthop }" = "$cmd" ]
245
	then
246
		cmd="${cmd} metric ${metric}"
247
	fi
308
	fi
248
309
310
	# Add interface's metric by default
311
	if ! ${have_metric} && [ -n "${metric}" ]; then
312
		cmd_prefix="${cmd_prefix} metric ${metric}"
313
		metric_value="${metric}"
314
	fi
315
316
	cmd_add="${cmd_prefix}${cmd_add}"
317
249
	# Check for route already existing:
318
	# Check for route already existing:
250
	ip ${family} route show ${cmd_nometric} dev "${IFACE}" 2>/dev/null | \
319
	ip ${family} route test ${cmd_add} 2>&1 | grep -q 'RTNETLINK answers: File exists'
251
		fgrep -sq "${cmd%% *}"
252
	route_already_exists=$?
320
	route_already_exists=$?
253
321
254
	veinfo ip ${family} route append ${cmd} dev "${IFACE}"
322
	if yesno "${nodev}"; then
255
	ip ${family} route append ${cmd} dev "${IFACE}"
323
		veinfo ip ${family} route append ${cmd_add}
256
	rc=$?
324
		ip ${family} route append ${cmd_add}
325
		rc=$?
326
	else
327
		veinfo ip ${family} route append ${cmd_add} dev "${IFACE}"
328
		ip ${family} route append ${cmd_add} dev "${IFACE}"
329
		rc=$?
330
	fi
331
257
	# Check return code in some cases
332
	# Check return code in some cases
258
	if [ $rc -ne 0 ]; then
333
	if [ $rc -ne 0 ]; then
259
		# If the route already exists, our default behavior is to WARN but continue.
334
		# If the route already exists, our default behavior is to WARN but continue.
Lines 267-274 _add_route() Link Here
267
				error|fatal) msgfunc=eerror rc=1;;
342
				error|fatal) msgfunc=eerror rc=1;;
268
				*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;;
343
				*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;;
269
			esac
344
			esac
270
			eval $msgfunc "Route '$cmd_nometric' already existed:"
345
			local metric_show=
271
			eval $msgfunc \"$(ip $family route show ${cmd_nometric} dev "${IFACE}" 2>&1)\"
346
			if [ -n "${metric_value}" -a "${metric_value}" != 0 ]; then
347
				metric_show=" metric ${metric_value}"
348
			fi
349
			$msgfunc "Route '${cmd_show# }${metric_show}' already existed:"
350
			eindent
351
			_filter_metric "${metric_value}" ${family} route show ${cmd_show} 2>&1 | \
352
				while read l; do $msgfunc "$l"; done
353
			eoutdent
272
		else
354
		else
273
			: # TODO: Handle other errors
355
			: # TODO: Handle other errors
274
		fi
356
		fi

Return to bug 637394