Update Debian packaging files
[openafs.git] / src / packaging / Debian / patches / multiple-local-realms
diff --git a/src/packaging/Debian/patches/multiple-local-realms b/src/packaging/Debian/patches/multiple-local-realms
deleted file mode 100644 (file)
index c265561..0000000
+++ /dev/null
@@ -1,578 +0,0 @@
-Enable listing multiple realms in the server krb.conf file.  Up to four
-realms may be treated as local in that fashion for authorization
-purposes (instead of the single realm supported without this patch).
-
-This upstream patch is in the 1.5 series but not in 1.4.  However, it
-has been working in production at Stanford University for some time.
-
---- openafs.orig/src/audit/audit.c
-+++ openafs/src/audit/audit.c
-@@ -447,12 +447,43 @@
-                     }
-                     if ((clen = strlen(tcell))) {
- #if defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
--                        static char local_realm[AFS_REALM_SZ] = "";
--                        if (!local_realm[0]) {
--                            if (afs_krb_get_lrealm(local_realm, 0) != 0 /*KSUCCESS*/)
--                                strncpy(local_realm, "UNKNOWN.LOCAL.REALM", AFS_REALM_SZ);
-+                        static char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
-+                      static int  num_lrealms = -1;
-+                      int i, lrealm_match;
-+
-+                      if (num_lrealms == -1) {
-+                          for (i=0; i<AFS_NUM_LREALMS; i++) {
-+                              if (afs_krb_get_lrealm(local_realms[i], i) != 0 /*KSUCCESS*/)
-+                                  break;
-+                          }
-+
-+                          if (i == 0)
-+                              strncpy(local_realms[0], "UNKNOWN.LOCAL.REALM", AFS_REALM_SZ);
-+                          num_lrealms = i;
-                         }
--                        if (strcasecmp(local_realm, tcell)) {
-+
-+                      /* Check to see if the ticket cell matches one of the local realms */
-+                      lrealm_match = 0;
-+                      for ( i=0;i<num_lrealms;i++ ) {
-+                          if (!strcasecmp(local_realms[i], tcell)) {
-+                              lrealm_match = 1;
-+                              break;
-+                          }
-+                      }
-+                      /* If yes, then make sure that the name is not present in
-+                       * an exclusion list */
-+                      if (lrealm_match) {
-+                          char uname[256];
-+                          if (inst[0])
-+                              snprintf(uname,sizeof(uname),"%s.%s@%s",name,inst,tcell);
-+                          else
-+                              snprintf(uname,sizeof(uname),"%s@%s",name,tcell);
-+
-+                          if (afs_krb_exclusion(uname))
-+                              lrealm_match = 0;
-+                      }
-+
-+                      if (!lrealm_match) {
-                             if (strlen(vname) + 1 + clen >= sizeof(vname))
-                                 goto done;
-                             strcat(vname, "@");
---- openafs.orig/src/auth/userok.c
-+++ openafs/src/auth/userok.c
-@@ -403,7 +403,9 @@
-       afs_uint32 exp;
-       static char lcell[MAXCELLCHARS] = "";
--      static char lrealm[AFS_REALM_SZ] = "";
-+      static char lrealms[AFS_NUM_LREALMS][AFS_REALM_SZ];
-+      static int  num_lrealms = -1;
-+      int lrealm_match = 0, i;
-       /* get auth details from server connection */
-       code =
-@@ -440,11 +442,40 @@
-       /* if running a krb environment, also get the local realm */
-       /* note - this assumes AFS_REALM_SZ <= MAXCELLCHARS */
-       /* just set it to lcell if it fails */
--      if (!lrealm[0]) {
--          if (afs_krb_get_lrealm(lrealm, 0) != 0)     /* KSUCCESS */
--              strncpy(lrealm, lcell, AFS_REALM_SZ);
-+      if (num_lrealms == -1) {
-+          for (i=0; i<AFS_NUM_LREALMS; i++) {
-+              if (afs_krb_get_lrealm(lrealms[i], i) != 0 /*KSUCCESS*/)
-+                  break;
-+          }
-+
-+          if (i == 0) {
-+              strncpy(lrealms[0], lcell, AFS_REALM_SZ);
-+              num_lrealms = 1;
-+          } else {
-+              num_lrealms = i;
-+          }
-       }
-+      /* See if the ticket cell matches one of the local realms */
-+      lrealm_match = 0;
-+      for ( i=0;i<num_lrealms;i++ ) {
-+          if (!strcasecmp(lrealms[i], tcell)) {
-+              lrealm_match = 1;
-+              break;
-+          }
-+      }
-+
-+      /* If yes, then make sure that the name is not present in
-+       * an exclusion list */
-+      if (lrealm_match) {
-+          if (tinst[0])
-+              snprintf(uname,sizeof(uname),"%s.%s@%s",tname,tinst,tcell);
-+          else
-+              snprintf(uname,sizeof(uname),"%s@%s",tname,tcell);
-+
-+          if (afs_krb_exclusion(uname))
-+              lrealm_match = 0;
-+      }
-       /* start with no uname and no authorization */
-       strcpy(uname, "");
-@@ -456,8 +487,8 @@
-           strcpy(uname, "<LocalAuth>");
-           flag = 1;
--          /* cell of connection matches local cell or krb4 realm */
--      } else if (!strcasecmp(tcell, lcell) || !strcasecmp(tcell, lrealm)) {
-+          /* cell of connection matches local cell or one of the realms */
-+      } else if (!strcasecmp(tcell, lcell) || lrealm_match) {
-           if ((tmp = CompFindUser(adir, tname, ".", tinst, NULL))) {
-               strcpy(uname, tmp);
-               flag = 1;
-@@ -467,7 +498,6 @@
-               flag = 1;
- #endif
-           }
--
-           /* cell of conn doesn't match local cell or realm */
-       } else {
-           if ((tmp = CompFindUser(adir, tname, ".", tinst, tcell))) {
---- openafs.orig/src/config/afs_sysnames.h
-+++ openafs/src/config/afs_sysnames.h
-@@ -286,4 +286,6 @@
- #ifdef        AFS_KERBREALM_ENV
- #define       AFS_REALM_SZ            64
- #endif
-+/* Specifies the number of equivalent local realm names */
-+#define AFS_NUM_LREALMS         4
- #endif /* __AFS_SYSNAMES_INCL_ENV_ */
---- openafs.orig/src/ptserver/ptprocs.c
-+++ openafs/src/ptserver/ptprocs.c
-@@ -93,6 +93,7 @@
- extern afs_int32 Initdb();
- extern int pr_noAuth;
- extern afs_int32 initd;
-+extern char *pr_realmName;
- afs_int32 iNewEntry(), newEntry(), whereIsIt(), dumpEntry(), addToGroup(),
- nameToID(), Delete(), removeFromGroup();
- afs_int32 getCPS(), getCPS2(), getHostCPS(), listMax(), setMax(), listEntry();
-@@ -178,22 +179,9 @@
-       if (exp < FT_ApproxTime())
-           goto done;
- #endif
--      if (strlen(tcell)) {
--          extern char *pr_realmName;
--#if   defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
--          static char local_realm[AFS_REALM_SZ] = "";
--          if (!local_realm[0]) {
--              if (afs_krb_get_lrealm(local_realm, 0) != 0 /*KSUCCESS*/)
--                  strncpy(local_realm, pr_realmName, AFS_REALM_SZ);
--          }
--#endif
--          if (
--#if   defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
--                 strcasecmp(local_realm, tcell) &&
--#endif
--                 strcasecmp(pr_realmName, tcell))
--              foreign = 1;
--      }
-+      if (tcell[0])
-+          foreign = afs_is_foreign_ticket_name(name,inst,tcell,pr_realmName);
-+
-       strncpy(vname, name, sizeof(vname));
-       if (ilen = strlen(inst)) {
-           if (strlen(vname) + 1 + ilen >= sizeof(vname))
-@@ -640,7 +628,24 @@
-       ABORT_WITH(tt, code);
-     for (i = 0; i < aname->namelist_len; i++) {
--      code = NameToID(tt, aname->namelist_val[i], &aid->idlist_val[i]);
-+      char vname[256];
-+      char *nameinst, *cell;
-+
-+      strncpy(vname, aname->namelist_val[i], sizeof(vname));
-+      vname[sizeof(vname)-1] ='\0';
-+
-+      nameinst = vname;
-+      cell = strchr(vname, '@');
-+      if (cell) {
-+          *cell = '\0';
-+          cell++;
-+      }
-+
-+      if (cell && afs_is_foreign_ticket_name(nameinst,NULL,cell,pr_realmName))
-+          code = NameToID(tt, aname->namelist_val[i], &aid->idlist_val[i]);
-+      else
-+          code = NameToID(tt, nameinst, &aid->idlist_val[i]);
-+
-       if (code != PRSUCCESS)
-           aid->idlist_val[i] = ANONYMOUSID;
-         osi_audit(PTS_NmToIdEvent, code, AUD_STR,
-@@ -2281,7 +2286,6 @@
- }
- #endif /* IP_WILDCARDS */
--
- afs_int32
- WhoIsThisWithName(acall, at, aid, aname)
-      struct rx_call *acall;
-@@ -2309,11 +2313,12 @@
-     } else if (code == 2) {   /* kad class */
-       int clen;
--      extern char *pr_realmName;
-       if ((code = rxkad_GetServerInfo(acall->conn, NULL, 0 /*was &exp */ ,
-                                       name, inst, tcell, NULL)))
-           goto done;
-+
-+
-       strncpy(vname, name, sizeof(vname));
-       if ((ilen = strlen(inst))) {
-           if (strlen(vname) + 1 + ilen >= sizeof(vname))
-@@ -2322,19 +2327,9 @@
-           strcat(vname, inst);
-       }
-       if ((clen = strlen(tcell))) {
-+          int foreign = afs_is_foreign_ticket_name(name,inst,tcell,pr_realmName);
--#if   defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
--          static char local_realm[AFS_REALM_SZ] = "";
--          if (!local_realm[0]) {
--              if (afs_krb_get_lrealm(local_realm, 0) != 0 /*KSUCCESS*/)
--                  strncpy(local_realm, pr_realmName, AFS_REALM_SZ);
--          }
--#endif
--          if (
--#if   defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
--                 strcasecmp(local_realm, tcell) &&
--#endif
--                 strcasecmp(pr_realmName, tcell)) {
-+          if (foreign) {
-               if (strlen(vname) + 1 + clen >= sizeof(vname))
-                   goto done;
-               strcat(vname, "@");
---- openafs.orig/src/util/afsutil_prototypes.h
-+++ openafs/src/util/afsutil_prototypes.h
-@@ -74,7 +74,8 @@
- /* get_krbrlm.c */
- extern int afs_krb_get_lrealm(char *r, int n);
--
-+extern int afs_krb_exclusion(char *name);
-+extern int afs_is_foreign_ticket_name(char *tname, char *tinst, char * tcell, char *localrealm);
- /* hostparse.c */
- extern struct hostent *hostutil_GetHostByName(register char *ahost);
- extern char *hostutil_GetNameByINet(afs_uint32 addr);
---- openafs.orig/src/util/dirpath.c
-+++ openafs/src/util/dirpath.c
-@@ -365,6 +365,8 @@
-     pathp = dirPathArray[AFSDIR_SERVER_MIGRATELOG_FILEPATH_ID];
-     AFSDIR_SERVER_FILEPATH(pathp, AFSDIR_MIGR_DIR, AFSDIR_MIGRATE_LOGNAME);
-+    pathp = dirPathArray[AFSDIR_SERVER_KRB_EXCL_FILEPATH_ID];
-+    AFSDIR_SERVER_FILEPATH(pathp, AFSDIR_SERVER_ETC_DIR, AFSDIR_KRB_EXCL_FILE);
-     /* client file paths */
- #ifdef AFS_NT40_ENV
---- openafs.orig/src/util/dirpath.hin
-+++ openafs/src/util/dirpath.hin
-@@ -144,6 +144,7 @@
- #define AFSDIR_BOSVR_FILE       "bosserver"
- #define AFSDIR_VOLSERLOG_FILE   "VolserLog"
- #define AFSDIR_AUDIT_FILE       "Audit"
-+#define AFSDIR_KRB_EXCL_FILE    "krb.excl"
- #define AFSDIR_ROOTVOL_FILE     "RootVolume"
- #define AFSDIR_HOSTDUMP_FILE    "hosts.dump"
-@@ -262,6 +263,7 @@
-       AFSDIR_SERVER_MIGRATELOG_FILEPATH_ID,
-       AFSDIR_SERVER_BIN_FILE_DIRPATH_ID,
-       AFSDIR_CLIENT_CELLALIAS_FILEPATH_ID,
-+      AFSDIR_SERVER_KRB_EXCL_FILEPATH_ID,
-       AFSDIR_PATHSTRING_MAX } afsdir_id_t;
- /* getDirPath() returns a pointer to a string from an internal array of path strings 
-@@ -329,6 +331,7 @@
- #define AFSDIR_SERVER_WEIGHTING_CONSTANTS_FILEPATH getDirPath(AFSDIR_SERVER_WEIGHTING_CONSTANTS_FILEPATH_ID)
- #define AFSDIR_SERVER_THRESHOLD_CONSTANTS_FILEPATH getDirPath(AFSDIR_SERVER_THRESHOLD_CONSTANTS_FILEPATH_ID)
- #define AFSDIR_SERVER_MIGRATELOG_FILEPATH getDirPath(AFSDIR_SERVER_MIGRATELOG_FILEPATH_ID)
-+#define AFSDIR_SERVER_KRB_EXCL_FILEPATH getDirPath(AFSDIR_SERVER_KRB_EXCL_FILEPATH_ID)
- /* client file paths */
- #define AFSDIR_CLIENT_THISCELL_FILEPATH getDirPath(AFSDIR_CLIENT_THISCELL_FILEPATH_ID)
---- openafs.orig/src/util/dirpath_nt.h
-+++ openafs/src/util/dirpath_nt.h
-@@ -135,6 +135,7 @@
- #define AFSDIR_BOSVR_FILE       "bosserver"
- #define AFSDIR_VOLSERLOG_FILE   "VolserLog"
- #define AFSDIR_AUDIT_FILE       "Audit"
-+#define AFSDIR_KRB_EXCL_FILE    "krb.excl"
- #define AFSDIR_ROOTVOL_FILE     "RootVolume"
- #define AFSDIR_HOSTDUMP_FILE    "hosts.dump"
-@@ -257,6 +258,7 @@
-     AFSDIR_SERVER_MIGRATELOG_FILEPATH_ID,
-     AFSDIR_SERVER_BIN_FILE_DIRPATH_ID,
-     AFSDIR_CLIENT_CELLALIAS_FILEPATH_ID,
-+    AFSDIR_SERVER_KRB_EXCL_FILEPATH_ID,
-     AFSDIR_PATHSTRING_MAX
- } afsdir_id_t;
-@@ -325,6 +327,7 @@
- #define AFSDIR_SERVER_WEIGHTING_CONSTANTS_FILEPATH getDirPath(AFSDIR_SERVER_WEIGHTING_CONSTANTS_FILEPATH_ID)
- #define AFSDIR_SERVER_THRESHOLD_CONSTANTS_FILEPATH getDirPath(AFSDIR_SERVER_THRESHOLD_CONSTANTS_FILEPATH_ID)
- #define AFSDIR_SERVER_MIGRATELOG_FILEPATH getDirPath(AFSDIR_SERVER_MIGRATELOG_FILEPATH_ID)
-+#define AFSDIR_SERVER_KRB_EXCL_FILEPATH getDirPath(AFSDIR_SERVER_KRB_EXCL_FILEPATH_ID)
- /* client file paths */
- #define AFSDIR_CLIENT_THISCELL_FILEPATH getDirPath(AFSDIR_CLIENT_THISCELL_FILEPATH_ID)
---- openafs.orig/src/util/get_krbrlm.c
-+++ openafs/src/util/get_krbrlm.c
-@@ -26,21 +26,148 @@
- #define       KSUCCESS        0
- #define       KFAILURE        (-1)
-+static char *
-+parse_str(char *buffer, char *result, int size)
-+{
-+    int n=0;
-+
-+    if (!buffer)
-+        goto cleanup;
-+
-+    while (*buffer && isspace(*buffer))
-+        buffer++;
-+    while (*buffer && !isspace(*buffer)) {
-+      if (n < size - 1) {
-+          *result++=*buffer++;
-+          n++;
-+      } else {
-+          buffer++;
-+      }
-+    }
-+
-+  cleanup:
-+    *result='\0';
-+    return buffer;
-+}
-+
-+
- int
- afs_krb_get_lrealm(char *r, int n)
- {
-+    char linebuf[2048];
-+    char tr[AFS_REALM_SZ] = "";
-+    char *p;
-     FILE *cnffile/*, *fopen()*/;
-+    int i;
-+    int rv = KFAILURE;
--    if (n > 1)
--      return (KFAILURE);      /* Temporary restriction */
-+    *r = '\0';
-     if ((cnffile = fopen(AFSDIR_SERVER_KCONF_FILEPATH, "r")) == NULL) {
-       return (KFAILURE);
-     }
--    if (fscanf(cnffile, "%s", r) != 1) {
--      (void)fclose(cnffile);
--      return (KFAILURE);
-+    if (fgets(linebuf, sizeof(linebuf)-1, cnffile) == NULL) {
-+      goto cleanup;
-+    }
-+    linebuf[sizeof(linebuf)-1] = '\0';
-+    for (i=0, p=linebuf; i<=n && *p; i++) {
-+        p = parse_str(p, tr, AFS_REALM_SZ);
-+    }
-+
-+    if (*tr) {
-+      strcpy(r,tr);
-+      rv = KSUCCESS;
-+    }
-+
-+  cleanup:
-+    (void)fclose(cnffile);
-+    return rv;
-+}
-+
-+int
-+afs_krb_exclusion(char * name)
-+{
-+    char linebuf[2048];
-+    char excl_name[256] = "";
-+    FILE *cnffile/*, *fopen()*/;
-+    int exclude = 0;
-+
-+    if ((cnffile = fopen(AFSDIR_SERVER_KRB_EXCL_FILEPATH, "r")) == NULL)
-+      return exclude;
-+
-+    for (;;) {
-+      if (fgets(linebuf, sizeof(linebuf)-1, cnffile) == NULL) {
-+          goto cleanup;
-+      }
-+      linebuf[sizeof(linebuf)-1] = '\0';
-+        parse_str(linebuf, excl_name, sizeof(excl_name));
-+
-+      if (!strcmp(name,excl_name)) {
-+          exclude = 1;
-+          break;
-+      }
-     }
-+
-+  cleanup:
-     (void)fclose(cnffile);
--    return (KSUCCESS);
-+    return exclude;
-+}
-+
-+int
-+afs_is_foreign_ticket_name(char *tname, char *tinst, char * tcell, char *localrealm)
-+{
-+    int foreign = 0;
-+
-+    if (localrealm && strcasecmp(localrealm, tcell))
-+      foreign = 1;
-+
-+#if   defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
-+    if (foreign) {
-+      static char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
-+      static int  num_lrealms = -1;
-+      int lrealm_match, i;
-+      char uname[256];
-+
-+      if (num_lrealms == -1) {
-+          for (i=0; i<AFS_NUM_LREALMS; i++) {
-+              if (afs_krb_get_lrealm(local_realms[i], i) != 0 /*KSUCCESS*/)
-+                  break;
-+          }
-+
-+          if (i==0 && localrealm) {
-+              strncpy(local_realms[0], localrealm, AFS_REALM_SZ);
-+              num_lrealms = 1;
-+          } else {
-+              num_lrealms = i;
-+          }
-+      }
-+
-+      /* See if the ticket cell matches one of the local realms */
-+      lrealm_match = 0;
-+      for ( i=0;i<num_lrealms;i++ ) {
-+          if (!strcasecmp(local_realms[i], tcell)) {
-+              lrealm_match = 1;
-+              break;
-+          }
-+      }
-+
-+      /* If yes, then make sure that the name is not present in
-+       * an exclusion list */
-+      if (lrealm_match) {
-+          if (tinst && tinst[0])
-+              snprintf(uname,sizeof(uname),"%s.%s@%s",tname,tinst,tcell);
-+          else
-+              snprintf(uname,sizeof(uname),"%s@%s",tname,tcell);
-+
-+          if (afs_krb_exclusion(uname))
-+              lrealm_match = 0;
-+      }
-+
-+      foreign = !lrealm_match;
-+    }
-+#endif
-+    return foreign;
- }
-+
-+
-+
---- openafs.orig/src/util/test/dirpath_test.c
-+++ openafs/src/util/test/dirpath_test.c
-@@ -124,6 +124,8 @@
-          AFSDIR_SERVER_FILELOG_FILEPATH);
-     printf("AFSDIR_SERVER_AUDIT_FILEPATH = %s\n",
-          AFSDIR_SERVER_AUDIT_FILEPATH);
-+    printf("AFSDIR_SERVER_KRB_EXCL_FILEPATH  = %s\n",
-+         AFSDIR_SERVER_KRB_EXCL_FILEPATH);
-     printf("\n");
-     printf("\n");
-     printf("AFSDIR_CLIENT_THISCELL_FILEPATH = %s\n",
---- openafs.orig/src/viced/host.c
-+++ openafs/src/viced/host.c
-@@ -1793,7 +1793,8 @@
- static char localcellname[PR_MAXNAMELEN + 1];
--char local_realm[AFS_REALM_SZ] = "";
-+char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
-+int  num_lrealms = -1;
- /* not reentrant */
- void
-@@ -1801,13 +1802,26 @@
- {
-     memset(&nulluuid, 0, sizeof(afsUUID));
-     afsconf_GetLocalCell(confDir, localcellname, PR_MAXNAMELEN);
--    if (!local_realm[0]) {
--      if (afs_krb_get_lrealm(local_realm, 0) != 0 /*KSUCCESS*/) {
-+    if (num_lrealms == -1) {
-+       int i;
-+       for (i=0; i<AFS_NUM_LREALMS; i++) {
-+         if (afs_krb_get_lrealm(local_realms[i], i) != 0 /*KSUCCESS*/)
-+             break;
-+       }
-+
-+       if (i == 0) {
-           ViceLog(0,
-                   ("afs_krb_get_lrealm failed, using %s.\n",
-                    localcellname));
--          strcpy(local_realm, localcellname);
-+          strncpy(local_realms[0], localcellname, AFS_REALM_SZ);
-+          num_lrealms = i =1;
-+      } else {
-+          num_lrealms = i;
-       }
-+
-+      /* initialize the rest of the local realms to nullstring for debugging */
-+      for (; i<AFS_NUM_LREALMS; i++)
-+          local_realms[i][0] = '\0';
-     }
-     rxcon_ident_key = rx_KeyCreate((rx_destructor_t) free);
-     rxcon_client_key = rx_KeyCreate((rx_destructor_t) 0);
-@@ -1837,11 +1851,10 @@
-     cnamelen = strlen(acell);
-     if (cnamelen) {
--      if (strcasecmp(local_realm, acell)
--          && strcasecmp(localcellname, acell)) {
-+      if (afs_is_foreign_ticket_name(aname, NULL, acell, localcellname)) {
-           ViceLog(2,
--                  ("MapName: cell is foreign.  cell=%s, localcell=%s, localrealm=%s\n",
--                   acell, localcellname, local_realm));
-+                  ("MapName: cell is foreign.  cell=%s, localcell=%s, localrealms={%s,%s,%s,%s}\n",
-+                  acell, localcellname, local_realms[0],local_realms[1],local_realms[2],local_realms[3]));
-           if ((anamelen + cnamelen + 1) >= PR_MAXNAMELEN) {
-               ViceLog(2,
-                       ("MapName: Name too long, using AnonymousID for %s@%s\n",
---- openafs.orig/src/viced/viced.c
-+++ openafs/src/viced/viced.c
-@@ -1077,7 +1077,8 @@
-               return -1;
-           }
-       } else if (!strcmp(argv[i], "-realm")) {
--          extern char local_realm[AFS_REALM_SZ];
-+          extern char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
-+          extern int  num_lrealms;
-           if ((i + 1) >= argc) {
-               fprintf(stderr, "missing argument for -realm\n"); 
-               return -1; 
-@@ -1088,7 +1089,15 @@
-                    AFS_REALM_SZ);
-               return -1;
-           }
--          strncpy(local_realm, argv[i], AFS_REALM_SZ);
-+          if (num_lrealms == -1)
-+              num_lrealms = 0;
-+          if (num_lrealms >= AFS_NUM_LREALMS) {
-+              printf
-+                  ("a maximum of %d -realm arguments can be specified.\n",
-+                   AFS_NUM_LREALMS);
-+              return -1;
-+          }
-+          strncpy(local_realms[num_lrealms++], argv[i], AFS_REALM_SZ);
-       } else if (!strcmp(argv[i], "-udpsize")) {
-           if ((i + 1) >= argc) {
-               printf("You have to specify -udpsize <integer value>\n");