Allow the primary port that the KDC listens on be configurable on the
authorTheodore Tso <tytso@mit.edu>
Thu, 26 Jan 1995 04:21:45 +0000 (04:21 +0000)
committerTheodore Tso <tytso@mit.edu>
Thu, 26 Jan 1995 04:21:45 +0000 (04:21 +0000)
command line.  If the appropriate /etc/services entries aren't found,
use compiled in defaults.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@4851 dc483132-0cff-0310-8789-dd5450dbe970

src/kdc/ChangeLog
src/kdc/extern.c
src/kdc/extern.h
src/kdc/main.c
src/kdc/network.c

index 8abd67adb4f05abc0325296e2186a15c70bf083c..afa6c3cf39ecce3005949b69b9544e207fd43b59 100644 (file)
@@ -1,3 +1,10 @@
+Wed Jan 25 23:20:07 1995  Theodore Y. Ts'o  (tytso@dcl)
+
+       * network.c (setup_network), main.c (process_args): Allow the
+               primary port that the KDC listens on be configurable on the
+               command line.  If the appropriate /etc/services entries
+               aren't found, use compiled in defaults.
+
 Wed Jan 25 16:54:40 1995  Chris Provenzano (proven@mit.edu)
 
         * Removed all narrow types and references to wide.h and narrow.h
index c5ee07b0f093b5c7718986f7c5fce3e567488e66..e809945975033797222f466eaf5c902d3e90d461 100644 (file)
@@ -55,3 +55,5 @@ krb5_kvno tgs_kvno;
 
 static krb5_data tgs_data[3] = { {0, KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME}, {0, 0, 0}};
 krb5_principal_data tgs_server_struct = { 0, { 0, 0, 0}, tgs_data, 2, 0};
+
+short primary_port = 0;
index cb294aca7f52730fe24e413bc49aa7dd46ca5099..81c5f5cccab492525947f9797ca56b227e0c3d25 100644 (file)
@@ -50,4 +50,6 @@ extern krb5_kvno tgs_kvno;
 extern krb5_principal_data tgs_server_struct;
 #define        tgs_server (&tgs_server_struct)
 
+extern short primary_port;
+
 #endif /* __KRB5_KDC_EXTERN__ */
index 5de4b4aa5ed8088c4a26ecafb47d081aba1ac7b2..12c40f0af47b4f9b37d01fc8addaad29cea5bf9f 100644 (file)
@@ -133,7 +133,7 @@ void
 usage(name)
 char *name;
 {
-    fprintf(stderr, "usage: %s [-d dbpathname] [-r dbrealmname] [-R replaycachename ]\n\t[-m] [-k masterkeytype] [-M masterkeyname]\n", name);
+    fprintf(stderr, "usage: %s [-d dbpathname] [-r dbrealmname] [-R replaycachename ]\n\t[-m] [-k masterkeytype] [-M masterkeyname] [-p port]\n", name);
     return;
 }
 
@@ -156,7 +156,7 @@ char **argv;
 
     extern char *optarg;
 
-    while ((c = getopt(argc, argv, "r:d:mM:k:R:e:")) != EOF) {
+    while ((c = getopt(argc, argv, "r:d:mM:k:R:e:p:")) != EOF) {
        switch(c) {
        case 'r':                       /* realm name for db */
            db_realm = optarg;
@@ -177,6 +177,9 @@ char **argv;
        case 'R':
            rcname = optarg;
            break;
+       case 'p':
+           primary_port = atoi(optarg);
+           break;
        case 'e':
            kdc_etype = atoi(optarg);
            break;
index ed5f2820f8699478da7ebd4977792f2bca15e104..35b35016629efe02c5b891a99e393c86ae209bae 100644 (file)
@@ -49,6 +49,7 @@
 extern char *krb5_kdc_udp_portname;
 extern char *krb5_kdc_sec_udp_portname;
 extern int errno;
+extern short primary_port;
 
 static int udp_port_fd = -1;
 static int sec_udp_port_fd = -1;
@@ -65,22 +66,26 @@ const char *prog;
 
     FD_ZERO(&select_fds);
     select_nfsd = 0;
-    sp = getservbyname(krb5_kdc_udp_portname, "udp");
-    if (!sp) {
-       com_err(prog, 0, "%s/udp service unknown\n",
-               krb5_kdc_udp_portname);
-       return KDC5_NOPORT;
+    memset((char *)&sin, 0, sizeof(sin));
+    if (primary_port) {
+        sin.sin_port = htons(primary_port);
+    } else {
+        sp = getservbyname(krb5_kdc_udp_portname, "udp");
+        if (!sp)
+            sin.sin_port = htons(KRB5_DEFAULT_PORT);
+        else
+            sin.sin_port = sp->s_port;
     }
+    
     if ((udp_port_fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
-       retval = errno;
-       com_err(prog, 0, "Cannot create server socket");
-       return retval;
+        retval = errno;
+        com_err(prog, 0, "Cannot create server socket");
+        return retval;
     }
-    memset((char *)&sin, 0, sizeof(sin));
-    sin.sin_port = sp->s_port;
+    
     if (bind(udp_port_fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
        retval = errno;
-       com_err(prog, 0, "Cannot bind server socket");
+       com_err(prog, 0, "Cannot bind server socket to fd %d", udp_port_fd);
        return retval;
     }
     FD_SET(udp_port_fd, &select_fds);
@@ -94,7 +99,7 @@ const char *prog;
            return 0;           /* No secondary listening port defined */
 
     sp = getservbyname(krb5_kdc_sec_udp_portname, "udp");
-    if (!sp) {
+    if (!sp && sin.sin_port != htons(KRB5_DEFAULT_SEC_PORT)) {
        com_err(prog, 0, "%s/udp service unknown\n",
                krb5_kdc_sec_udp_portname);
        return 0;               /* Don't give an error if we can't */
@@ -105,7 +110,7 @@ const char *prog;
        return 0;               /* Don't give an error we we can't do this */
     }
     memset((char *)&sin, 0, sizeof(sin));
-    sin.sin_port = sp->s_port;
+    sin.sin_port = sp ? sp->s_port : htons(KRB5_DEFAULT_SEC_PORT);
     if (bind(sec_udp_port_fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
        com_err(prog, errno, "while trying to bind secondary server socket");
        return 0;               /* Don't give an error if we can't do this */