Add interface to select client security objects
[openafs.git] / src / venus / afsio.c
index 94bde8f..e795e6b 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <afsconfig.h>
 #include <afs/param.h>
+#include <afs/stds.h>
 
 #include <stdio.h>
 #include <setjmp.h>
 #include <string.h>
 #include <ctype.h>
 #ifdef AFS_NT40_ENV
+#include <windows.h>
+#include <winsock2.h>
+#define _CRT_RAND_S
+#include <stdlib.h>
+#include <process.h>
 #include <fcntl.h>
+#include <io.h>
+#include <afs/smb_iocons.h>
+#include <afs/afsd.h>
+#include <afs/cm_ioctl.h>
+#include <afs/pioctl_nt.h>
 #else
 #include <sys/param.h>
 #include <sys/file.h>
 #include <netdb.h>
 #include <string.h>
 #include <fcntl.h>
+#include <pwd.h>
+#include <afs/venus.h>
+#include <sys/time.h>
+#include <netdb.h>
+#include <afs/afsint.h>
+#define FSINT_COMMON_XG 1
 #endif
 #include <sys/stat.h>
 #include <errno.h>
-#include <pwd.h>
 #include <signal.h>
 #include <afs/vice.h>
 #include <afs/cmd.h>
 #include <afs/afsutil.h>
 #include <rx/rx.h>
 #include <rx/xdr.h>
-#include <afs/venus.h>
+#include <afs/afs_consts.h>
 #include <afs/afscbint.h>
-#define FSINT_COMMON_XG 1
-#include <afs/afsint.h>
 #include <afs/vldbint.h>
 #include <afs/vlserver.h>
 #include <afs/volser.h>
@@ -68,7 +82,6 @@
 #include <afs/dir.h>
 #include <afs/nfs.h>
 #include <afs/ihandle.h>
-#include <afs/namei_ops.h>
 #include <afs/vnode.h>
 #include <afs/com_err.h>
 #ifdef HAVE_DIRENT_H
@@ -77,8 +90,6 @@
 #ifdef HAVE_DIRECT_H
 #include <direct.h>
 #endif
-#include <sys/time.h>
-#include <netdb.h>
 #ifdef AFS_DARWIN_ENV
 #include <sys/malloc.h>
 #else
 #include <des_prototypes.h>
 #include <rx_prototypes.h>
 #include "../rxkad/md5.h"
-#define        MAXHOSTS 13
 #ifdef O_LARGEFILE
 #define afs_stat        stat64
 #define afs_fstat       fstat64
