]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
netinfo-fake-support-correction-20070112
authorDerrick Brashear <shadow@dementia.org>
Fri, 12 Jan 2007 05:18:52 +0000 (05:18 +0000)
committerDerrick Brashear <shadow@dementia.org>
Fri, 12 Jan 2007 05:18:52 +0000 (05:18 +0000)
fix NetInfo "f" line fake IP address support to work when either
1) NetRestrict file is in place or
2) existing sysid file does not list fake address

src/util/netutils.c
src/viced/viced.c

index 50c692614209026037805ad2e545b2df80c5e55e..4ff10a027220a193b1ea178760cd9e55c86632d7 100644 (file)
@@ -132,9 +132,10 @@ extract_Addr(char *line, int maxSize)
 */
 
 int
-parseNetRestrictFile(afs_uint32 outAddrs[], afs_uint32 * mask,
-                    afs_uint32 * mtu, afs_uint32 maxAddrs,
-                    afs_uint32 * nAddrs, char reason[], const char *fileName)
+parseNetRestrictFile_int(afs_uint32 outAddrs[], afs_uint32 * mask,
+                        afs_uint32 * mtu, afs_uint32 maxAddrs,
+                        afs_uint32 * nAddrs, char reason[], 
+                        const char *fileName, const char *fileName_ni)
 {
     FILE *fp;
     char line[MAX_NETFILE_LINE];
@@ -161,6 +162,14 @@ parseNetRestrictFile(afs_uint32 outAddrs[], afs_uint32 * mask,
        sprintf(reason, "No existing IP interfaces found");
        return -1;
     }
+    i = 0;
+    if ((neaddrs < MAXIPADDRS) && fileName_ni) 
+       i = ParseNetInfoFile_int(&(eAddrs[neaddrs]), &(eMask[neaddrs]), 
+                                &(eMtu[neaddrs]), MAXIPADDRS-neaddrs, reason,
+                                fileName_ni, 1);
+
+    if (i > 0)
+       neaddrs += i;
 
     if ((fp = fopen(fileName, "r")) == 0) {
        sprintf(reason, "Could not open file %s for reading:%s", fileName,
@@ -223,7 +232,14 @@ parseNetRestrictFile(afs_uint32 outAddrs[], afs_uint32 * mask,
     return (usedfile ? 0 : 1); /* 0=>used the file.  1=>didn't use file */
 }
 
-
+int
+parseNetRestrictFile(afs_uint32 outAddrs[], afs_uint32 * mask,
+                        afs_uint32 * mtu, afs_uint32 maxAddrs,
+                        afs_uint32 * nAddrs, char reason[], 
+                        const char *fileName)
+{
+    return parseNetRestrictFile_int(outAddrs, mask, mtu, maxAddrs, nAddrs, reason, fileName, NULL);
+}
 
 /*
  * this function reads in stuff from InterfaceAddr file in
@@ -234,8 +250,9 @@ parseNetRestrictFile(afs_uint32 outAddrs[], afs_uint32 * mask,
  * interface addresses. Pulled out from afsd.c
  */
 int
-ParseNetInfoFile(afs_uint32 * final, afs_uint32 * mask, afs_uint32 * mtu,
-                int max, char reason[], const char *fileName)
+ParseNetInfoFile_int(afs_uint32 * final, afs_uint32 * mask, afs_uint32 * mtu,
+                    int max, char reason[], const char *fileName, 
+                    int fakeonly)
 {
 
     afs_uint32 existingAddr[MAXIPADDRS], existingMask[MAXIPADDRS],
@@ -327,12 +344,13 @@ ParseNetInfoFile(afs_uint32 * final, afs_uint32 * mask, afs_uint32 * mtu,
                    "afs:Too many interfaces. The current kernel configuration supports a maximum of %d interfaces\n",
                    max);
        } else if (fake) {
-           fprintf(stderr, "Client (2) also has address %s\n", line);
+           if (!fake) 
+               fprintf(stderr, "Client (2) also has address %s\n", line);
            final[count] = addr;
            mask[count] = 0xffffffff;
            mtu[count] = htonl(1500);
            count++;
-       } else {
+       } else if (!fakeonly) {
            final[count] = existingAddr[i];
            mask[count] = existingMask[i];
            mtu[count] = existingMtu[i];
@@ -354,7 +372,12 @@ ParseNetInfoFile(afs_uint32 * final, afs_uint32 * mask, afs_uint32 * mtu,
     return count;
 }
 
-
+int
+ParseNetInfoFile(afs_uint32 * final, afs_uint32 * mask, afs_uint32 * mtu,
+                int max, char reason[], const char *fileName)
+{
+    return ParseNetInfoFile_int(final, mask, mtu, max, reason, fileName, 0);
+}
 
 /*
  * Given two arrays of addresses, masks and mtus find the common ones
@@ -439,8 +462,8 @@ parseNetFiles(afs_uint32 addrbuf[], afs_uint32 maskbuf[], afs_uint32 mtubuf[],
        ParseNetInfoFile(addrbuf1, maskbuf1, mtubuf1, MAXIPADDRS, reason,
                         niFileName);
     code =
-       parseNetRestrictFile(addrbuf2, maskbuf2, mtubuf2, MAXIPADDRS,
-                            &nAddrs2, reason, nrFileName);
+       parseNetRestrictFile_int(addrbuf2, maskbuf2, mtubuf2, MAXIPADDRS,
+                            &nAddrs2, reason, nrFileName, niFileName);
     if ((nAddrs1 < 0) && (code)) {
        /* both failed */
        return -1;
index 71e02631b656de0240e99573756907414d7033ab..3c400bb729f6414214b2c9d2d9832a9ce8484c7b 100644 (file)
@@ -1669,16 +1669,22 @@ ReadSysIdFile()
                 AFSDIR_SERVER_SYSID_FILEPATH, nentries));
        return EIO;
     }
-    FS_HostAddr_cnt = nentries;
-    for (i = 0; i < nentries; i++) {
-       if (read(fd, (char *)&FS_HostAddrs[i], sizeof(afs_int32)) !=
-           sizeof(afs_int32)) {
-           ViceLog(0,
-                   ("%s: Read of addresses failed (%d)\n",
-                    AFSDIR_SERVER_SYSID_FILEPATH, errno));
-           FS_HostAddr_cnt = 0;        /* reset it */
-           return EIO;
+    if (FS_HostAddr_cnt == 0) {
+       FS_HostAddr_cnt = nentries;
+       for (i = 0; i < nentries; i++) {
+           if (read(fd, (char *)&FS_HostAddrs[i], sizeof(afs_int32)) !=
+               sizeof(afs_int32)) {
+               ViceLog(0,
+                       ("%s: Read of addresses failed (%d)\n",
+                        AFSDIR_SERVER_SYSID_FILEPATH, errno));
+               FS_HostAddr_cnt = 0;    /* reset it */
+               return EIO;
+           }
        }
+    } else {
+       ViceLog(1,
+               ("%s: address list ignored (NetInfo/NetRestrict override)\n",
+                AFSDIR_SERVER_SYSID_FILEPATH));
     }
     close(fd);
     return 0;