summaryrefslogtreecommitdiffstats
path: root/examples/printing
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
commit8daa83a594a2e98f39d764422bfbdbc62c9efd44 (patch)
tree4099e8021376c7d8c05bdf8503093d80e9c7bad0 /examples/printing
parentInitial commit. (diff)
downloadsamba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.tar.xz
samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.zip
Adding upstream version 2:4.20.0+dfsg.upstream/2%4.20.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'examples/printing')
-rw-r--r--examples/printing/VampireDriversFunctions1656
-rw-r--r--examples/printing/prtpub.c237
-rw-r--r--examples/printing/readme.prtpub12
-rw-r--r--examples/printing/smbprint.sysv52
4 files changed, 1957 insertions, 0 deletions
diff --git a/examples/printing/VampireDriversFunctions b/examples/printing/VampireDriversFunctions
new file mode 100644
index 0000000..b06e365
--- /dev/null
+++ b/examples/printing/VampireDriversFunctions
@@ -0,0 +1,1656 @@
+#!/bin/bash
+
+#####################################################################
+##
+## smb.conf parser class
+##
+## Copyright (C) Kurt Pfeifle <kpfeifle@danka.de>, 2004.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+##
+######################################################################
+
+######################################################################
+## Here an example calling sequence
+##!/bin/sh
+## set -x
+## source VampireDriversFunctions
+
+##
+## Start local variables
+##
+## You must define these variable (possibly in a source script)
+
+## nthost=192.168.17.1
+## printeradmin=Administrator
+## adminpasswd=not4you
+
+## smbhost=knoppix
+## smbprinteradmin=knoppix
+## smbadminpasswd=knoppix
+##
+## End of local variables
+##
+
+##
+## functions to call
+##
+
+## fetchenumdrivers3listfromNThost # repeat, if no success at first
+## createdrivernamelist
+## createprinterlistwithUNCnames # repeat, if no success at first
+## createmapofprinterstodriver
+## splitenumdrivers3list
+## makesubdirsforWIN40driverlist
+## splitWIN40fileintoindividualdriverfiles
+## fetchtheWIN40driverfiles
+## uploadallWIN40drivers
+## makesubdirsforW32X86driverlist
+## splitW32X86fileintoindividualdriverfiles
+## fetchtheW32X86driverfiles
+## uploadallW32X86drivers
+
+## End of example calling sequence
+######################################################################
+
+
+# -----------------------------------------------------------------------------
+# -----------------------------------------------------------------------------
+function vampiredrivers_readme()
+{
+echo -e " \n\
+############################################################################
+#
+# About the \"Vampire Printer Drivers\" set of functions....
+# --------------------------------------------------------
+#
+# (C) Kurt Pfeifle <kpfeifle@danka.de>, 2004
+# License: GPL
+#
+# ------------------------------------------------------------
+#
+# Version: 0.8 (largely \"self-documented\" now, but not yet
+# completely -- if it ever will be....)
+#
+# Thanks a lot to Fabian Franz for helping me with some important
+# Bash-Scripting-Questions!
+#
+# This set of functions provides a framework to snatch all printer
+# driver info and related files from a Windows NT print server.
+# It then uploads and installs the drivers to a Samba server. (The
+# Samba server needs to be prepared for this: a valid [print$]
+# share, with write access set for a user with SePrintOperatorPrivilege.)
+#
+# The main commands used are \"smbclient\" and \"rpcclient\" combined
+# with \"grep\", \"sed\" and \"awk\". Probably a Perl or Python script
+# would be better suited to do this, mainly because we have to cope
+# with printer and driver names which are containing spaces in
+# them, so a lot of shell escaping is required to handle these.
+# Also, I am not very savvy in scripting, so I invented some very
+# obscure methods to work around my knowledge gaps. When I download
+# the driver files from the Windows NT box, I put all related driver
+# files into their own sub directory, using the same name as the
+# driver. Also, driver versions \"0\", \"2\" and \"3\" are placed in
+# further subdirectories.
+#
+#
+# Known problems:
+# ---------------
+#
+# 1) I found one printer driver containing a \"slash\" which is not
+# handled by this script: \"HP Color LaserJet 5/5M PS\". (There
+# are more of these in the wild, of course.) -- The reason: I
+# didn't find a way to create a Unix directory containing a \"slash\".
+# UPDATE: The script replaces the \"/\" with a \"_\" and also renames
+# the drivername accordingly, when it is uploaded to the Samba
+# [print$] share....
+#
+# 2) There is an unsolved problem in case a real file name deviates
+# in its case sensitive spelling from how it is displayed by the
+# \"rpcclient enumdrivers\" command. I encountered cases where
+# rpcclient displayed \"PS5UI.DLL\" as a file name, but \"smbclient
+# mget\" retrieved \"ps5ui.dll\" from the NT printserver, and the
+# driverinstallation failed because \"smbclient mput\" tried to put
+# \"PS5UI.DLL\" back onto the Samba server where UNIX only had
+# \"ps5ui.dll\" available (which of course failed). -- UPDATE: this
+# is now solved. All files are renamed now to the same
+# case-sensitive spelling as \"rpcclient ... enumdrivers 3\"
+# announces. This includes renaming into both, uppercase or
+# lowercase, as the case might be....
+#
+# 3) This script is probably not portable at all and relies on lots
+# of Bash-isms.
+#
+# 4) This script runs with rpcclient from Samba-3.0.2a (or later) only
+# (because it uses the \"Version\" parameter for \"adddriver\").
+#
+# The following functions use a few external variables to log
+# into the 2 hosts. We suggest that you create a file which
+# contains the variables and that you source that file at the
+# beginning of this script...
+#
+# #################################################################
+#
+# ntprinteradmin=Administrator # any account on the NT host
+# # with SePrintOperatorPrivilege privileges
+# ntadminpasswd=not4you # the printer admin password on
+# # the NT print server
+# nthost=windowsntprintserverbox # the netbios name of the NT print
+# # server
+#
+# smbprinteradmin=knoppix # an account on the Samba server
+# # with SePrintOperatorPrivilege privileges
+# smbadminpasswd=2secret4you # the printer admin password on
+# # the Samba server
+# smbhost=knoppix # the netbios name of the Samba
+# # print server
+#
+# #################################################################
+#
+#
+# NOTE: these functions also work for 2 NT print servers: snatch all
+# drivers from the first, and upload them to the second server (which
+# takes the role of the \"Samba\" server). Of course they also work
+# for 2 Samba servers: snatch all drivers from the first (which takes
+# the role of the NT print server) and upload them to the second....
+#
+#
+# ............PRESS \"q\" TO QUIT............" \
+|less
+}
+
+
+#set -x
+
+
+# -----------------------------------------------------------------------------
+# ----------- print a little help... ------------------------------------------
+# -----------------------------------------------------------------------------
+
+function helpwithvampiredrivers()
+{
+if stringinstring help "$@"; then
+helpwithvampiredrivers ;
+else
+ echo " ";
+ echo " 1. Run the functions of this script one by one.";
+ echo " ";
+ echo " 2. List all functions with the \"enumallfunctions\" call.";
+ echo " ";
+ echo " 3. After each functions' run, check if it completed successfully.";
+ echo " ";
+ echo " 4. For each function, you can ask for separate help by typing";
+ echo " \"<functionname> --help\"."
+ echo " ";
+ echo " 5. Often network conditions prevent the MS-RPC calls"
+ echo " implemented by Samba to succeed at the first attempt."
+ echo " You may have more joy if you try more than once or twice....";
+ echo " ";
+ echo " 6. I can not support end-users who have problems with this script."
+ echo " However, we are available for paid, professional consulting,"
+ echo " training and troubleshooting work.";
+ echo " ";
+ echo " ";
+fi
+}
+
+# -----------------------------------------------------------------------------
+# ----------- enumerate all builtin functions... ------------------------------
+# -----------------------------------------------------------------------------
+function enumallfunctions()
+{
+if stringinstring help "$@"; then
+helpwithvampiredrivers ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function enumallfunctions()..."
+ echo "=============================================="
+ echo -e " \n\
+
+ NOTE: run the listed functions in the same order as listed below.
+
+ EXAMPLE: \"knoppix@ttyp6[knoppix]$ helpwithvampiredrivers\"
+
+ HELP: the \"--help\" parameter prints usage hints regarding a function.
+
+ EXAMPLE: \"knoppix@ttyp6[knoppix]$ fetchenumdrivers3listfromNThost --help\"
+
+
+ function vampiredrivers_readme()
+ function enumallfunctions()
+ function helpwithvampiredrivers()
+ function fetchenumdrivers3listfromNThost() # repeat, if no success at first
+ function createdrivernamelist()
+ function createprinterlistwithUNCnames() # repeat, if no success at first
+ function createmapofprinterstodrivers()
+ function splitenumdrivers3list()
+ function makesubdirsforW32X86driverlist()
+ function splitW32X86fileintoindividualdriverfiles()
+ function fetchallW32X86driverfiles()
+ function uploadallW32X86drivers()
+ function makesubdirsforWIN40driverlist()
+ function splitWIN40fileintoindividualdriverfiles()
+ function fetchallWIN40driverfiles()
+ function uploadallWIN40drivers()"
+ echo " "
+fi
+}
+
+# this is a helperfunction (Thanks to Fabian Franz!)
+function stringinstring()
+{
+ case "$2" in *$1*)
+ return 0
+ ;;
+ esac
+ return 1
+}
+
+# -----------------------------------------------------------------------------
+# ----------- Create an "enumprinters 3" list --------------------- -----------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithfetchenumdrivers3listfromNThost()
+{
+echo -e " \n\
+################################################################################
+#
+# About fetchenumdrivers3listfromNThost()....
+# -------------------------------------------
+#
+# PRECONDITIONS: 1) This function expects write access to the current directory.
+# 2) This function expects to have the '\$nthosts',
+# '\$ntprinteradmin' and '\$ntadminpasswd' variables set to
+# according values.
+#
+# WHAT IT DOES: This function connects to the '\$nthost' (using the credentials
+# '\$ntprinteradmin' with '\$ntadminpasswd', retrieves a list of
+# drivers (with related file names) from that host, and saves the
+# list under the name of '\${nthost}/enumdrivers3list.txt' (ie. it
+# also creates the '\$nthost' subdirectory in the current one). It
+# further prints some more info to stdout.
+#
+# IF IT DOESN'T WORK: It may happen that the function doesn't work at the first
+# time (there may be a connection problem). Just repeat a
+# few times. It may work then. You will recognize if it
+# does.
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+#
+################################################################################"
+echo " "
+}
+
+# -----------------------------------------------------------------------------
+
+function fetchenumdrivers3listfromNThost()
+{
+if stringinstring help "$@"; then
+helpwithfetchenumdrivers3listfromNThost;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function fetchenumdrivers3listfromNThost"
+ echo "========================================================"
+ [ -d ${nthost} ] || mkdir "${nthost}";
+ rpcclient -U${ntprinteradmin}%${ntadminpasswd} -c 'enumdrivers 3' ${nthost} \
+ | sed -e '/^.*Driver Name: \[.*\]/ y/\//_/' \
+ | tee \
+ ${nthost}/enumdrivers3list.txt;
+
+ NUMBEROFDIFFERENTDRIVERNAMES=$( grep "Driver Name:" ${nthost}/enumdrivers3list.txt \
+ | sort -f \
+ | uniq \
+ | wc -l );
+
+ echo " ";
+ echo "--> Finished in running function fetchenumdrivers3listfromNThost....";
+ echo "===================================================================="
+ echo "NUMBEROFDIFFERENTDRIVERNAMES retrieved from \"${nthost}\" is $NUMBEROFDIFFERENTDRIVERNAMES".;
+ echo " --> If you got \"0\" you may want to try again. <---";
+ echo "================================================================";
+ echo " ";
+ enumdrivers3list=`cat ${nthost}/enumdrivers3list.txt`;
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# ----------- Create a list of all available drivers installed ----------------
+# ------------------------on the NT print server-------------------------------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithcreatedrivernamelist()
+{
+echo -e " \n\
+################################################################################
+#
+# About createdrivernamelist()...
+# -------------------------------
+#
+# PRECONDITIONS: 1) This function expects to find the subdirectory '\$nthost'
+# and the file '\${nthost}/enumdrivers3list.txt' to exist.
+# 2) This function expects to have the '\$nthosts' variable set
+# to an according value.
+#
+# WHAT IT DOES: This function dissects the '\${nthost}/enumdrivers3list.txt'
+# and creates other textfiles from its contents:
+# - '\${nthost}/drvrlst.txt'
+# - '\${nthost}/completedriverlist.txt'
+# and further prints some more info to stdout.
+#
+# HINT: The current value: 'nthost'=\"$nthost\"
+#
+################################################################################"
+}
+
+# -----------------------------------------------------------------------------
+
+function createdrivernamelist()
+{
+if stringinstring help "$@"; then
+helpwithcreatedrivernamelist;
+else
+ echo " ";
+ echo " ";
+ echo "--> Running now function createdrivernamelist....";
+ echo "=================================================";
+ cat ${nthost}/enumdrivers3list.txt \
+ | grep "Driver Name:" \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | tr / _ \
+ | sed -e 's/$/\"/' -e 's/^ */\"/' \
+ | tee \
+ ${nthost}/drvrlst.txt;
+ drvrlst=$(echo ${nthost}/drvrlst.txt);
+
+ cat ${nthost}/enumdrivers3list.txt \
+ | grep "Driver Name:" \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | sed -e 's/$/\"/' \
+ | cat -n \
+ | sed -e 's/^ */DRIVERNAME/' -e 's/\t/\="/' \
+ | tee \
+ ${nthost}/completedriverlist.txt;
+
+ NUMBEROFDRIVERS=`cat ${nthost}/completedriverlist.txt| wc -l`;
+ echo " ";
+ echo "--> Finished in running function createdrivernamelist....";
+ echo "==============================================================================="
+ echo "NUMBEROFDRIVERS retrieve-able from \"${nthost}\" is $NUMBEROFDRIVERS".;
+ echo " --> If you got \"0\" you may want to run \"fetchenumdrivers3listfromNThost\""
+ echo " again. <---";
+ echo "===============================================================================";
+ echo " ";
+ driverlist=`cat ${nthost}/completedriverlist.txt`;
+
+ # alternative method suggested by Fabian Franz:
+ # | awk 'BEGIN {n=1} { print "DRIVERNAME"n"=\""$0"\""; n=n+1 } '
+fi
+}
+
+
+
+# -----------------------------------------------------------------------------
+# ----------- Create a list of all available printers -------------------------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithcreateprinterlistwithUNCnames()
+{
+echo -e " \n\
+################################################################################
+#
+# About createprinterlistwithUNCnames()...
+# ----------------------------------------
+#
+# PRECONDITIONS: 1) This function expects write access to the current directory.
+# 2) This function expects to have the '\$nthost',
+# '\$ntprinteradmin' and '\$ntadminpasswd' variables set to
+# according values.
+#
+# WHAT IT DOES: This function connects to the '\$nthost' (using the credentials
+# '\$ntprinteradmin' with '\$ntadminpasswd'), retrieves a list of
+# printqueues (with associated driver names) from that host (with
+# the help of the 'rpcclient ... enumprinters' utility, and saves
+# it under name and path '\${nthost}/printerlistwithUNCnames.txt'
+# (ie. it also creates the '\$nthost' subdirectory in the current
+# one). It further prints some more info to stdout.
+#
+# IF IT DOESN'T WORK: It may happen that the function doesn't work at the first
+# time (there may be a connection problem). Just repeat a
+# few times. It may work then. You will recognize if it does.
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+#
+################################################################################"
+}
+
+# -----------------------------------------------------------------------------
+
+function createprinterlistwithUNCnames()
+{
+if stringinstring help "$@"; then
+helpwithcreateprinterlistwithUNCnames ;
+else
+ [ -d ${nthost} ] || mkdir -p ${nthost};
+ echo " "
+ echo " "
+ echo " "
+ echo "--> Running now function createprinterlistwithUNCnames()...."
+ echo "============================================================"
+ rpcclient -U"${ntprinteradmin}%${ntadminpasswd}" -c 'enumprinters' ${nthost} \
+ | grep "description:" \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | tee \
+ ${nthost}/printerlistwithUNCnames.txt;
+
+ NUMBEROFPRINTERS=`cat ${nthost}/printerlistwithUNCnames.txt| wc -l`;
+ echo " ";
+ echo "--> Finished in running function createprinterlistwithUNCnames....";
+ echo "=========================================================================="
+ echo "NUMBEROFPRINTERS retrieved from \"${nthost}\" is $NUMBEROFPRINTERS".;
+ echo " --> If you got \"0\" you may want to try again. <---";
+ echo "==========================================================================";
+ echo " ";
+ printerlistwithUNCnames=`cat ${nthost}/printerlistwithUNCnames.txt`;
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# ----------- Create a list of all printers which have (no) drivers -----------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithcreatemapofprinterstodrivers()
+{
+echo -e " \n\
+################################################################################
+#
+# About createmapofprinterdrivers()...
+# ------------------------------------
+#
+# PRECONDITIONS: 1) This function expects to find a subdirectory '\$nthost' and
+# the file '\${nthost}/printerlistwithUNCnames.txt' to exist.
+# 2) This functions expects to have the '\$nthosts' variable set
+# to an according value.
+#
+# WHAT IT DOES: This function dissects '\${nthost}/printerlistwithUNCnames.txt'
+# and creates some other textfiles from its contents:
+# - '\${nthost}/allprinternames.txt'
+# - '\${nthost}/alldrivernames.txt'
+# - '\${nthost}/allnonrawprinters.txt'
+# - '\${nthost}/allrawprinters.txt'
+# - '\${nthost}/printertodrivermap.txt'
+# and further prints some more info to stdout.
+#
+# HINT: You currently have defined: 'nthost'=\"$nthost\", which resolves above
+# mentioned paths to:
+# - '${nthost}/allprinternames.txt'
+# - '${nthost}/alldrivernames.txt'
+# - '${nthost}/allnonrawprinters.txt'
+# - '${nthost}/allrawprinters.txt'
+# - '${nthost}/printertodrivermap.txt'
+#
+################################################################################"
+}
+
+# -----------------------------------------------------------------------------
+
+function createmapofprinterstodrivers()
+{
+if stringinstring help "$@"; then
+helpwithcreatemapofprinterstodrivers ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function createmapofprinterstodrivers()...."
+ echo "==========================================================="
+ echo " "
+ echo " "
+ echo "ALL PRINTERNAMES:"
+ echo "================="
+ echo " "
+ cat ${nthost}/printerlistwithUNCnames.txt \
+ | awk -F "\\" '{ print $4 }' \
+ | awk -F "," '{print $1}' \
+ | sort -f \
+ | uniq \
+ | tee \
+ ${nthost}/allprinternames.txt;
+
+ echo " "
+ echo " "
+ echo "ALL non-RAW PRINTERS:"
+ echo "====================="
+ echo " "
+ cat ${nthost}/printerlistwithUNCnames.txt \
+ | grep -v ",," \
+ | awk -F "\\" '{ print $4 }' \
+ | awk -F "," '{print $1}' \
+ | sort -f \
+ | uniq \
+ | tee \
+ ${nthost}/allnonrawprinters.txt;
+
+ echo " "
+ echo " "
+ echo "ALL RAW PRINTERS:"
+ echo "================"
+ echo " "
+ cat ${nthost}/printerlistwithUNCnames.txt \
+ | grep ",," \
+ | awk -F "\\" '{ print $4 }' \
+ | awk -F "," '{print $1}' \
+ | sort -f \
+ | uniq \
+ | tee \
+ ${nthost}/allrawprinters.txt;
+
+ echo " "
+ echo " "
+ echo "THE DRIVERNAMES:"
+ echo "================"
+ cat ${nthost}/printerlistwithUNCnames.txt \
+ | awk -F "," '{print $2 }' \
+ | grep -v "^$" \
+ | tee \
+ ${nthost}/alldrivernames.txt;
+
+ echo " "
+ echo " "
+ echo "THE PRINTER-TO-DRIVER-MAP-FOR-non-RAW-PRINTERS:"
+ echo "==============================================="
+ cat ${nthost}/printerlistwithUNCnames.txt \
+ | awk -F "\\" '{ print $4 }' \
+ | awk -F "," '{ print "\"" $1 "\":\"" $2 "\"" }' \
+ | grep -v ":\"\"$" \
+ | tee \
+ ${nthost}/printertodrivermap.txt
+ echo -e "##########################\n# printer:driver #" >> ${nthost}/printertodrivermap.txt
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# ----------- Create a list of all printers which have drivers ----------------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithgetdrivernamelist()
+{
+echo -e " \n\
+################################################################################
+#
+# About getdrivernamelist()...
+# ----------------------------
+#
+# PRECONDITIONS: 1) This function expects to find the subdirectory '\$nthost\'
+# otherwise it creates it...
+#
+# WHAT IT DOES: This function creates the '\${nthost}/printernamelist.txt'
+# and also prints it to <stdout>. To do so, it must contact the
+# '\$nthost' via rpcclient (which in turn needs '\$ntprinteradmin'
+# '\$ntadminpasswd' to log in....).
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+# which resolves above mentioned path to:
+# - '${nthost}/printernamelist.txt'
+#
+################################################################################"
+}
+
+# -----------------------------------------------------------------------------
+
+function getdrivernamelist()
+{
+if stringinstring help "$@"; then
+helpwithgetdrivernamelist ;
+else
+ [ -d ${nthost} ] || mkdir -p ${nthost};
+ echo " "
+ echo " "
+ echo "--> Running now function getdrivernamelist()...."
+ echo "================================================"
+ rpcclient -U${ntprinteradmin}%${ntadminpasswd} -c 'enumprinters' ${nthost} \
+ | grep "description:" \
+ | grep -v ",," \
+ | awk -F "," '{ print $2 }' \
+ | sort -f \
+ | uniq \
+ | tee \
+ ${nthost}/drivernamelist.txt
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# ----------- Split the driverfile listing between the architectures ----------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithsplitenumdrivers3list()
+{
+echo -e " \n\
+################################################################################
+#
+# About splitenumdrivers3list()...
+# --------------------------------
+#
+# PRECONDITIONS: 1) This function expects write access to the current directory
+# and its subdirs '\$nthost/*'.
+# 2) This function expects to have the '\$nthost' variable set to
+# the according value.
+#
+# WHAT IT DOES: This function dissects the '\$nthost/enumdrivers3list.txt'
+# (using "sed", "cat", "awk" and "grep"). It splits the list up
+# into two different files representing a complete list of drivers
+# and files for each of the 2 supported architectures. It creates
+# '\${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt'
+# and '\${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt'.
+#
+# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" may not
+# have been run successfully. This is a precondition for
+# the current function.
+#
+# HINT: You currently have defined: 'nthost'=\"$nthost\", which resolves above
+# mentioned paths to:
+# - '${nthost}/WIN40/${nthost}-enumdrivers3list-NTx86.txt'
+# - '${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt'
+#
+################################################################################"
+}
+
+# -----------------------------------------------------------------------------
+
+function splitenumdrivers3list()
+{
+if stringinstring help "$@"; then
+helpwithsplitenumdrivers3list ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function splitenumdrivers3list()...."
+ echo "===================================================="
+
+ [ -d ${nthost}/WIN40 ] || mkdir -p ${nthost}/WIN40;
+ [ -d ${nthost}/W32X86 ] || mkdir -p ${nthost}/W32X86;
+
+ cat ${nthost}/enumdrivers3list.txt \
+ | sed -e '/^\[Windows NT x86\]/,$ d' \
+ | tee \
+ ${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt ;
+
+ cat ${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt \
+ | grep Version \
+ | sort -f \
+ | uniq \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | tee ${nthost}/WIN40/availableversionsWIN40.txt ;
+
+# cd ${nthost}/WIN40/ ;
+# mkdir $( cat availableversionsWIN40.txt ) 2> /dev/null ;
+# cd - ;
+
+ cat ${nthost}/enumdrivers3list.txt \
+ | sed -e '/^\[Windows NT x86\]/,$! d' \
+ | tee \
+ ${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt ;
+
+ cat ${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt \
+ | grep Version \
+ | sort -f \
+ | uniq \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | tee ${nthost}/W32X86/availableversionsW32X86.txt ;
+
+# cd ${nthost}/W32X86/ ;
+# mkdir $( cat availableversionsW32X86.txt ) 2> /dev/null ;
+# cd - ;
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# ---------- Make subdirs in ./${sambahost}/WIN40/ for each driver.... -------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithmakesubdirsforWIN40driverlist()
+{
+echo -e " \n\
+################################################################################
+#
+# About makesubdirsforWIN40driverlist() and makesubdirsforWIN40driverlist ()...
+# -----------------------------------------------------------------------------
+#
+# PRECONDITIONS: 1) These functions expect write access to the current directory
+# 2) These functions expect to have the '\$nthost' variable set
+# to the according value.
+# 3) These functions expect to find the two files
+# '\${nthost}/WIN40/\${nthost}-enumdrivers3list-WIN40.txt' and
+# '\${nthost}/W32X86/\${nthost}-enumdrivers3list-NTx86.txt' to
+# work on.
+#
+# WHAT IT DOES: These functions dissect the '$nthost/enumdrivers3list.txt'
+# (using "sed", "cat", "awk" and "grep"). They split the input
+# files up into individual files representing driver(version)s and
+# create appropriate subdirectories for each driver and version
+# underneath './\$nthost/<architecture>'. They use the drivernames
+# (including spaces) for the directory names. ("/" -- slashes --
+# in drivernames are converted to underscores).
+#
+# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" and
+# consecutive ones may not have been run successfully. This
+# is a precondition for the current function.
+#
+# HINT: You currently have defined: 'nthost'=\"$nthost\", which resolves above
+# mentioned paths to:
+# - '\${nthost}/WIN40/\${nthost}-enumdrivers3list-NTx86.txt'
+# - '\${nthost}/W32X86/\${nthost}-enumdrivers3list-NTx86.txt'
+#
+################################################################################
+# ............PRESS \"q\" TO QUIT............" \
+|less
+}
+
+# -----------------------------------------------------------------------------
+
+function makesubdirsforWIN40driverlist()
+{
+if stringinstring help "$@"; then
+helpwithmakesubdirsforWIN40driverlist ;
+else
+ cat ${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt \
+ | grep "Driver Name:" \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | tr / _ \
+ | sed -e 's/$/\"/' \
+ | sed -e 's/^/mkdir -p '"\"${nthost}"'\/WIN40\//' \
+ | tee \
+ ${nthost}/makesubdirsforWIN40driverlist.txt;
+
+ sh -x ${nthost}/makesubdirsforWIN40driverlist.txt;
+
+# rm ${nthost}/makesubdirsforWIN40driverlist.txt;
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# ---------- Make subdirs in ./${sambahost}/W32X86/ for each driver.... -------
+# -----------------------------------------------------------------------------
+#
+
+function makesubdirsforW32X86driverlist()
+{
+if stringinstring help "$@"; then
+helpwithvampiredrivers ;
+else
+ cat ${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt \
+ | grep "Driver Name:" \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | tr / _ \
+ | sed -e 's/$/\"/' \
+ | sed -e 's/^ */mkdir '\""${nthost}"'\/W32X86\//' \
+ | tee \
+ ${nthost}/makesubdirsforW32X86driverlist.txt;
+
+ sh -x ${nthost}/makesubdirsforW32X86driverlist.txt;
+
+# rm ${nthost}/makesubdirsforW32X86driverlist.txt;
+fi
+}
+
+
+
+
+# -----------------------------------------------------------------------------
+# ----------- Split the WIN40 driverfile listing of each architecture ---------
+# ------------------------ into individual drivers ----------------------------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithmakesubdirsforWIN40driverlist()
+{
+echo -e " \n\
+################################################################################
+#
+# About splitWIN40fileintoindividualdriverfiles() and
+# splitW32X86fileintoindividualdriverfiles()...
+# ---------------------------------------------------
+#
+# PRECONDITIONS: 1) These functions expect write access to the current directory
+# and its subdirs '\$nthost/*/'.
+# 2) These functions expect to have the '\$nthost' variable set
+# to the according value.
+# 3) These functions expect to find the two files
+# '\${nthost}/WIN40/\${nthost}-enumdrivers3list-WIN40.txt' and
+# '\${nthost}/W32X86/\${nthost}-enumdrivers3list-NTx86.txt' to
+# work on.
+#
+# WHAT IT DOES: 1) These functions create a directory for each printer driver.
+# The directory name is identical to the driver name.
+# 2) For each supported driver version (\"0\", \"2\" and \"3\") it
+# creates a subdirectory as required underneath
+# './\$nthost/<architecture>'.
+# 3) The directories use the drivernames (including spaces) for
+# their names. ("/" - slashes - in drivernames are converted to
+# underscores).
+# 4) In each subdirectory they dissect the original
+# '\$nthost/enumdrivers3list.txt' (using "sed", "cat", "awk"
+# and "grep") and store that part describing the related driver
+# (under the name \"driverfilesversion.txt\".
+# 5) For each driver the files \"Drivername\", \"DriverPath\",
+# \"Drivername\", \"Configfile\", \"Helpfile\", \"AllFiles\" and
+# \"Dependentfilelist\" are stored in the according directory
+# which hold contend that is used by other (downstream)
+# functions.
+# 6) It creates a file named \"AllFilesIAskFor\" which holds the
+# case sensitive names of files it wanted to download. It also
+# creates a file named \"AllFilesIGot\" which holds the case
+# sensitive spelling of the downloaded files. (Due to
+# Microsoft's ingenious file naming tradition, you may have
+# asked for a \"PS5UI.DLL\" but gotten a \"ps5ui.dll\".
+# 7) The 2 files from 6) will be later compared with the help of
+# the \"sdiff\" utility to decide how to re-name the files so
+# that the subsequent driver upload command's spelling
+# convention is met.
+#
+# IF IT DOESN'T WORK: The function \"fetchenumdrivers3listfromNThost\" and
+# consecutive ones may not have been run successfully. This
+# is a precondition for the current function.
+#
+# HINT: You currently have defined: 'nthost'=\"$nthost\".
+#
+################################################################################
+# ............PRESS \"q\" TO QUIT............" \
+|less
+}
+
+# -----------------------------------------------------------------------------
+
+function splitWIN40fileintoindividualdriverfiles()
+{
+if stringinstring help "$@"; then
+helpwithmakesubdirsforWIN40driverlist ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function splitWIN40fileintoindividualdriverfiles()..."
+ echo "====================================================================="
+
+ for i in ${nthost}/WIN40/*/; do
+ CWD1="$( pwd )" ;
+ cd "${i}" ;
+ echo " "
+ echo " "
+ echo " ###########################################################################################"
+ echo " "
+ echo " Next driver is \"$( basename "$( pwd)" )\""
+ echo " "
+ echo " ###########################################################################################"
+
+##### echo "yes" | cp -f ../../../${nthost}/WIN40/${nthost}-enumdrivers3list-WIN40.txt . 2> /dev/null ;
+ ln -s -f ../${nthost}-enumdrivers3list-WIN40.txt ${nthost}-enumdrivers3list-WIN40.lnk ;
+
+ tac ${nthost}-enumdrivers3list-WIN40.lnk \
+ | sed -e '/'"$(basename "$(echo "$PWD")")"'/,/Version/ p' -n \
+ | grep Version \
+ | uniq \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print "mkdir \"" $1 "\"" }' \
+ | tee mkversiondir.txt ;
+
+ sh mkversiondir.txt 2> /dev/null ;
+
+ cat ${nthost}-enumdrivers3list-WIN40.lnk \
+ | sed -e '/\['"$(basename "$(echo "$PWD")")"'\]/,/Monitor/ w alldriverfiles.txt' -n ;
+
+ for i in */; do
+ CWD2="$( pwd )" ;
+ cd "${i}";
+ echo "yes" | cp ../alldriverfiles.txt . 2> /dev/null ;
+
+ cat alldriverfiles.txt \
+ | egrep '(\\'"$(basename "$( pwd )")"'\\|Driver Name)' \
+ | tee driverfilesversion.txt ;
+
+ Drivername=$( grep "Driver Name:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | tee Drivername ) ;
+
+ DriverPath=$( grep "Driver Path:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "WIN40" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${DriverPath}" \
+ | tee DriverPath ;
+
+ Datafile=$( grep "Datafile:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "WIN40" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${Datafile}" \
+ | tee Datafile ;
+
+ Configfile=$( grep "Configfile:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "WIN40" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${Configfile}" \
+ | tee Configfile ;
+
+ Helpfile=$( grep "Helpfile:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "WIN40" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${Helpfile}" \
+ | tee Helpfile ;
+
+ Dependentfilelist=$( grep "Dependentfiles:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "WIN40" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+
+ Dependentfiles=$( echo $Dependentfilelist \
+ | sed -e 's/ /,/g ' ) ;
+
+ echo "${Dependentfiles}" \
+ | tee Dependentfiles
+
+ AllFiles=$( echo ${Dependentfilelist}; echo ${Helpfile}; echo ${Configfile}; echo ${Datafile}; echo ${DriverPath} );
+
+ echo "${AllFiles}" \
+ | sort -f \
+ | uniq \
+ | tee AllFiles ;
+
+ for i in $( cat AllFiles ); do echo ${i}; done \
+ | sort -f \
+ | uniq \
+ | tee AllFilesIAskFor ;
+
+ cd "${CWD2}" 1> /dev/null ;
+ done
+
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "adddriver \"${Architecture}\" \"${DriverName}:${DriverPath}:${Datafile}:${Configfile}:${Helpfile}:NULL:RAW:${Dependentfiles}\" ${Version}" \ ${smbhost}
+
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setdriver \"${printername}\" \"${DriverName}\"" \
+# ${smbhost}
+#
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (utilized by Kurt Pfeifle\'s set of \"Vampire Printerdrivers\" scripts from Linux)\"" \
+# ${smbhost}
+
+ cd "${CWD1}" 1> /dev/null ;
+ done;
+fi
+}
+
+
+
+
+# -----------------------------------------------------------------------------
+# ---------- Split the W32X86 driverfile listing of each architecture ---------
+# ------------------------ into individual drivers ----------------------------
+# -----------------------------------------------------------------------------
+#
+
+function splitW32X86fileintoindividualdriverfiles()
+{
+if stringinstring help "$@"; then
+helpwithmakesubdirsforWIN40driverlist ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function splitW32X86fileintoindividualdriverfiles()..."
+ echo "======================================================================"
+
+ for i in ${nthost}/W32X86/*/; do
+ CWD1="$( pwd )" ;
+ cd "${i}" ;
+ echo " "
+ echo " "
+ echo " ###########################################################################################"
+ echo " "
+ echo " Next driver is \"$( basename "$( pwd)" )\""
+ echo " "
+ echo " ###########################################################################################"
+
+###### echo "yes" | cp -f ../../../${nthost}/W32X86/${nthost}-enumdrivers3list-NTx86.txt . 2> /dev/null ;
+ ln -s -f ../${nthost}-enumdrivers3list-NTx86.txt ${nthost}-enumdrivers3list-NTx86.lnk ;
+
+ tac ${nthost}-enumdrivers3list-NTx86.lnk \
+ | sed -e '/'"$(basename "$(echo "$PWD")")"'/,/Version/ p' -n \
+ | grep Version \
+ | uniq \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print "mkdir \"" $1 "\"" }' \
+ | tee mkversiondir.txt ;
+
+ sh mkversiondir.txt 2> /dev/null ;
+
+ cat ${nthost}-enumdrivers3list-NTx86.lnk \
+ | sed -e '/\['"$(basename "$(echo "$PWD")")"'\]/,/Monitor/ w alldriverfiles.txt' -n ;
+
+ for i in */; do
+ CWD2="$( pwd )" ;
+ cd "${i}";
+ echo "yes" | cp ../alldriverfiles.txt . 2> /dev/null ;
+
+ cat alldriverfiles.txt \
+ | egrep '(\\'"$(basename "$( pwd )")"'\\|Driver Name)' \
+ | tee driverfilesversion.txt ;
+
+ Drivername=$( grep "Driver Name:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | sort -f \
+ | uniq \
+ | tee Drivername ) ;
+# echo "${Drivername}" \
+# | tee Drivername ;
+
+
+ DriverPath=$( grep "Driver Path:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "W32X86" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${DriverPath}" \
+ | tee DriverPath ;
+
+ Datafile=$( grep "Datafile:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "W32X86" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${Datafile}" \
+ | tee Datafile ;
+
+ Configfile=$( grep "Configfile:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "W32X86" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${Configfile}" \
+ | tee Configfile ;
+
+ Helpfile=$( grep "Helpfile:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "W32X86" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+ echo "${Helpfile}" \
+ | tee Helpfile ;
+
+ Dependentfilelist=$( grep "Dependentfiles:" driverfilesversion.txt \
+ | awk -F "[" '{ print $2 }' \
+ | awk -F "]" '{ print $1 }' \
+ | awk -F "W32X86" '{ print $2 }' \
+ | awk -F "\\" '{ print $3 }' \
+ | sort -f \
+ | uniq ) ;
+
+ Dependentfiles=$( echo $Dependentfilelist \
+ | sed -e 's/ /,/g ' ) ;
+
+ echo "${Dependentfiles}" \
+ | tee Dependentfiles
+
+ AllFiles=$( echo ${Dependentfilelist}; echo ${Helpfile}; echo ${Configfile}; echo ${Datafile}; echo ${DriverPath} ) ;
+
+ echo "${AllFiles}" \
+ | sort -f \
+ | uniq \
+ | tee AllFiles ;
+
+ for i in $( cat AllFiles ); do echo ${i}; done \
+ | sort -f \
+ | uniq \
+ | tee AllFilesIAskFor ;
+
+ cd "${CWD2}" 1> /dev/null ;
+ done
+
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "adddriver \"${Architecture}\" \"${DriverName}:${DriverPath}:${Datafile}:${Configfile}:${Helpfile}:NULL:RAW:${Dependentfiles}\" ${Version}" \ ${smbhost}
+
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setdriver \"${printername}\" \"${DriverName}\"" \
+# ${smbhost}
+#
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (utilized by Kurt Pfeifle\'s set of \"Vampire Printerdrivers\" scripts from Linux)\"" \
+# ${smbhost}
+
+ cd "${CWD1}" 1> /dev/null ;
+ done;
+fi
+}
+
+
+
+# -----------------------------------------------------------------------------
+# ------------------ First download the driverfiles........... ----------------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithfetchallW32X86driverfiles()
+{
+echo -e " \n\
+################################################################################
+#
+# About fetchallW32X86driverfiles()...
+# ------------------------------------
+#
+# PRECONDITIONS: 1) This function expects to have the \'\$nthost\' variable set
+# to the according value.
+# 2) This function expects to find files \"AllFiles\",
+# \"AllFilesIAskFor\", and \"AllFilesIGot\" in the directories
+# \'\${nthost}/<architecture>/<drivername>/<version>/\'.
+#
+# WHAT IT DOES: These functions use \"smbclient\" to connect to the NT print
+# server \"\$nthost\" and download the printer driver files from
+# there. To achieve that in an orderly fashion, the previously
+# created subdirectories (named like the drivers to fetch) are
+# visited in turn and the related files are downloaded for each
+# driver/directory.
+#
+# IF IT DOESN'T WORK: The function \"fetchenumdrivers3listfromNThost\" and
+# consecutive ones may not have been run successfully. This
+# is a precondition for the current function.
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+#
+################################################################################"
+}
+
+# -----------------------------------------------------------------------------
+
+function fetchallW32X86driverfiles()
+{
+if stringinstring help "$@"; then
+helpwithfetchallW32X86driverfiles ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function fetchallW32X86driverfiles()...."
+ echo "========================================================"
+
+ CURRENTWD=${PWD} ;
+ for i in ${nthost}/W32X86/*/*/ ; do \
+ cd "${i}";
+
+ driverversion="$(basename "$(echo "$PWD")")" ;
+ echo "$(basename "$(echo "$PWD")")" > driverversion ;
+
+ AllFiles=$( cat AllFiles ) ;
+
+ [ -d TheFiles ] || mkdir TheFiles;
+
+ cd TheFiles;
+
+ echo " "
+ echo "===================================================="
+ echo "Downloading files now to ${PWD}....";
+ echo "===================================================="
+ echo " "
+
+ # Fetch the Driver files from the Windoze box (printserver)
+ smbclient -U"${ntprinteradmin}%${ntadminpasswd}" -d 2 \
+ //${nthost}/print\$ -c \
+ "cd W32X86\\${driverversion};prompt;mget ${AllFiles}"
+
+ ls -1 \
+ | sort -f \
+ | uniq \
+ | tee ../AllFilesIGot ;
+
+ cd ${CURRENTWD} ;
+
+ done ;
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# -------------- Now upload the driverfiles and activate them! ----------------
+# Upload files into root "Architecture" directory of Samba'a [print$] share...
+# -----------------------------------------------------------------------------
+#
+
+function helpwithuploadallW32X86drivers()
+{
+echo -e " \n\
+################################################################################
+#
+# About uploadallW32X86drivers()...
+# ---------------------------------
+#
+# PRECONDITIONS: 1) This function expects to have the '\$nthost',
+# '\$ntprinteradmin' and '\$ntadminpasswd' variables set to
+# according values.
+# 2) This function expects to find the files \"AllFiles\",
+# \"AllFilesIGot\" and \"AllFilesIAskFor\" in the
+# \"\${nthost}/W32X86<drivername>/<driverversion>/TheFiles\"
+# subdirectory.
+#
+# WHAT IT DOES: This function uses "smbclient" to connect to the new Samba print
+# server "\$nthost" and upload the printer driver files into the
+# \"[print\$]\" share there. To achieve that in orderly fashion,
+# the previously created subdirectories (named like the drivers
+# fetched previously from \$smbhost) are visited in turn and the
+# related files are uploaded for each driver/directory. For this
+# to really succeed, the files \"AllFilesIGot\" and \"AllFilesIAskFor\"
+# are compared with the help of the \"sdiff\" utility to decide
+# how to re-name the mis-matching filenams, so that the used
+# driver upload command's spelling convention is met....
+#
+# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" and
+# consecutive ones may not have been run successfully. This
+# is a precondition for the current function.
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+#
+################################################################################
+# ............PRESS \"q\" TO QUIT............" \
+|less
+}
+
+# -----------------------------------------------------------------------------
+
+function uploadallW32X86drivers()
+{
+if stringinstring help "$@"; then
+helpwithuploadallW32X86drivers ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function uploadallW32X86drivers()...."
+ echo "====================================================="
+
+ for i in ${nthost}/W32X86/*/*/; do \
+ CURRENTWD=${PWD} ;
+ cd "${i}" ;
+ # we are now in [..]/W32X86/[drvrname]/[2|3]/
+
+ driverversion="$(basename "$(echo "$PWD")")" ;
+
+ echo "$(basename "$(echo "$PWD")")" > driverversion ;
+
+ cd TheFiles ;
+ # we are now in [..]/W32X86/[drvrname]/[2|3]/TheFiles
+ echo " "
+ echo "===================================================="
+ echo "Uploading driverfiles now from ${PWD}....";
+ echo "===================================================="
+ echo " "
+ set -x ;
+
+ smbclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \
+ //${smbhost}/print\$ \
+ -c "mkdir W32X86;cd W32X86;prompt;mput $( cat ../AllFilesIGot )";
+
+ cd .. ;
+ # we are now in [..]/W32X86/[drvrname]/[2|3]/
+
+# Now tell Samba that those files are *printerdriver* files....
+# The "adddriver" command will move them to the "0" subdir and create or
+# update the associated *.tdb files (faking the MS Windows Registry on Samba)
+ Drivername="$( cat Drivername )"
+
+ set -x ;
+ [ x"$( cat Dependentfiles)" == x"" ] && echo NULL > Dependentfiles;
+
+ sdiff -s AllFilesIGot AllFilesIAskFor \
+ | tee sdiff-of-Requested-and-Received.txt ;
+
+ [ -s sdiff-of-Requested-and-Received.txt ] \
+ || rm -f sdiff-of-Requested-and-Received.txt \
+ && cat sdiff-of-Requested-and-Received.txt > ../sdiff-of-Requested-and-Received.txt ;
+
+ cat sdiff-of-Requested-and-Received.txt \
+ | sed -e 's/^/mv /' \
+ | sed -e 's/ *|/ /' \
+ | tee rename-Received-to-Requested-case.txt ;
+
+ sh -x rename-Received-to-Requested-case.txt ;
+
+ mv rename-Received-to-Requested-case.txt rename-Received-to-Requested-case.done ;
+
+ echo " ################ B E G I N DEBUGGING STATEMENT ############"
+ echo "rpcclient -U\"${smbprinteradmin}%${smbadminpasswd}\" -d 2 \
+ -c \'adddriver \"Windows NT x86\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \
+ ${smbhost} \' ;
+ echo " ################ E N D DEBUGGING STATEMENT ################"
+
+ rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \
+ -c "adddriver \"Windows NT x86\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \
+ ${smbhost} ;
+
+ set +x ;
+
+ cd ${CURRENTWD} ;
+ # we are now back to where we started
+ done;
+ set +x ;
+fi
+}
+
+# Now tell Samba which printqueue this driver is associated with....
+# The "setdriver" command will do just that and create or
+# update the associated *.tdb files (faking the MS Windows Registry on Samba)
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setdriver \"${printername}\" \"${DriverName}\"" \
+# ${smbhost}
+# -- NOT YET IMPLEMENTED IN THIS SCRIPT ---
+#
+
+# Now set a nice printer comment and let the world know what we've done
+# (or not.... ;-)
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (rpcclient commandline from Linux)\"" \
+# ${smbhost}
+# -- NOT YET IMPLEMENTED IN THIS SCRIPT ---
+#
+
+
+# -----------------------------------------------------------------------------
+# ------------------ First download the driverfiles........... ----------------
+# -----------------------------------------------------------------------------
+#
+
+function helpwithfetchallWIN40driverfiles()
+{
+echo -e " \n\
+################################################################################
+#
+# About fetchallWIN40driverfiles()...
+# -----------------------------------
+#
+# PRECONDITIONS: 1) This function expects to have the \$nthost variable set to
+# the according value.
+# 2) This function expects to find the \"AllFiles\" file in
+# \"\${nthost}/WIN40<drivername>/<driverversion>/TheFiles\".
+#
+# WHAT IT DOES: These functions use "smbclient" to connect to the NT print server
+# "\$nthost" and download the printer driver files from there. To
+# achieve that in an orderly fashion, the previously created
+# subdirectories (named like the drivers to fetch) are visited in
+# turn and the related files are downloaded for each
+# driver/directory.
+#
+# IF IT DOESN'T WORK: The function "fetchenumdrivers3listfromNThost" and
+# consecutive ones may not have been run successfully. This
+# is a precondition for the current function.
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+#
+################################################################################
+# ............PRESS \"q\" TO QUIT............" \
+|less
+}
+
+# -----------------------------------------------------------------------------
+
+function fetchallWIN40driverfiles()
+{
+if stringinstring help "$@"; then
+helpwithfetchallWIN40driverfiles ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function fetchallWIN40driverfiles()...."
+ echo "======================================================="
+
+ CURRENTWD=${PWD} ;
+
+ for i in ${nthost}/WIN40/*/*/; do \
+ cd "${i}";
+
+ driverversion="$(basename "$(echo "$PWD")")" ;
+ echo "$(basename "$(echo "$PWD")")" > driverversion ;
+
+ AllFiles=$( cat AllFiles ) ;
+
+ [ -d TheFiles ] || mkdir TheFiles;
+
+ cd TheFiles;
+
+ echo " "
+ echo "===================================================="
+ echo "Downloading files now to ${PWD}....";
+ echo "===================================================="
+ echo " "
+
+ # Fetch the Driver files from the Windoze box (printserver)
+ smbclient -U"${ntprinteradmin}%${ntadminpasswd}" -d 2 \
+ //${nthost}/print\$ -c \
+ "cd WIN40\\${driverversion};prompt;mget ${AllFiles}" ;
+
+ ls -1 \
+ | sort -f \
+ | uniq \
+ | tee ../AllFilesIGot ;
+
+ cd ${CURRENTWD} ;
+
+ done ;
+fi
+}
+
+
+# -----------------------------------------------------------------------------
+# -------------- Now upload the driverfiles and activate them! ----------------
+# Upload files into root "Architecture" directory of Samba'a [print$] share...
+# -----------------------------------------------------------------------------
+#
+
+function helpwithuploadallWIN40drivers()
+{
+echo -e " \n\
+################################################################################
+#
+# About uploadallWIN40drivers()...
+# --------------------------------
+#
+# PRECONDITIONS: 1) This function expects to have '\$smbhost', '\$smbprinteradmin'
+# and '\$smbadminpasswd' variables set to according values.
+# 2) This function expects to find \"AllFiles\", \"AllFilesIGot\"
+# and \"AllFilesIAskFor\" in the subdirectory
+# \"\${nthost}/WINI40/<drivername>/<driverversion>/TheFiles\".
+#
+# WHAT IT DOES: These function uses \"smbclient\" to connect to the new Samba
+# print server "\$nthost" and upload the printer driver files into
+# the \"[print\$]\" share there.
+# To achieve that in an orderly fashion, the previously created
+# subdirectories (named like the drivers fetched previously from
+# \$smbhost) are visited in turn and the related files are
+# uploaded for each driver/directory.
+# For this to really succeed, \"AllFilesIGot\" and \"AllFilesIAskFor\"
+# are compared with the help of the \"sdiff\" utility to decide
+# how to re-name the mis-matching filenams, so that the used
+# driver upload command's spelling convention is met....
+#
+# IF IT DOESN'T WORK: The function \"fetchenumdrivers3listfromNThost\" and
+# consecutive ones may not have been run successfully. This
+# is a precondition for the current function.
+#
+# HINT: The current values: 'nthost'=\"$nthost\"
+# 'ntprinteradmin'=\"$ntprinteradmin\"
+# 'ntadminpasswd'=<not shown here, check yourself!>
+#
+################################################################################
+# ............PRESS \"q\" TO QUIT............" \
+|less
+}
+function uploadallWIN40drivers()
+{
+if stringinstring help "$@"; then
+helpwithuploadallWIN40drivers ;
+else
+ echo " "
+ echo " "
+ echo "--> Running now function uploadallWIN40drivers()...."
+ echo "===================================================="
+
+ for i in ${nthost}/WIN40/*/*/; do \
+ CURRENTWD=${PWD} ;
+ cd "${i}" ;
+ # we are now in [..]/WIN40/[drvrname]/[0]/
+
+ driverversion="$(basename "$(echo "$PWD")")" ;
+
+ echo "$(basename "$(echo "$PWD")")" > driverversion ;
+
+ cd TheFiles ;
+ # we are now in [..]/WIN40/[drvrname]/[0]/TheFiles
+ echo " "
+ echo "===================================================="
+ echo "Uploading driverfiles now from ${PWD}....";
+ echo "===================================================="
+ echo " "
+ set -x ;
+
+ smbclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \
+ //${smbhost}/print\$ \
+ -c "mkdir WIN40;cd WIN40;prompt;mput $( cat ../AllFilesIGot )";
+
+ cd .. ;
+ # we are now in [..]/WIN40/[drvrname]/[0]/
+
+# Now tell Samba that those files are *printerdriver* files....
+# The "adddriver" command will move them to the "0" subdir and create or
+# update the associated *.tdb files (faking the MS Windows Registry on Samba)
+ Drivername="$( cat Drivername )"
+
+ set -x ;
+ [ x"$( cat Dependentfiles)" == x"" ] && echo NULL > Dependentfiles;
+
+ sdiff -s AllFilesIGot AllFilesIAskFor \
+ | tee sdiff-of-Requested-and-Received.txt ;
+
+ [ -s sdiff-of-Requested-and-Received.txt ] \
+ || rm -f sdiff-of-Requested-and-Received.txt \
+ && cat sdiff-of-Requested-and-Received.txt > ../sdiff-of-Requested-and-Received.txt ;
+
+ cat sdiff-of-Requested-and-Received.txt \
+ | sed -e 's/^/mv /' \
+ | sed -e 's/ *|/ /' \
+ | tee rename-Received-to-Requested-case.txt ;
+
+ sh -x rename-Received-to-Requested-case.txt ;
+
+ mv rename-Received-to-Requested-case.txt rename-Received-to-Requested-case.done ;
+
+ echo " ################ DEBUGGING STATEMENT "
+ echo "rpcclient -U\"${smbprinteradmin}%${smbadminpasswd}\" -d 2 \
+ -c \'adddriver \"Windows NT x86\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \
+ ${smbhost}\' ;
+ echo " ################ DEBUGGING STATEMENT "
+
+ rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" -d 2 \
+ -c "adddriver \"Windows 4.0\" \"$( cat Drivername ):$( cat DriverPath ):$( cat Datafile ):$( cat Configfile ):$( cat Helpfile ):NULL:RAW:$( cat Dependentfiles )\" $( cat driverversion )" \
+ ${smbhost} ;
+
+ set +x ;
+ cd ${CURRENTWD} ;
+ # we are now back to where we started
+ done;
+fi
+}
+
+# Now tell Samba which printqueue this driver is associated with....
+# The "setdriver" command will do just that and create or
+# update the associated *.tdb files (faking the MS Windows Registry on Samba)
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setdriver \"${printername}\" \"${DriverName}\"" \
+# ${smbhost}
+# -- NOT YET IMPLEMENTED IN THIS SCRIPT ---
+#
+# Now set a nice printer comment and let the world know what we've done
+# (or not.... ;-)
+# rpcclient -U"${smbprinteradmin}%${smbadminpasswd}" \
+# -c "setprinter \"${printername}\" \"Driver was installed and set via MS-RPC (rpcclient commandline from Linux)\"" \
+# ${smbhost}
+# -- NOT YET IMPLEMENTED IN THIS SCRIPT ---
+#
+
+
+#source ${0} ;
+
+enumallfunctions;
diff --git a/examples/printing/prtpub.c b/examples/printing/prtpub.c
new file mode 100644
index 0000000..2839940
--- /dev/null
+++ b/examples/printing/prtpub.c
@@ -0,0 +1,237 @@
+/*
+ * Set printer capabilities in DsDriver Keys on remote printer
+ * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* This needs to be defined for certain compilers */
+#define WINVER 0x0500
+
+#include <tchar.h>
+#include <windows.h>
+#include <stdio.h>
+
+#define SAMBA_PORT _T("Samba")
+
+TCHAR *PrintLastError(void)
+{
+ static TCHAR msgtxt[1024*sizeof(TCHAR)];
+
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, GetLastError(),
+ 0, msgtxt, 0, NULL);
+
+ return msgtxt;
+}
+
+void map_orientation(HANDLE ph, TCHAR *printer, TCHAR *port)
+{
+ DWORD rot;
+ TCHAR portrait_only[] = _T("PORTRAIT\0");
+ TCHAR both[] = _T("LANDSCAPE\0PORTRAIT\0");
+
+ /* orentation of 90 or 270 indicates landscape supported, 0 means it isn't */
+ rot = DeviceCapabilities(printer, port, DC_BINNAMES, NULL, NULL);
+
+ printf("printOrientationsSupported:\n");
+
+ if (rot) {
+ printf("\tPORTRAIT\n\tLANDSCAPE\n");
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printOrientationsSupported"), REG_MULTI_SZ,
+ both, sizeof(both));
+ } else {
+ printf("\tPORTRAIT\n");
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printOrientationsSupported"), REG_MULTI_SZ,
+ portrait_only, sizeof(portrait_only));
+ }
+}
+
+void map_resolution(HANDLE ph, TCHAR *printer, TCHAR *port)
+{
+ DWORD num, *res, maxres = 0, i;
+
+ num = DeviceCapabilities(printer, port, DC_ENUMRESOLUTIONS, NULL, NULL);
+ if ((DWORD) -1 == num)
+ return;
+ res = malloc(num*2*sizeof(DWORD));
+ num = DeviceCapabilities(printer, port, DC_ENUMRESOLUTIONS, (BYTE *) res, NULL);
+ for (i=0; i < num*2; i++) {
+ maxres = (res[i] > maxres) ? res[i] : maxres;
+ }
+ printf("printMaxResolutionSupported: %d\n", maxres);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMaxResolutionSupported"), REG_DWORD,
+ (BYTE *) &maxres, sizeof(maxres));
+}
+
+void map_extents(HANDLE ph, TCHAR *printer, TCHAR *port)
+{
+ DWORD extentval, xval, yval;
+
+ extentval = DeviceCapabilities(printer, port, DC_MINEXTENT, NULL, NULL);
+ xval = (DWORD) (LOWORD(extentval));
+ yval = (DWORD) (HIWORD(extentval));
+ printf("printMinXExtent: %d\n", xval);
+ printf("printMinYExtent: %d\n", yval);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMinXExtent"), REG_DWORD, (BYTE *) &xval, sizeof(xval));
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMinYExtent"), REG_DWORD, (BYTE *) &yval, sizeof(yval));
+ extentval = DeviceCapabilities(printer, port, DC_MAXEXTENT, NULL, NULL);
+ xval = (DWORD) (LOWORD(extentval));
+ yval = (DWORD) (HIWORD(extentval));
+ printf("printMaxXExtent: %d\n", xval);
+ printf("printMaxYExtent: %d\n", yval);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMaxXExtent"), REG_DWORD, (BYTE *) &xval, sizeof(xval));
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printMaxYExtent"), REG_DWORD, (BYTE *) &yval, sizeof(yval));
+}
+
+void map_printrateunit(HANDLE ph, TCHAR *printer, TCHAR *port)
+{
+ DWORD unit;
+ TCHAR ppm[] = _T("PagesPerMinute");
+ TCHAR ipm[] = _T("InchesPerMinute");
+ TCHAR lpm[] = _T("LinesPerMinute");
+ TCHAR cps[] = _T("CharactersPerSecond");
+
+ unit = DeviceCapabilities(printer, port, DC_PRINTRATEUNIT, NULL, NULL);
+ switch(unit) {
+ case PRINTRATEUNIT_PPM:
+ printf("printRateUnit: %s\n", ppm);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, ppm, sizeof(ppm));
+ break;
+ case PRINTRATEUNIT_IPM:
+ printf("printRateUnit: %s\n", ipm);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, ipm, sizeof(ipm));
+ break;
+ case PRINTRATEUNIT_LPM:
+ printf("printRateUnit: %s\n", lpm);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, lpm, sizeof(lpm));
+ break;
+ case PRINTRATEUNIT_CPS:
+ printf("printRateUnit: %s\n", cps);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, _T("printRateUnit"), REG_SZ, cps, sizeof(cps));
+ break;
+ default:
+ printf("printRateUnit: unknown value %d\n", unit);
+ }
+}
+
+void map_generic_boolean(HANDLE ph, TCHAR *printer, TCHAR *port, WORD cap, TCHAR *key)
+{
+ BYTE boolval;
+ /* DeviceCapabilities doesn't always return 1 for true...just nonzero */
+ boolval = (BYTE) (DeviceCapabilities(printer, port, cap, NULL, NULL) ? 1 : 0);
+ printf("%s: %s\n", key, boolval ? "TRUE" : "FALSE");
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, key, REG_BINARY, &boolval, sizeof(boolval));
+}
+
+void map_generic_dword(HANDLE ph, TCHAR *printer, TCHAR *port, WORD cap, TCHAR *key)
+{
+ DWORD dword;
+
+ dword = DeviceCapabilities(printer, port, cap, NULL, NULL);
+ if ((DWORD) -1 == dword)
+ return;
+
+ printf("%s: %d\n", key, dword);
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, key, REG_DWORD, (BYTE *) &dword, sizeof(dword));
+}
+
+void map_generic_multi_sz(HANDLE ph, TCHAR *printer, TCHAR *port, WORD cap, TCHAR *key, int size)
+{
+ TCHAR *strings_in;
+ TCHAR *strings_out, *strings_cur;
+ DWORD num_items, i;
+
+ num_items = DeviceCapabilities(printer, port, cap, NULL, NULL);
+ if ((DWORD) -1 == num_items)
+ return;
+ strings_in = malloc(num_items * size);
+ strings_out = calloc(num_items, size);
+ num_items = DeviceCapabilities(printer, port, cap, strings_in, NULL);
+ printf("%s:\n", key);
+ for (i=0, strings_cur = strings_out; i < num_items; i++) {
+ _tcsncpy(strings_cur, &strings_in[i*size], size);
+ printf("\t%s\n", strings_cur);
+ strings_cur += _tcslen(strings_cur) + 1;
+ }
+
+ SetPrinterDataEx(ph, SPLDS_DRIVER_KEY, key, REG_MULTI_SZ, strings_out,
+ (strings_cur - strings_out + 1) * sizeof(TCHAR));
+
+ free(strings_in);
+ free(strings_out);
+}
+
+int main(int argc, char *argv[])
+{
+ HANDLE ph;
+ BYTE *driver_info;
+ DWORD needed;
+ TCHAR *printer;
+ TCHAR *port = SAMBA_PORT;
+ PRINTER_DEFAULTS admin_access = {NULL, NULL, PRINTER_ACCESS_ADMINISTER};
+ PRINTER_INFO_7 publish = {NULL, DSPRINT_PUBLISH};
+
+ if (argc < 2) {
+ printf("Usage: %s <printername>\n", argv[0]);
+ return -1;
+ }
+
+ printer = argv[1];
+
+ if (!(OpenPrinter(printer, &ph, &admin_access))) {
+ printf("OpenPrinter failed, error = %s\n", PrintLastError());
+ return -1;
+ }
+
+ GetPrinterDriver(ph, NULL, 1, NULL, 0, &needed);
+ if (!needed) {
+ printf("GetPrinterDriver failed, error = %s\n", PrintLastError());
+ ClosePrinter(ph);
+ return -1;
+ }
+ driver_info = malloc(needed);
+ if (!(GetPrinterDriver(ph, NULL, 1, driver_info, needed, &needed))) {
+ printf("GetPrinterDriver failed, error = %s\n", PrintLastError());
+ ClosePrinter(ph);
+ return -1;
+ }
+
+ map_generic_multi_sz(ph, printer, port, DC_BINNAMES, _T("printBinNames"), 24);
+ map_generic_boolean(ph, printer, port, DC_COLLATE, _T("printCollate"));
+ map_generic_dword(ph, printer, port, DC_COPIES, _T("printMaxCopies"));
+ map_generic_dword(ph, printer, port, DC_DRIVER, _T("driverVersion"));
+ map_generic_boolean(ph, printer, port, DC_DUPLEX, _T("printDuplexSupported"));
+ map_extents(ph, printer, port);
+ map_resolution(ph, printer, port);
+ map_orientation(ph, printer, port);
+ map_generic_multi_sz(ph, printer, port, DC_PAPERNAMES, _T("printMediaSupported"), 64);
+#if (WINVER >= 0x0500)
+ map_generic_boolean(ph, printer, port, DC_COLORDEVICE, _T("printColor"));
+ map_generic_multi_sz(ph, printer, port, DC_PERSONALITY, _T("printLanguage"), 64);
+ map_generic_multi_sz(ph, printer, port, DC_MEDIAREADY, _T("printMediaReady"),64);
+ map_generic_dword(ph, printer, port, DC_PRINTERMEM, _T("printMemory"));
+ map_generic_dword(ph, printer, port, DC_PRINTRATE, _T("printRate"));
+ map_printrateunit(ph, printer, port);
+#ifdef DC_STAPLE
+ map_generic_boolean(ph, printer, port, DC_STAPLE, _T("printStaplingSupported"));
+#endif
+#ifdef DC_PRINTRATEPPM
+ map_generic_dword(ph, printer, port, DC_PRINTRATEPPM, _T("printPagesPerMinute"));
+#endif
+#endif
+ SetPrinter(ph, 7, (BYTE *) &publish, 0);
+ ClosePrinter(ph);
+ return 0;
+}
diff --git a/examples/printing/readme.prtpub b/examples/printing/readme.prtpub
new file mode 100644
index 0000000..319ce60
--- /dev/null
+++ b/examples/printing/readme.prtpub
@@ -0,0 +1,12 @@
+prtpub.c contains a program which, when compiled with Visual C, can
+download a driver for a printer, query the capabilities of the driver,
+then write back the DsDriver keys necessary to publish all the fields
+of a printer in the directory. After writing back the fields, it issues
+a SetPrinter with info level 7, telling the server to publish the
+printer.
+
+It also writes the fields to stdout.
+
+In order to be distributed, it should be compiled using DLLs for C runtime.
+
+The program takes the UNC name of a printer as the only argument.
diff --git a/examples/printing/smbprint.sysv b/examples/printing/smbprint.sysv
new file mode 100644
index 0000000..11fea21
--- /dev/null
+++ b/examples/printing/smbprint.sysv
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# @(#) smbprint.sysv version 1.0 Ross Wakelin <r.wakelin@march.co.uk>
+#
+# Version 1.0 13 January 1995
+# modified from the original smbprint (bsd) script
+#
+# this script is a System 5 printer interface script. It
+# uses the smbclient program to print the file to the specified smb-based
+# server and service.
+#
+# To add this to your lp system, copy this file into your samba directory
+# (the example here is /opt/samba), modify the server and service variables
+# and then execute the following command (as root)
+#
+# lpadmin -punixprintername -v/dev/null -i/opt/samba/smbprint
+#
+# where unixprintername is the name that the printer will be known as
+# on your unix box.
+#
+# the script smbprint will be copied into your printer administration
+# directory (/usr/lib/lp or /etc/lp) as a new interface
+# (interface/unixprintername)
+# Then you have to enable unixprintername and accept unixprintername
+#
+# This script will then be called by the lp service to print the files
+# This script will have 6 or more parameters passed to it by the lp service.
+# The first five will contain details of the print job, who queued it etc,
+# while parameters 6 onwards are a list of files to print. We just
+# cat these at the samba client.
+#
+# Set these to the server and service you wish to print to
+# In this example I have a WfWg PC called "lapland" that has a printer
+# exported called "printer" with no password.
+#
+# clear out the unwanted parameters
+shift;shift;shift;shift;shift
+# now the argument list is just the files to print
+
+server=admin
+service=hplj2
+password=""
+
+(
+# NOTE You may wish to add the line `echo translate' if you want automatic
+# CR/LF translation when printing.
+ echo translate
+ echo "print -"
+ cat $*
+) | /opt/samba/smbclient "\\\\$server\\$service" $password -N > /dev/null
+exit $?
+