/*
* 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>
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#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];
-afs_int32 host;
-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
if (!(afs_server = getenv("AFSSERVER"))) {
char *home_dir;
FILE *fp;
- int len;
+ int len = 0;
if (!(home_dir = getenv("HOME"))) {
/* Our last chance is the "/.AFSSERVER" file */
if (fp == 0) {
return 0;
}
- fgets(server_name, 128, fp);
- fclose(fp);
} else {
- char pathname[256];
+ char *pathname;
- sprintf(pathname, "%s/%s", home_dir, ".AFSSERVER");
+ len = asprintf(&pathname, "%s/%s", home_dir, ".AFSSERVER");
+ if (len < 0 || pathname == NULL)
+ return 0;
fp = fopen(pathname, "r");
+ free(pathname);
+
if (fp == 0) {
/* Our last chance is the "/.AFSSERVER" file */
fp = fopen("/.AFSSERVER", "r");
return 0;
}
}
- fgets(server_name, 128, fp);
- fclose(fp);
}
- len = strlen(server_name);
+ if (fgets(server_name, 128, fp) != NULL)
+ len = strlen(server_name);
+ fclose(fp);
if (len == 0) {
return 0;
}
{
struct rx_connection *conn;
struct rx_securityClass *null_securityObject;
+ afs_int32 host;
if (!(host = GetAfsServerAddr(syscall))) {
*errorcode = -1;
null_securityObject = rxnull_NewClientSecurityObject();
conn =
rx_NewConnection(host, htons(AFSCONF_RMTSYSPORT), RMTSYS_SERVICEID,
- null_securityObject, 0);
+ null_securityObject, RX_SECIDX_NULL);
if (!conn) {
printf("Unable to make a new connection\n");
*errorcode = -1;
/* WARNING: The calling program (i.e. klog) MUST be suid-root since we need to
* do a setgroups(2) call with the new pag.... */
-#ifdef AFS_DUX40_ENV
-#pragma weak setpag = afs_setpag
-int
-afs_setpag(void)
-#else
int
setpag(void)
-#endif
{
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.
/* Remote pioctl(2) client routine */
-#ifdef AFS_DUX40_ENV
-#pragma weak pioctl = afs_pioctl
-int
-afs_pioctl(char *path, afs_int32 cmd, struct ViceIoctl *data,
- afs_int32 follow)
-#else
int
pioctl(char *path, afs_int32 cmd, struct ViceIoctl *data, afs_int32 follow)
-#endif
{
struct rx_connection *conn;
clientcred creds;
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 ... */
return errorcode;
}
(void)SetClientCreds(&creds, groups);
-#ifdef AFS_OSF_ENV
- if (!ins)
- ins = 1;
-#endif
- if (!(inbuffer = (char *)malloc(ins)))
+ if (!(inbuffer = malloc(ins)))
return (-1); /* helpless here */
if (data->in_size)
memcpy(inbuffer, data->in, data->in_size);
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;
}
return NOPAG;
}
-
+void
afs_get_groups_from_pag(afs_uint32 pag, afs_uint32 * g0p, afs_uint32 * g1p)
{
unsigned short g0, g1;
static afs_int32
-SetClientCreds(struct clientcred *creds, afs_int32 * groups)
+SetClientCreds(struct clientcred *creds, afs_uint32 * groups)
{
afs_int32 ngroups;