sys: Tidy up header includes
[openafs.git] / src / sys / rmtsysc.c
index a7ad054..d5f0292 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
+#include <roken.h>
 
-#include <errno.h>
 #include <limits.h>
-#include <sys/types.h>
+
 #include <afs/vice.h>
-#ifdef AFS_NT40_ENV
-#include <winsock2.h>
-#else
-#include <netdb.h>
-#include <netinet/in.h>
-#include <sys/file.h>
-#endif
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
 #include <rx/xdr.h>
+
 #include "rmtsys.h"
+#include "sys_prototypes.h"
 
 
 #define        NOPAG       0xffffffff  /* Also defined in afs/afs.h */
 static afs_int32 hostAddr = 0;
 static int hostAddrLookup = 0;
 char *afs_server = 0, server_name[128];
-static afs_int32 SetClientCreds();
+static afs_int32 SetClientCreds(struct clientcred *creds, afs_uint32 * groups);
 int afs_get_pag_from_groups(afs_uint32 g0, afs_uint32 g1);
 void afs_get_groups_from_pag(afs_uint32 pag, afs_uint32 * g0p, afs_uint32 * g1p);
 
-/* Picks up the name of the remote afs client host where the rmtsys 
+/* Picks up the name of the remote afs client host where the rmtsys
  * daemon resides. Since the clients may be diskless and/or readonly
  * ones we felt it's better to rely on an shell environment
  * (AFSSERVER) for the host name first. If that is not set, the
@@ -57,8 +44,7 @@ void afs_get_groups_from_pag(afs_uint32 pag, afs_uint32 * g0p, afs_uint32 * g1p)
 afs_int32
 GetAfsServerAddr(char *syscall)
 {
-    register struct hostent *th;
-    char *getenv();
+    struct hostent *th;
 
     if (hostAddrLookup) {
        /* Take advantage of caching and assume that the remote host
@@ -158,7 +144,8 @@ setpag(void)
 {
     struct rx_connection *conn;
     clientcred creds;
-    afs_int32 errorcode, errornumber, newpag, ngroups, j, groups[NGROUPS_MAX];
+    afs_int32 errorcode, errornumber, newpag, ngroups, j;
+    afs_uint32 groups[NGROUPS_MAX];
 
     if (!(conn = rx_connection(&errorcode, "setpag"))) {
        /* Remote call can't be performed for some reason.
@@ -219,10 +206,6 @@ pioctl(char *path, afs_int32 cmd, struct ViceIoctl *data, afs_int32 follow)
     afs_uint32 groups[NGROUPS_MAX];
     rmtbulk InData, OutData;
     char pathname[256], *pathp = pathname, *inbuffer;
-#if 0/*ndef HAVE_GETCWD*/      /* XXX enable when autoconf happens */
-    extern char *getwd();
-#define getcwd(x,y) getwd(x)
-#endif
     if (!(conn = rx_connection(&errorcode, "pioctl"))) {
        /* Remote call can't be performed for some reason.
         * Try the local 'pioctl' system call ... */
@@ -241,8 +224,14 @@ pioctl(char *path, afs_int32 cmd, struct ViceIoctl *data, afs_int32 follow)
     InData.rmtbulk_len = data->in_size;
     InData.rmtbulk_val = inbuffer;
     inparam_conversion(cmd, InData.rmtbulk_val, 0);
-    OutData.rmtbulk_len = data->out_size;
-    OutData.rmtbulk_val = data->out;
+
+    OutData.rmtbulk_len = MAXBUFFERLEN * sizeof(*OutData.rmtbulk_val);
+    OutData.rmtbulk_val = malloc(OutData.rmtbulk_len);
+    if (!OutData.rmtbulk_val) {
+       free(inbuffer);
+       return -1;
+    }
+
     /* We always need to pass absolute pathnames to the remote pioctl since we
      * lose the current directory value when doing an rpc call. Below we
      * prepend the current absolute path directory, if the name is relative */
@@ -251,8 +240,8 @@ pioctl(char *path, afs_int32 cmd, struct ViceIoctl *data, afs_int32 follow)
            /* assuming relative path name */
            if (getcwd(pathname, 256) == NULL) {
                free(inbuffer);
-               printf("getwd failed; exiting\n");
-               exit(1);
+               printf("getwd failed\n");
+               return -1;
            }
            strcpy(pathname + strlen(pathname), "/");
            strcat(pathname, path);
@@ -279,8 +268,15 @@ pioctl(char *path, afs_int32 cmd, struct ViceIoctl *data, afs_int32 follow)
     if (!errorcode) {
        /* Do the conversions back to the host order; store the results back
         * on the same buffer */
-       outparam_conversion(cmd, OutData.rmtbulk_val, 1);
+       if (data->out_size < OutData.rmtbulk_len) {
+           errno = EINVAL;
+           errorcode = -1;
+       } else {
+           memcpy(data->out, OutData.rmtbulk_val, data->out_size);
+           outparam_conversion(cmd, data->out, 1);
+       }
     }
+    free(OutData.rmtbulk_val);
     free(inbuffer);
     return errorcode;
 }
@@ -323,7 +319,7 @@ afs_get_groups_from_pag(afs_uint32 pag, afs_uint32 * g0p, afs_uint32 * g1p)
 
 
 static afs_int32
-SetClientCreds(struct clientcred *creds, afs_int32 * groups)
+SetClientCreds(struct clientcred *creds, afs_uint32 * groups)
 {
     afs_int32 ngroups;