@@ -149,7 +159,7 @@ struct connectionLookup {
 struct cellLookup {
     struct cellLookup *next;
     struct afsconf_cell info;
-    struct rx_securityClass *sc[3];
+    struct rx_securityClass *sc;
     afs_int32 scIndex;
 };
 
@@ -176,8 +186,8 @@ struct FsCmdOutputs PioctlOutputs;
 void
 printDatarate(void)
 {
-    seconds = now.tv_sec + now.tv_usec *.000001
-       -opentime.tv_sec - opentime.tv_usec *.000001;
+    seconds = (float)(now.tv_sec + now.tv_usec *.000001
+       -opentime.tv_sec - opentime.tv_usec *.000001);
     if ((seconds - oldseconds) > 30.) {
        afs_int64 tmp;
        tmp = xfered - oldxfered;
@@ -264,7 +274,7 @@ main (int argc, char **argv)
 
 AFS_UNUSED
 afs_int32
-HandleLocalAuth(struct rx_securityClass **sc[3], afs_int32 *scIndex)
+HandleLocalAuth(struct rx_securityClass **sc, afs_int32 *scIndex)
 {
     static struct afsconf_dir *tdir = NULL;
     struct ktc_principal sname;
@@ -275,45 +285,20 @@ HandleLocalAuth(struct rx_securityClass **sc[3], afs_int32 *scIndex)
     char *cell;
     afs_int32 code;
 
+    *sc = NULL;
+    *scIndex = 0;
+
     tdir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
     if (!tdir) {
         fprintf(stderr,"Could not open configuration directory: %s.\n",
                AFSDIR_SERVER_ETC_DIRPATH);
         return -1;
     }
-    cell = tdir->cellName;
-    strcpy(sname.cell, cell);
-    sname.instance[0] = 0;
-    strcpy(sname.name, "afs");
-    code=afsconf_GetLatestKey(tdir, &kvno, &key);
-    if (code) {
-        fprintf(stderr,"afsconf_GetLatestKey returned %d\n", code);
-        return -1;
-    }
-    ttoken.kvno = kvno;
-    des_init_random_number_generator(ktc_to_cblock(&key));
-    code = des_random_key(ktc_to_cblock(&ttoken.sessionKey));
+    code = afsconf_ClientAuth(tdir, sc, &scIndex);
     if (code) {
-        fprintf(stderr,"des_random_key returned %d\n", code);
+        fprintf(stderr,"afsconf_ClientAuth returned %d\n", code);
         return -1;
     }
-    ttoken.ticketLen = MAXKTCTICKETLEN;
-    code = tkt_MakeTicket(ttoken.ticket, &ttoken.ticketLen, &key,
-                         AUTH_SUPERUSER, "", sname.cell,
-                         0, 0xffffffff,
-                         &ttoken.sessionKey, host,
-                         sname.name, sname.instance);
-    if (code)
-        *scIndex = 0;
-    else {
-       *scIndex = 2;
-        *sc[2] = (struct rx_securityClass *)
-           rxkad_NewClientSecurityObject(rxkad_clear,
-                                         &ttoken.sessionKey, ttoken.kvno,
-                                         ttoken.ticketLen, ttoken.ticket);
-    }
-    if (*scIndex == 0)
-       *sc[0] = (struct rx_securityClass *) rxnull_NewClientSecurityObject();
     return 0;
 }
 
@@ -614,7 +599,7 @@ InitializeCBService(void)
 #define LWP_STACK_SIZE (16 * 1024)
     afs_int32 code;
 #ifdef AFS_PTHREAD_ENV
-    pthread_t CBservicePid, parentPid;
+    pthread_t CBservicePid;
     pthread_attr_t tattr;
 #else
     PROCESS CBServiceLWP_ID, parentPid;
@@ -643,8 +628,13 @@ InitializeCBService(void)
     srand48(getpid());
     InitialCBPort = RESTOOL_CBPORT + lrand48() % 1000;
 #else /* AFS_HPUX_ENV */
+#if defined AFS_NT40_ENV
+    srand(_getpid());
+    InitialCBPort = RESTOOL_CBPORT + rand() % 1000;
+#else /* AFS_NT40_ENV */
     srand(getpid());
     InitialCBPort = RESTOOL_CBPORT + rand() % 1000;
+#endif /* AFS_NT40_ENV */
 #endif /* AFS_HPUX_ENV */
 #endif /* AFS_AIX_ENV || AFS_SUN_ENV || AFS_OSF_ENV || AFS_SGI_ENV */
 
@@ -783,7 +773,7 @@ get_vnode_hosts(char *fname, char **cellp, afs_int32 *hosts, AFSFid *Fid,
             i++;
         }
     }
-    for (; i<MAXHOSTS; i++) *h++ = 0;
+    for (; i<AFS_MAXHOSTS; i++) *h++ = 0;
     return 0;
 }
 
@@ -792,7 +782,7 @@ get_vnode_hosts(char *fname, char **cellp, afs_int32 *hosts, AFSFid *Fid,
  *     offer it, and the FID.
  */
 afs_int32
-get_file_cell(char *fn, char **cellp, afs_int32 hosts[MAXHOSTS], AFSFid *Fid,
+get_file_cell(char *fn, char **cellp, afs_int32 hosts[AFS_MAXHOSTS], AFSFid *Fid,
              struct AFSFetchStatus *Status, afs_int32 create)
 {
     afs_int32 code;
@@ -801,7 +791,7 @@ get_file_cell(char *fn, char **cellp, afs_int32 hosts[MAXHOSTS], AFSFid *Fid,
     int j;
     afs_int32 *Tmpafs_int32;
 
-    memset((char *) Status, 0, sizeof(struct AFSFetchStatus));
+    memset( Status, 0, sizeof(struct AFSFetchStatus));
     memset(buf, 0, sizeof(buf));
     status.in_size = 0;
     status.out_size = sizeof(buf);
@@ -850,7 +840,7 @@ get_file_cell(char *fn, char **cellp, afs_int32 hosts[MAXHOSTS], AFSFid *Fid,
                afs_com_err(pnp, code, (char *) 0);
        } else {
            Tmpafs_int32 = (afs_int32 *)buf;
-           for (j=0;j<MAXHOSTS;++j) {
+           for (j=0;j<AFS_MAXHOSTS;++j) {
                hosts[j] = Tmpafs_int32[j];
                if (!Tmpafs_int32[j])
                    break;
@@ -870,30 +860,10 @@ get_file_cell(char *fn, char **cellp, afs_int32 hosts[MAXHOSTS], AFSFid *Fid,
                afs_com_err(pnp, code, (char *) 0);
            }
        } else {
-           afs_int32 saveCommand, saveVolume;
-
            Tmpafs_int32 = (afs_int32 *)buf;
            Fid->Volume = Tmpafs_int32[1];
            Fid->Vnode = Tmpafs_int32[2];
            Fid->Unique = Tmpafs_int32[3];
-           status.in_size = sizeof(struct FsCmdInputs);
-           status.out_size = sizeof(struct FsCmdOutputs);
-           status.in = (char *) &PioctlInputs;
-           status.out = (char *) &PioctlOutputs;
-           saveCommand = PioctlInputs.command;
-           saveVolume = PioctlInputs.fid.Volume;
-           PioctlInputs.command = 0;
-           PioctlInputs.fid.Volume = 0;
-           if (!pioctl(fn, VIOC_FS_CMD, &status, 0))
-               memcpy((char *)Status, &PioctlOutputs.status,
-                     sizeof(struct AFSFetchStatus));
-           PioctlInputs.command = saveCommand;
-           PioctlInputs.fid.Volume = saveVolume;
-           if (create && (Status->Length || Status->Length_hi)) {
-                fprintf(stderr,"AFS file %s not empty, request aborted.\n",
-                       fn);
-                exit(-5);
-           }
        }
     }
     return code;
@@ -931,7 +901,7 @@ readFile(struct cmd_syndesc *as, void *unused)
     char *fname;
     char *cell = 0;
     afs_int32 code;
-    afs_int32 hosts[MAXHOSTS];
+    afs_int32 hosts[AFS_MAXHOSTS];
     AFSFid Fid;
     int i, j;
     struct rx_connection *RXConn;
@@ -982,7 +952,7 @@ readFile(struct cmd_syndesc *as, void *unused)
        return ENOENT;
     }
     cl = FindCell(cell);
-    for (j=0;j<MAXHOSTS;++j) {
+    for (j=0;j<AFS_MAXHOSTS;++j) {
        int useHost;
 
         if (first && as->parms[6].items) {
@@ -998,7 +968,7 @@ readFile(struct cmd_syndesc *as, void *unused)
        }
        first = 0;
         RXConn = FindRXConnection(useHost, htons(AFSCONF_FILEPORT), 1,
-                                 cl->sc[cl->scIndex], cl->scIndex);
+                                 cl->sc, cl->scIndex);
         if (!RXConn) {
             fprintf(stderr,"rx_NewConnection failed to server 0x%X\n",
                     useHost);
@@ -1019,8 +989,8 @@ readFile(struct cmd_syndesc *as, void *unused)
 #endif /* NO_AFS_CLIENT */
         gettimeofday(&opentime, &Timezone);
        if (verbose) {
-            seconds = opentime.tv_sec + opentime.tv_usec *.000001
-               -starttime.tv_sec - starttime.tv_usec *.000001;
+            seconds = (float)(opentime.tv_sec + opentime.tv_usec *.000001
+               -starttime.tv_sec - starttime.tv_usec *.000001);
            fprintf(stderr,"Startup to find the file took %.3f sec.\n",
                    seconds);
        }
@@ -1034,9 +1004,9 @@ readFile(struct cmd_syndesc *as, void *unused)
             tcall = rx_NewCall(RXConn);
             code = StartAFS_FetchData64 (tcall, &Fid, Pos, Len);
             if (code == RXGEN_OPCODE) {
-               afs_uint32 tmpPos,  tmpLen;
-               tmpPos = Pos; tmpLen = Len;
-                code = StartAFS_FetchData (tcall, &Fid, Pos, Len);
+               afs_int32 tmpPos,  tmpLen;
+               tmpPos = (afs_int32)Pos; tmpLen = (afs_int32)Len;
+                code = StartAFS_FetchData (tcall, &Fid, tmpPos, tmpLen);
                bytes = rx_Read(tcall, (char *)&low, sizeof(afs_int32));
                length = ntohl(low);
                if (bytes != 4) code = -3;
@@ -1062,7 +1032,7 @@ readFile(struct cmd_syndesc *as, void *unused)
            if (length > bufflen)
                len = bufflen;
            else
-               len = length;
+               len = (afs_int32) length;
            buf = (char *)malloc(len);
            if (!buf) {
                fprintf(stderr, "couldn't allocate buffer\n");
@@ -1072,7 +1042,7 @@ readFile(struct cmd_syndesc *as, void *unused)
                if (length > bufflen)
                    len = bufflen;
                else
-                   len = length;
+                   len = (afs_int32) length;
                bytes = rx_Read(tcall, (char *) buf, len);
                if (bytes != len) {
                    code = -3;
@@ -1116,8 +1086,8 @@ readFile(struct cmd_syndesc *as, void *unused)
                    htonl(md5int[2]), htonl(md5int[3]), p);
         }
        if(verbose) {
-            seconds = readtime.tv_sec + readtime.tv_usec *.000001
-               -opentime.tv_sec - opentime.tv_usec *.000001;
+            seconds = (float)(readtime.tv_sec + readtime.tv_usec *.000001
+               -opentime.tv_sec - opentime.tv_usec *.000001);
             fprintf(stderr,"Transfer of %llu bytes took %.3f sec.\n",
                    xfered, seconds);
             datarate = (xfered >> 20) / seconds;
@@ -1135,7 +1105,7 @@ writeFile(struct cmd_syndesc *as, void *unused)
     char *fname = NULL;
     char *cell = 0;
     afs_int32 code, localcode = 0;
-    afs_int32 hosts[MAXHOSTS];
+    afs_int32 hosts[AFS_MAXHOSTS];
     afs_uint32 useHost;
     AFSFid Fid;
     int i;
@@ -1145,10 +1115,11 @@ writeFile(struct cmd_syndesc *as, void *unused)
     struct AFSVolSync tsync;
     struct AFSFetchStatus OutStatus;
     struct AFSStoreStatus InStatus;
+    struct AFSCallBack CallBack;
     afs_int64 Pos;
     afs_int64 length, Len, synthlength = 0, offset = 0;
     u_char vnode = 0;
-    int bytes;
+    afs_int64 bytes;
     int worstCode = 0;
     int append = 0;
     int synthesize = 0;
@@ -1193,8 +1164,7 @@ writeFile(struct cmd_syndesc *as, void *unused)
     } else
         code = get_file_cell(fname, &cell, hosts, &Fid, &OutStatus, append ? 0 : 1);
     if (code) {
-      if (code != -5)
-            fprintf(stderr,"File or directory not found: %s\n",
+        fprintf(stderr,"File or directory not found: %s\n",
                     fname);
         return code;
     }
@@ -1210,12 +1180,23 @@ writeFile(struct cmd_syndesc *as, void *unused)
     gettimeofday (&starttime, &Timezone);
     useHost = hosts[0];
     RXConn = FindRXConnection(useHost, htons(AFSCONF_FILEPORT), 1,
-                             cl->sc[cl->scIndex], cl->scIndex);
+                             cl->sc, cl->scIndex);
     if (!RXConn) {
         fprintf(stderr,"rx_NewConnection failed to server 0x%X\n",
                hosts[0]);
         return -1;
     }
+    code = AFS_FetchStatus(RXConn, &Fid, &OutStatus, &CallBack, &tsync);
+    if (code) {
+        fprintf(stderr,"RXAFS_FetchStatus failed to server 0x%X for file %s, code was%d\n",
+                            useHost, fname, code);
+       return -1;
+    }
+    if (!append && (OutStatus.Length || OutStatus.Length_hi)) {
+        fprintf(stderr,"AFS file %s not empty, request aborted.\n", fname);
+       DestroyConnections();
+        return -5;
+    }
     InStatus.Mask = AFS_SETMODE + AFS_FSYNC;
     InStatus.UnixModeBits = 0644;
     if (append) {
@@ -1240,17 +1221,17 @@ writeFile(struct cmd_syndesc *as, void *unused)
        memset(tbuf, 0, sizeof(struct wbuf));
        tbuf->buflen = BUFFLEN;
        if (synthesize) {
-           afs_int32 ll, l = tbuf->buflen;
+           afs_int64 ll, l = tbuf->buflen;
            if (l > synthlength)
                l = synthlength;
            for (ll = 0; ll < l; ll += 4096) {
                 sprintf(&tbuf->buf[ll],"Offset (0x%x, 0x%x)\n",
-                       (unsigned int)(offset >> 32),
-                       (unsigned int)(offset & 0xffffffff) + ll);
+                       (unsigned int)((offset + ll) >> 32),
+                       (unsigned int)((offset + ll) & 0xffffffff));
            }
            offset += l;
            synthlength -= l;
-           tbuf->used = l;
+           tbuf->used = (afs_int32)l;
        } else
            tbuf->used = read(0, &tbuf->buf, tbuf->buflen);
        if (!tbuf->used) {
@@ -1265,8 +1246,8 @@ writeFile(struct cmd_syndesc *as, void *unused)
     }
     gettimeofday(&opentime, &Timezone);
     if (verbose) {
-        seconds = opentime.tv_sec + opentime.tv_usec *.000001
-           -starttime.tv_sec - starttime.tv_usec *.000001;
+        seconds = (float) (opentime.tv_sec + opentime.tv_usec *.000001
+           -starttime.tv_sec - starttime.tv_usec *.000001);
         fprintf(stderr,"Startup to find the file took %.3f sec.\n",
                seconds);
     }
@@ -1279,8 +1260,8 @@ writeFile(struct cmd_syndesc *as, void *unused)
         code = StartAFS_StoreData64 (tcall, &Fid, &InStatus, Pos, Len, Pos+Len);
         if (code == RXGEN_OPCODE) {
            afs_uint32 tmpLen, tmpPos;
-           tmpPos = Pos;
-           tmpLen = Len;
+           tmpPos = (afs_int32) Pos;
+           tmpLen = (afs_int32) Len;
            if (Pos+Len > 0x7fffffff) {
                fprintf(stderr,"AFS fileserver does not support files >= 2 GB\n");
                return EFBIG;
@@ -1340,17 +1321,17 @@ writeFile(struct cmd_syndesc *as, void *unused)
             for (tbuf = bufchain; tbuf; tbuf=tbuf->next) {
                tbuf->offset = 0;
                if (synthesize) {
-                   afs_int32 ll, l = tbuf->buflen;
+                   afs_int64 ll, l = tbuf->buflen;
                    if (l > synthlength)
                        l = synthlength;
                    for (ll = 0; ll < l; ll += 4096) {
-                     sprintf(&tbuf->buf[ll],"Offset (0x%x, 0x%x)\n",
-                             (unsigned int)(offset >> 32),
-                             (unsigned int)(offset & 0xffffffff) + ll);
+                       sprintf(&tbuf->buf[ll],"Offset (0x%x, 0x%x)\n",
+                               (unsigned int)((offset + ll) >> 32),
+                               (unsigned int)((offset + ll) & 0xffffffff));
                    }
                    offset += l;
                    synthlength -= l;
-                   tbuf->used = l;
+                   tbuf->used = (afs_int32) l;
                } else
                    tbuf->used = read(0, &tbuf->buf, tbuf->buflen);
                if (!tbuf->used)
@@ -1366,8 +1347,8 @@ writeFile(struct cmd_syndesc *as, void *unused)
     if (worstCode) {
        fprintf(stderr,"%s failed with code %d\n", as->name, worstCode);
     } else if(verbose) {
-        seconds = writetime.tv_sec + writetime.tv_usec *.000001
-           -opentime.tv_sec - opentime.tv_usec *.000001;
+        seconds = (float) (writetime.tv_sec + writetime.tv_usec *.000001
+           -opentime.tv_sec - opentime.tv_usec *.000001);
         fprintf(stderr,"Transfer of %llu bytes took %.3f sec.\n",
                xfered, seconds);
         datarate = (xfered >> 20) / seconds;
@@ -1446,29 +1427,11 @@ FindCell(char *cellName)
        if (code = VLDBInit(1, &p->info))
             fprintf(stderr,"VLDBInit failed for cell %s\n", p->info.name);
 #endif
-        strcpy((char *)&sname.cell, (char *)&p->info.name);
-        sname.instance[0] = 0;
-        strcpy(sname.name, "afs");
-        code = ktc_GetToken(&sname, &ttoken, sizeof(ttoken), NULL);
-        if (code)
-            p->scIndex = 0;
-        else {
-            if ((ttoken.kvno >= 0) && (ttoken.kvno <= 255))
-               /* this is a kerberos ticket, set scIndex accordingly */
-               p->scIndex = 2;
-           else {
-               fprintf(stderr,"funny kvno (%d) in ticket, proceeding\n",
-                       ttoken.kvno);
-               p->scIndex = 2;
-           }
-           p->sc[2] = (struct rx_securityClass *)
-               rxkad_NewClientSecurityObject(rxkad_clear, &ttoken.sessionKey,
-                                             ttoken.kvno, ttoken.ticketLen,
-                                             ttoken.ticket);
-        }
-        if (p->scIndex == 0)
-            p->sc[0] = (struct rx_securityClass *)
-               rxnull_NewClientSecurityObject();
+       code = afsconf_ClientAuthToken(&p->info, 0, &p->sc, &p->scIndex);
+       if (code) {
+           p->scIndex = 0;
+            p->sc = rxnull_NewClientSecurityObject();
+       }
     }
 
     if (p)