/*
* 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
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
{
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.
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 ... */
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 */
/* 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);
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;
}
static afs_int32
-SetClientCreds(struct clientcred *creds, afs_int32 * groups)
+SetClientCreds(struct clientcred *creds, afs_uint32 * groups)
{
afs_int32 ngroups;