summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2021-04-09 09:11:00 -0400
committerMichael R Sweet <michael.r.sweet@gmail.com>2021-04-09 09:11:00 -0400
commita3fb828390bef5b915abcafdb4e66ce428ffec40 (patch)
treeb48bb4f3c0dcf1c836badf8dea503531c6eff11d /tools
parent1f3d159e4e8183bca40f16c1cfc80672bb260a46 (diff)
downloadcups-a3fb828390bef5b915abcafdb4e66ce428ffec40.tar.gz
Automatically choose an available port.
Diffstat (limited to 'tools')
-rw-r--r--tools/ippeveprinter.c69
1 files changed, 44 insertions, 25 deletions
diff --git a/tools/ippeveprinter.c b/tools/ippeveprinter.c
index 87224db9d..b38a7b0f6 100644
--- a/tools/ippeveprinter.c
+++ b/tools/ippeveprinter.c
@@ -3,7 +3,7 @@
*
* Copyright © 2021 by OpenPrinting.
* Copyright © 2020 by the IEEE-ISTO Printer Working Group.
- * Copyright © 2010-2019 by Apple Inc.
+ * Copyright © 2010-2021 by Apple Inc.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more
* information.
@@ -649,27 +649,6 @@ main(int argc, /* I - Number of command-line args */
* Apply defaults as needed...
*/
- if (!serverport)
- {
-#ifdef _WIN32
- /*
- * Windows is almost always used as a single user system, so use a default
- * port number of 8631.
- */
-
- serverport = 8631;
-
-#else
- /*
- * Use 8000 + UID mod 1000 for the default port number...
- */
-
- serverport = 8000 + ((int)getuid() % 1000);
-#endif /* _WIN32 */
-
- _cupsLangPrintf(stderr, _("Listening on port %d."), serverport);
- }
-
if (!directory[0])
{
const char *tmpdir; /* Temporary directory */
@@ -1736,10 +1715,50 @@ create_printer(
* Create the listener sockets...
*/
- if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0)
+ if (printer->port)
{
- perror("Unable to create IPv4 listener");
- goto bad_printer;
+ if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0)
+ {
+ perror("Unable to create IPv4 listener");
+ goto bad_printer;
+ }
+ }
+ else
+ {
+#ifdef _WIN32
+ /*
+ * Windows is almost always used as a single user system, so use a default
+ * port number of 8631.
+ */
+
+ serverport = 8631;
+
+#else
+ /*
+ * Use 8000 + UID mod 1000 for the default port number...
+ */
+
+ serverport = 8000 + ((int)getuid() % 1000);
+#endif /* _WIN32 */
+
+ while (serverport < 10000)
+ {
+ if ((printer->ipv4 = create_listener(servername, serverport, AF_INET)) >= 0)
+ break;
+
+ serverport ++;
+ }
+
+ if (serverport < 10000)
+ {
+ _cupsLangPrintf(stderr, _("Listening on port %d."), serverport);
+ printer->port = serverport;
+ }
+ else
+ {
+ perror("Unable to create IPv4 listener");
+ goto bad_printer;
+ }
}
if ((printer->ipv6 = create_listener(servername, printer->port, AF_INET6)) < 0)