🌴 Sync 2026-03-05 23:51:42

This commit is contained in:
github-actions[bot] committed 2026-03-05 23:51:42 +08:00
1 parent 97c049ed0a
commit 0acff03804
14253 files changed
+3893239

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
#
# Copyright (C) 2009-2014 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=p910nd
PKG_VERSION:=0.97
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=@SF/p910nd
PKG_LICENSE:=GPLv2
PKG_LICENSE_FILES:=COPYING
PKG_HASH:=skip
PKG_MAINTAINER:=Philipp Kerling <pkerling@casix.org>
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
define Package/p910nd
SECTION:=net
CATEGORY:=Network
SUBMENU:=Printing
TITLE:=A small non-spooling printer server
URL:=http://p910nd.sourceforge.net
DEPENDS:=+kmod-usb-printer
USERID:=p910nd=393:lp=7
endef
define Package/p910nd/conffiles
/etc/config/p910nd
endef
define Package/p910nd/description
p910nd is a small daemon that copies any data received on
the port it is listening on to the corresponding printer
port. It is primarily intended for diskless Linux hosts
running as printer drivers but there is no reason why it
could not be used on diskful hosts. Port 9100 is copied
to /dev/lp0, 9101 to /dev/lp1 and 9102 to /dev/lp2. The
default is port 9100 to /dev/lp0.
endef
MAKE_FLAGS += \
CFLAGS="$(TARGET_CFLAGS) -DLOCKFILE_DIR=\"\\\"/tmp\"\\\""
define Package/p910nd/install
$(INSTALL_DIR) $(1)/usr/sbin
$(CP) $(PKG_INSTALL_DIR)/usr/sbin/p910nd $(1)/usr/sbin/
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/p910nd.config $(1)/etc/config/p910nd
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/p910nd.init $(1)/etc/init.d/p910nd
$(INSTALL_DIR) $(1)/etc/hotplug.d/usbmisc
$(INSTALL_BIN) ./files/p910nd.hotplug $(1)/etc/hotplug.d/usbmisc/20-p910nd
endef
$(eval $(call BuildPackage,p910nd))
+26
View File
@@ -0,0 +1,26 @@
config p910nd
option device /dev/usb/lp0
# Actual TCP port is 9100 plus this value
# Valid values are 0,1,2
option port 0
option bidirectional 1
option enabled 0
# Override running as user p910nd, group lp
option runas_root 0
# mDNS support - see Bonjour Printing Specification for details concerning the values
# Be aware that you can only advertise one printer on this host via mDNS
# Set to 1 to enable
option mdns 0
# Human-readable printer make and model
option mdns_ty 'My Printer Manufacturer/Model'
# Human-readable location
option mdns_note 'Basement'
# Post-Script product string, including parenthesis
option mdns_product ''
# IEEE-1284 Device ID MANUFACTURER/MFG string
option mdns_mfg ''
# IEEE-1284 Device ID MODEL/MDL string
option mdns_mdl ''
# IEEE-1284 Device ID COMMAND SET/CMD string
option mdns_cmd ''
+393
View File
@@ -0,0 +1,393 @@
#!/bin/sh
# shellcheck disable=SC3043 # aka 'local VAR'
# c 2024 systemcrash (GitHub)
#hotplug.d triggers this script on the plug {in|out} of USB printers
# Define the uci config section
DAEMON=p910nd
DAEMON_HOTPLUG="$DAEMON hotplug"
DAEMON_ERR="daemon.err"
DAEMON_INFO="daemon.info"
DRIVER_HOME_DEFAULT=/opt/"$DAEMON"_drivers
SYSUPGRADE_CONF="/etc/sysupgrade.conf"
# Assumptions:
# * There is no guarantee that multiple devices are re-assigned the same
# character device upon plug/unplug unless connection hierarchy/tree is
# unchanged i.e. reboot gives the same order if connection topology is identical.
# * Depends on udev. char dev number assignment order not guaranteed.
# * most users likely only have a single printer connected (mDNS announces one)
# Step 1. Get /dev/usb/lpX and build THIS_USB_VIDPID from hotplug passed device.
# Step 2a. Absent p910nd settings, auto configure settings with provided info.
# A usbvidpid is an anchor: to ensure the printer receives the right blob.
# Add other ieee1284_id derived info.
# Step 2b. For a matching character device, augment its existing config with any
# missing usbvidpid and ieee1284_id derived info.
# Step 3. For matching character device and usbvidpid: send_driver
# Caveat: hotplug always maps the first plugged device as /dev/usb/lp0. The 1st
# /dev/usb/lp0 match in config gets augmented with THIS_USB_VIDPID, whether
# it is the same "device" or not.
# The process below runs send_driver, but the driver is not yet on disk.
# This hotplug script aims for convenience, not technical perfection.
# Note that this does not matter if the configured lp0 does not match the
# current lp0. Why? We chose a specific filename for the blob, to which the user
# provides the file post-factum. So worst-case: soft-bricking if the user puts
# the wrong blob at the specified file path. This is an acceptable compromise to
# perfection until we find better ways of shooting ourselves in the foot. :)
# It is a configuration complexity that a p910nd end-user should anyhow be aware
# of: that multiple devices cannot simultaneously use the same /dev/usb/lpX.
# If run as hotplug usb module (as opposed to usbmisc module):
# DEV_TYPE_FILTER="usb_device"
# Test the script by running $0 -d.
if [ -n "$1" ] && [ "$1" = "-d" ]; then
# Set the variable DEBUG to true (or anything) for extra debug output
DEBUG=true
# Normal hotplug invocation provides these parameters:
DEVPATH="/devices/platform/ahb/1b400000.usb/usb2/2-1/2-1:1.0/usbmisc/lp0"
DEVNAME="usb/lp0"
ACTION="add"
fi
# For usbmisc, hotplug passes the following usable variables:
# $0: /sbin/hotplug-call
# $1: usbmisc
# $ACTION: add|remove
# $DEVNAME: usb/lp0
# $DEVPATH: /devices/platform/ahb/1b400000.usb/usb2/2-1/2-1:1.0/usbmisc/lp0
# $DEVICENAME: lp0
# $SEQNUM: 1555
# $MAJOR: 180
# $MINOR: 0
# For usb, hotplug passes the following usable variables:
# outputs:
# $0: /sbin/hotplug-call
# $1: usb
# $ACTION: add|remove|bind|unbind
# $DEVNAME: bus/usb/002/009
# $DEVNUM: 009
# $DEVPATH: /devices/platform/ahb/1b400000.usb/usb2/2-1
# $DEVICENAME: 2-1
# $DEVTYPE: usb_device
# $DRIVER: usb
# $TYPE: 0/0/0
# $PRODUCT: 3f0/4117/100
# $SEQNUM: 1534
# $BUSNUM: 002
# $MAJOR: 180
# $MINOR: 0
# usbmisc scripts have access to fewer parameters than usb hotplug scripts, so
# we must be able to assemble THIS_USB_VIDPID ourselves.
# use % for shortest match, and trim away "/usbmisc/lp*"
ACTUAL_DEVPATH=${DEVPATH%/usbmisc/lp*}
# Prepend /sys/ to get actual device path,
ACTUAL_DEVPATH="/sys$ACTUAL_DEVPATH"
[ "$DEBUG" ] && echo ACTUAL_DEVPATH is "$ACTUAL_DEVPATH"
PARENT_DEVPATH=$( dirname "${ACTUAL_DEVPATH}" )
# We might need to do this if symlinks are problematic. Might not:
# devpath="$(readlink -f $ACTUAL_DEVPATH)"
# https://www.usb.org/sites/default/files/usbprint11a021811.pdf
# Check whether connected device is a "Printer"
[ "$(cat "$ACTUAL_DEVPATH/bInterfaceClass")" = "07" ] && [ "$(cat "$ACTUAL_DEVPATH/bInterfaceSubClass")" = "01" ] && iAmAPrinter=true
# Not a printer? Bail.
[ ! "$iAmAPrinter" ] && exit 0
# Port directionality
BIP=$( cat "$ACTUAL_DEVPATH/bInterfaceProtocol" )
[ "$DEBUG" ] && echo BIP: "$BIP"
case $BIP in
01 )
BIDIR=0
;;
02 | 03 )
BIDIR=1
;;
esac
# Verify that we have p910nd settings
if ! uci -q get $DAEMON; then
touch /etc/config/$DAEMON
uci -q add $DAEMON $DAEMON
uci -q commit
fi
# Next, we need THIS_USB_VIDPID. This is to ensure that we send the right blob
# to the right USB printer. THIS_USB_VIDPID is an anchor, or filter, if you will.
# THIS_USB_VIDPID is formed by: idVendor/idProduct
# Found under: /sys/bus/usb/devices/*/idVendor
# Avoid anchoring also to bcdDevice which is like a hw version
# printer driver blobs account for different hw versions anyway, so ignore it.
# THIS_USB_VIDPID="3f0/4117"
idVendor=$( cat "$PARENT_DEVPATH/idVendor" )
idProduct=$( cat "$PARENT_DEVPATH/idProduct" )
[ "$DEBUG" ] && echo idVendor+idProduct: "$idVendor" + "$idProduct"
THIS_USB_VIDPID="$idVendor/$idProduct"
# Driver blob e.g.: Hewlett-Packard_HP_LaserJet_1018_03f0_4117.bin
# Not always available:
iSerialNumber=$( cat "$PARENT_DEVPATH/iSerialNumber" 2>/dev/null ) || iSerialNumber=$( cat "$PARENT_DEVPATH/serial" 2>/dev/null )
[ "$DEBUG" ] && echo iSerialNumber is "$iSerialNumber"
# Get the special IEEE1284 Device ID string (apparently limited to 127 chars)
ieee1284info=$(cat "$ACTUAL_DEVPATH/ieee1284_id" )
[ "$DEBUG" ] && echo ieee1284info is "$ieee1284info"
# Absent the uci daemon hotplug config group, set it to a default
[ -z "$(uci -q get $DAEMON.@hotplug[0])" ] && uci -q add $DAEMON hotplug
# # Absent the driver_home path config, set it to a default
[ -z "$(uci -q get $DAEMON.@hotplug[0].driver_home)" ] && uci -q set $DAEMON.@hotplug[-1].driver_home=$DRIVER_HOME_DEFAULT && uci -q commit $DAEMON
# Make the driver folder hierarchy
if ! mkdir -p "$DRIVER_HOME_DEFAULT"; then
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_ERR" Error running 'mkdir -p' "$DRIVER_HOME_DEFAULT".
fi
# Help the folder survive a sysupgrade:
if ! grep -q "^$DRIVER_HOME_DEFAULT$" "$SYSUPGRADE_CONF" ; then
# TODO: remove old non-existent p910nd paths from $SYSUPGRADE_CONF?
# Absent the path, try to add it to $SYSUPGRADE_CONF
if ! echo $DRIVER_HOME_DEFAULT >> $SYSUPGRADE_CONF; then
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_ERR" Problem adding "$DRIVER_HOME_DEFAULT" path to "$SYSUPGRADE_CONF."
else
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_INFO" Added "$DRIVER_HOME_DEFAULT" path to "$SYSUPGRADE_CONF".
fi
fi
DRIVER_HOME=$(uci -q get $DAEMON.@hotplug[-1].driver_home)
[ "$DEBUG" ] && echo DRIVER_HOME is "$DRIVER_HOME"
# Trim trailing forward slash if it crept in somehow.
DRIVER_HOME=${DRIVER_HOME%/}
DRIVER_BLOBNAME_TAIL="$idVendor"_"$idProduct".bin
[ "$DEBUG" ] && echo DRIVER_BLOBNAME_TAIL is "$DRIVER_BLOBNAME_TAIL"
# Global device config number variable
UCI_DEV_CFG_NUMBER=-1
# find which daemon configs have the matching lpX interface
match_current_device() {
# Build array of /dev/usb/lpX character devices already configured
set -- "$(IFS=$(printf '\n') && uci -q batch <<- EOI
get "$DAEMON".@"$DAEMON"[0].device
get "$DAEMON".@"$DAEMON"[1].device
get "$DAEMON".@"$DAEMON"[2].device
get "$DAEMON".@"$DAEMON"[3].device
get "$DAEMON".@"$DAEMON"[4].device
get "$DAEMON".@"$DAEMON"[5].device
get "$DAEMON".@"$DAEMON"[6].device
get "$DAEMON".@"$DAEMON"[7].device
get "$DAEMON".@"$DAEMON"[8].device
get "$DAEMON".@"$DAEMON"[9].device
EOI
)"
# $1-$10 are now set
x=0
# shellcheck disable=SC2068
for i in $@; do
# $DEVNAME is passed by hotplug
[ "$DEBUG" ] && echo UCI_DEV_CFG_NUMBER is $UCI_DEV_CFG_NUMBER and CHAR_DEV is "$CHAR_DEV"
[ "$DEVNAME" = "${i#/dev/}" ] && UCI_DEV_CFG_NUMBER=$x && CHAR_DEV=$i
# TODO: multiple configured devices could have same CHAR_DEV if not connected concurrently
x=$(( x+1 ))
done
}
get_and_store_printer_info() {
# gets /sys/bus/usb/devices/2-1:1.0/ieee1284_id:
# MFG:Hewlett-Packard
# MDL:HP LaserJet 1018
# CMD:ACL
# CLS:PRINTER
# DES:HP LaserJet 1018
local MFG
local MDL
local CMD
local CLS
local DES
local DRV
local CID
local CMT
local SN
local VER
# Build array of /dev/usb/lpX character devices already configured
match_current_device
uqgddu_cmd='uci -q get '"$DAEMON".@"$DAEMON"[$UCI_DEV_CFG_NUMBER]
uqsddu_cmd='uci -q set '"$DAEMON".@"$DAEMON"[$UCI_DEV_CFG_NUMBER]
# set Internal Field Separator to semicolon found in ieee1284_id files
IFS=";"
# Got 1284 Device ID string
set -- "$ieee1284info"
[ "$DEBUG" ] && echo ieee1284info: "$ieee1284info"
# shellcheck disable=SC2068
for i in $@; do
[ "$DEBUG" ] && echo i:"$i"
case $i in
MFG:* | MANUFACTURER:* | MFR:* )
MFG=${i##*:};;
MDL:* | MODEL:* )
MDL=${i##*:};;
CMD:* | "COMMAND SET:*" )
CMD=${i##*:};;
CLS:* )
CLS=${i##*:};;
DES:* | DESCRIPTION:* )
DES=${i##*:};;
DRV:* )
DRV=${i##*:};;
CID:* | COMPATIBLEID:* )
CID=${i##*:};;
COMMENT:* )
CMT=${i##*:};;
SN:* | SERIALNUMBER:* | SERN:* )
SN=${i##*:};;
VER:* )
VER=${i##*:};;
esac
[ -n "$SN" ] || SN="$iSerialNumber"
[ "$DEBUG" ] && echo ${MFG:+MFG=$MFG} ${MDL:+MDL=$MDL} ${CMD:+CMD=$CMD} ${CLS:+CLS=$CLS} ${DES:+DES=$DES} ${SN:+SN=$SN}
[ "$DEBUG" ] && echo 'uci set' for UCI_DEV_CFG_NUMBER: $UCI_DEV_CFG_NUMBER
[ -z "$(eval "$uqgddu_cmd".bidirectional)" ] && eval "$uqsddu_cmd.bidirectional='$BIDIR'"
[ -z "$(eval "$uqgddu_cmd".port)" ] && eval "$uqsddu_cmd.port='0'"
[ -z "$(eval "$uqgddu_cmd".enabled)" ] && eval "$uqsddu_cmd.enabled='1'"
[ -z "$(eval "$uqgddu_cmd".usbvidpid)" ] && [ -n "$THIS_USB_VIDPID" ] && eval "$uqsddu_cmd.usbvidpid='$THIS_USB_VIDPID'"
# Safe to default to on for mDNS if we found one of the mandatory properties (e.g. MDL)
[ -z "$(eval "$uqgddu_cmd".mdns)" ] && [ -n "$MDL" ] && eval "$uqsddu_cmd.mdns='1'"
[ -z "$(eval "$uqgddu_cmd".mdns_ty)" ] && [ -n "$DES" ] && eval "$uqsddu_cmd.mdns_ty='$DES'"
[ -z "$(eval "$uqgddu_cmd".mdns_product)" ] && [ -n "$DES" ] && eval "$uqsddu_cmd.mdns_product='($DES)'"
[ -z "$(eval "$uqgddu_cmd".mdns_mfg)" ] && [ -n "$MFG" ] && eval "$uqsddu_cmd.mdns_mfg='$MFG'"
[ -z "$(eval "$uqgddu_cmd".mdns_mdl)" ] && [ -n "$MDL" ] && eval "$uqsddu_cmd.mdns_mdl='$MDL'"
[ -z "$(eval "$uqgddu_cmd".mdns_cmd)" ] && [ -n "$CMD" ] && eval "$uqsddu_cmd.mdns_cmd='$CMD'"
[ -z "$(eval "$uqgddu_cmd".mdns_note)" ] && eval "$uqsddu_cmd.mdns_note='Located near router'"
# Optional ieee1284_id parameters
[ -z "$(eval "$uqgddu_cmd".mdns_cid)" ] && [ -n "$CID" ] && eval "$uqsddu_cmd.mdns_cid='$CID'"
[ -z "$(eval "$uqgddu_cmd".mdns_cls)" ] && [ -n "$CLS" ] && eval "$uqsddu_cmd.mdns_cls='$CLS'"
[ -z "$(eval "$uqgddu_cmd".mdns_cmt)" ] && [ -n "$CMT" ] && eval "$uqsddu_cmd.mdns_cmt='$CMT'"
[ -z "$(eval "$uqgddu_cmd".mdns_drv)" ] && [ -n "$DRV" ] && eval "$uqsddu_cmd.mdns_drv='$DRV'"
[ -z "$(eval "$uqgddu_cmd".mdns_sn)" ] && [ -n "$SN" ] && eval "$uqsddu_cmd.mdns_sn='$SN'"
[ -z "$(eval "$uqgddu_cmd".mdns_ver)" ] && [ -n "$VER" ] && eval "$uqsddu_cmd.mdns_ver='$VER'"
# No previously configured device? Configure this instance. Set CHAR_DEV so we can send driver.
[ $UCI_DEV_CFG_NUMBER -eq -1 ] && eval "$uqsddu_cmd.device=/dev/'$DEVNAME'" && CHAR_DEV=/dev/"$DEVNAME"
if [ -n "$MFG" ] && [ -n "$MDL" ] && [ -n "$DRIVER_BLOBNAME_TAIL" ] && [ -z "$(eval "$uqgddu_cmd".driver_file)" ]; then
DRIVER_FILE="$MFG"_"$MDL"_"$DRIVER_BLOBNAME_TAIL"
# Make blob filename more friendly: change space to underscore
DRIVER_FILE="$DRIVER_HOME"/"$(echo "$DRIVER_FILE" | sed 's/ /_/g')"
[ "$DEBUG" ] && echo DRIVER_FILE: "$DRIVER_FILE"
uci set "$DAEMON".@"$DAEMON"[$UCI_DEV_CFG_NUMBER].driver_file="$DRIVER_FILE"
fi
done
}
daemon_restart() {
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_INFO" "(Re)starting $DAEMON"
/etc/init.d/$DAEMON restart
}
daemon_stop() {
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_INFO" "Stopping $DAEMON"
/etc/init.d/$DAEMON stop
}
send_driver() {
DRIVER_FILE=$( uci -q get "$DAEMON".@"$DAEMON"[$UCI_DEV_CFG_NUMBER].driver_file )
if [ -e "$DRIVER_FILE" ]; then
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_INFO" "Sending driver to $DAEMON printer $THIS_USB_VIDPID"
if ! cat "$DRIVER_FILE" > "$CHAR_DEV"; then
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_ERR" "Sending driver to $CHAR_DEV [ $THIS_USB_VIDPID ] failed for some reason."
else
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_INFO" "Sent $DRIVER_FILE to $CHAR_DEV [ $THIS_USB_VIDPID ]."
fi
else
logger -t "$DAEMON_HOTPLUG" -p "$DAEMON_INFO" "No driver file: $DRIVER_FILE for $CHAR_DEV [ $THIS_USB_VIDPID ] (upload it if your printer needs a driver loading)."
fi
}
case "$ACTION" in
add)
# Set permissions on the /dev/usb/lpX char dev
[ -n "${DEVNAME}" ] && [ "${DEVNAME##usb/lp*}" = "" ] && {
chmod 660 /dev/"$DEVNAME"
chgrp lp /dev/"$DEVNAME"
}
get_and_store_printer_info
[ "$DEBUG" ] && echo THIS_USB_VIDPID: "$THIS_USB_VIDPID"
[ "$DEBUG" ] && echo CHAR_DEV: "$CHAR_DEV"
# usb subsys only:
# [ "$DEBUG" ] && echo DEVTYPE: $DEVTYPE
# [ "$DEBUG" ] && echo DEV_TYPE_FILTER: $DEV_TYPE_FILTER
# [ "$DEBUG" ] && echo PRODUCT: $PRODUCT
# Extra checks available when run as hotplug usb script:
# [ "$DEVTYPE" == "${DEV_TYPE_FILTER}" ]
# [ -z "${PRODUCT##*$THIS_USB_VIDPID*}" ]
# Ensure dev is character device
if [ -n "$THIS_USB_VIDPID" ] && [ -c "$CHAR_DEV" ]; then
# if zero string, i.e. usb_ID is a match for $PRODUCT supplied by hotplug
if [ "$(uci -q get "$DAEMON".@"$DAEMON"[$UCI_DEV_CFG_NUMBER].usbvidpid)" = "$THIS_USB_VIDPID" ]; then
[ "$DEBUG" ] && echo "THIS_USB_VIDPID match for $DAEMON device $THIS_USB_VIDPID."
send_driver
else
[ "$DEBUG" ] && echo "No THIS_USB_VIDPID match."
fi
fi
daemon_restart
;;
remove)
# device is gone
;;
# Special actions available to "usb" subsystem
# bind)
# # special action
# ;;
# unbind)
# # special action
# ;;
esac
# Commit any changes
[ -n "$( uci -q changes $DAEMON )" ] && uci commit $DAEMON
+99
View File
@@ -0,0 +1,99 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2007 OpenWrt.org
START=99
USE_PROCD=1
DAEMON_NAME="p910nd"
CONFIG="p910nd"
append_bool() {
local section="$1"
local option="$2"
local value="$3"
local _val
config_get_bool _val "$section" "$option" '0'
[ "$_val" -gt 0 ] && append args "$3"
}
append_string() {
local section="$1"
local option="$2"
local value="$3"
local _val
config_get _val "$section" "$option"
[ -n "$_val" ] && append args "$3$_val"
}
start_service() {
config_load $CONFIG
config_foreach start_p910nd $CONFIG
}
start_p910nd() {
local section="$1" runas_root
config_get_bool "enabled" "$section" "enabled" '0'
config_get device "$section" device
# If the device path exists, the device is connected; set it up:
if [ "$enabled" -gt 0 ] && [ -e "$device" ]; then
args="-d "
config_get port "$section" port
append_bool "$section" bidirectional "-b"
append_string "$section" device "-f "
append_string "$section" bind "-i "
append_string "$section" port ""
procd_open_instance
procd_set_param command /usr/sbin/$DAEMON_NAME $args
procd_set_param respawn
config_get_bool runas_root "$section" runas_root 0
[ "$runas_root" -ne 1 ] && procd_set_param user $DAEMON_NAME
config_get_bool "mdns" "$section" "mdns" '0'
if [ "$mdns" -gt 0 ]; then
config_get mdns_note "$section" mdns_note
config_get mdns_ty "$section" mdns_ty
config_get mdns_product "$section" mdns_product
config_get mdns_mfg "$section" mdns_mfg
config_get mdns_mdl "$section" mdns_mdl
config_get mdns_cmd "$section" mdns_cmd
# Optional parameters
config_get mdns_cid "$section" mdns_cid
config_get mdns_cls "$section" mdns_cls
config_get mdns_cmt "$section" mdns_cmt
config_get mdns_des "$section" mdns_des
config_get mdns_drv "$section" mdns_drv
config_get mdns_sn "$section" mdns_sn
config_get mdns_ver "$section" mdns_ver
# Set initial arguments
set -- "pdl-datastream" "tcp" "$((port+9100))"
set -- "$@" "txtvers=1"
# bonjourprinting-1.2.1.pdf spec mandates (at least) MFG, MDL, CMD for Socket type
[ -n "$mdns_note" ] && set -- "$@" "note=$mdns_note"
[ -n "$mdns_ty" ] && set -- "$@" "ty=$mdns_ty"
[ -n "$mdns_product" ] && set -- "$@" "product=$mdns_product"
[ -n "$mdns_mfg" ] && set -- "$@" "usb_MFG=$mdns_mfg"
[ -n "$mdns_mdl" ] && set -- "$@" "usb_MDL=$mdns_mdl"
[ -n "$mdns_cmd" ] && set -- "$@" "usb_CMD=$mdns_cmd"
# Optional parameters
[ -n "$mdns_cid" ] && set -- "$@" "usb_CID=$mdns_cid"
[ -n "$mdns_cls" ] && set -- "$@" "usb_CLS=$mdns_cls"
[ -n "$mdns_cmt" ] && set -- "$@" "usb_CMT=$mdns_cmt"
[ -n "$mdns_des" ] && set -- "$@" "usb_DES=$mdns_des"
[ -n "$mdns_drv" ] && set -- "$@" "usb_DRV=$mdns_drv"
[ -n "$mdns_sn" ] && set -- "$@" "usb_SN=$mdns_sn"
[ -n "$mdns_ver" ] && set -- "$@" "usb_VER=$mdns_ver"
# Call procd_add_mdns with the positional parameters
MDNS_INSTANCE_NAME="$mdns_ty" procd_add_mdns "$@"
fi
procd_close_instance
fi
}
service_triggers()
{
procd_open_trigger
procd_add_config_trigger "config.change" $DAEMON_NAME /etc/init.d/$DAEMON_NAME reload
procd_close_trigger
}