/*
* 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>
+#include <afs/stds.h>
-RCSID
- ("$Header$");
+#include <afs/procmgmt.h>
+#include <roken.h>
+#include <afs/opr.h>
-#include <afs/stds.h>
-#ifdef AFS_AIX32_ENV
-#include <signal.h>
-#endif
-#include <sys/types.h>
#ifdef AFS_NT40_ENV
-#include <winsock2.h>
#include <WINNT/afsevent.h>
-#include <fcntl.h>
-#include <io.h>
-#include <afs/dirent.h>
-#include <afs/procmgmt.h>
-#else
-#include <netdb.h>
-#include <netinet/in.h>
-#include <sys/file.h>
-#include <dirent.h>
#endif
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
+
+#ifdef AFS_AIX_ENV
+#include <sys/statfs.h>
#endif
-#include <sys/stat.h>
-#include <errno.h>
-#include <stdio.h>
+
#include <rx/xdr.h>
#include <rx/rx.h>
#include <rx/rxkad.h>
#include <afs/afsutil.h>
#include <afs/fileutil.h>
#include <afs/com_err.h>
-#ifdef AFS_AIX_ENV
-#include <sys/statfs.h>
-#endif
+
#include "update.h"
#include "global.h"
-extern int UPDATE_ExecuteRequest();
-
static int AddObject(char **expPath, char *dir);
static int PathInDirectory(char *dir, char *path);
+int update_SendFile(int, struct rx_call *, struct stat *);
+int update_SendDirInfo(char *, struct rx_call *, struct stat *,
+ char *origDir);
struct afsconf_dir *cdir;
int nDirs;
int dirLevel[MAXENTRIES];
char *whoami;
-static int Quit();
+static int Quit(char *);
int rxBind = 0;
/*
* PathInDirectory() -- determine if path is in directory (or is directory)
+ * Returns 1 if yes, 0 if no, -1 on error.
*/
static int
PathInDirectory(char *dir, char *path)
{
- int inDir = 0;
+ int inDir = 0, code;
size_t dirLen;
- char dirNorm[AFSDIR_PATH_MAX], pathNorm[AFSDIR_PATH_MAX];
+ char *dirNorm, *pathNorm;
#ifdef AFS_NT40_ENV
/* case-insensitive comparison of normalized, same-flavor (short) paths */
DWORD status;
+ dirNorm = malloc(AFSDIR_PATH_MAX);
+ if (dirNorm == NULL)
+ return -1;
status = GetShortPathName(dir, dirNorm, AFSDIR_PATH_MAX);
if (status == 0 || status > AFSDIR_PATH_MAX) {
/* can't convert path to short version; just use long version */
- strcpy(dirNorm, dir);
+ free(dirNorm);
+ dirNorm = strdup(dir);
+ if (dirNorm == NULL)
+ return -1;
}
FilepathNormalize(dirNorm);
+ pathNorm = malloc(AFSDIR_PATH_MAX);
+ if (pathNorm == NULL) {
+ code = -1;
+ goto out;
+ }
status = GetShortPathName(path, pathNorm, AFSDIR_PATH_MAX);
if (status == 0 || status > AFSDIR_PATH_MAX) {
/* can't convert path to short version; just use long version */
- strcpy(pathNorm, path);
+ free(pathNorm);
+ pathNorm = strdup(path);
+ if (pathNorm == NULL) {
+ code = -1;
+ goto out;
+ }
}
FilepathNormalize(pathNorm);
}
#else
/* case-sensitive comparison of normalized paths */
- strcpy(dirNorm, dir);
+ dirNorm = strdup(dir);
+ if (dirNorm == NULL)
+ return -1;
FilepathNormalize(dirNorm);
- strcpy(pathNorm, path);
+ pathNorm = strdup(path);
+ if (pathNorm == NULL) {
+ code = -1;
+ goto out;
+ }
FilepathNormalize(pathNorm);
dirLen = strlen(dirNorm);
}
}
#endif /* AFS_NT40_ENV */
- return inDir;
+ code = 0;
+out:
+ free(dirNorm);
+ free(pathNorm);
+ return (code != 0) ? code : inDir;
}
int
AuthOkay(struct rx_call *call, char *name)
{
- int i;
+ int i, r;
rxkad_level level;
afs_int32 code;
int matches;
if (!afsconf_SuperUser(cdir, call, NULL))
return 0;
- if (rx_SecurityClassOf(rx_ConnectionOf(call)) == 2) {
- code = rxkad_GetServerInfo(call->conn, &level, 0, 0, 0, 0, 0);
+ if (rx_SecurityClassOf(rx_ConnectionOf(call)) == RX_SECIDX_KAD) {
+ code = rxkad_GetServerInfo(rx_ConnectionOf(call), &level, 0, 0, 0, 0, 0);
if (code)
return 0;
} else
matches = 0;
for (i = 0; i < nDirs; i++) {
- if (PathInDirectory(dirName[i], name)) {
+ r = PathInDirectory(dirName[i], name);
+ if (r < 0)
+ return 0;
+ if (r) {
if (dirLevel[i] > level)
return 0;
matches++;
}
int
-osi_audit()
+osi_audit(void)
{
/* this sucks but it works for now.
*/
int
main(int argc, char *argv[])
{
- struct rx_securityClass *securityObjects[3];
+ struct rx_securityClass **securityClasses;
+ afs_int32 numClasses;
struct rx_service *service;
afs_uint32 host = htonl(INADDR_ANY);
#ifdef AFS_AIX32_ENV
/*
- * The following signal action for AIX is necessary so that in case of a
- * crash (i.e. core is generated) we can include the user's data section
+ * The following signal action for AIX is necessary so that in case of a
+ * crash (i.e. core is generated) we can include the user's data section
* in the core dump. Unfortunately, by default, only a partial core is
* generated which, in many cases, isn't too useful.
*/
usage:
Quit("Usage: upserver [<directory>+] [-crypt <directory>+] [-clear <directory>+] [-auth <directory>+] [-rxbind] [-help]\n");
} else {
- int dirlen;
if (nDirs >= sizeof(dirName) / sizeof(dirName[0]))
Quit("Too many dirs");
- dirlen = strlen(argv[a]);
if (AddObject(&dirName[nDirs], argv[a])) {
printf("%s: Unable to export dir %s. Skipping\n", whoami,
argv[a]);
if (rxBind) {
afs_int32 ccode;
-#ifndef AFS_NT40_ENV
- if (AFSDIR_SERVER_NETRESTRICT_FILEPATH ||
+ if (AFSDIR_SERVER_NETRESTRICT_FILEPATH ||
AFSDIR_SERVER_NETINFO_FILEPATH) {
char reason[1024];
- ccode = parseNetFiles(SHostAddrs, NULL, NULL,
- ADDRSPERSITE, reason,
- AFSDIR_SERVER_NETINFO_FILEPATH,
- AFSDIR_SERVER_NETRESTRICT_FILEPATH);
- } else
-#endif
+ ccode = afsconf_ParseNetFiles(SHostAddrs, NULL, NULL,
+ ADDRSPERSITE, reason,
+ AFSDIR_SERVER_NETINFO_FILEPATH,
+ AFSDIR_SERVER_NETRESTRICT_FILEPATH);
+ } else
{
ccode = rx_getAllAddr(SHostAddrs, ADDRSPERSITE);
}
- if (ccode == 1)
+ if (ccode == 1)
host = SHostAddrs[0];
}
if (rx_InitHost(host, htons(AFSCONF_UPDATEPORT)) < 0)
Quit("rx_init");
- /* Create a single security object, in this case the null security object,
- * for unauthenticated connections, which will be used to control security
- * on connections made to this server. */
-
- /* WHAT A JOKE! Let's use rxkad at least so we know who we're talking to,
- * then sometimes require full encryption. */
-
- /* rxnull and rxvab are no longer supported */
- securityObjects[0] = rxnull_NewServerSecurityObject();
-
- securityObjects[1] = (struct rx_securityClass *)0;
+ afsconf_BuildServerSecurityObjects(cdir, &securityClasses, &numClasses);
- securityObjects[2] =
- rxkad_NewServerSecurityObject(rxkad_clear, cdir, afsconf_GetKey, 0);
- if (securityObjects[2] == (struct rx_securityClass *)0)
+ if (securityClasses[2] == NULL)
Quit("rxkad_NewServerSecurityObject");
/* Instantiate a single UPDATE service. The rxgen-generated procedure
* which is called to decode requests is passed in here
* (UPDATE_ExecuteRequest). */
service =
- rx_NewServiceHost(host, 0, UPDATE_SERVICEID, "UPDATE", securityObjects,
- 3, UPDATE_ExecuteRequest);
+ rx_NewServiceHost(host, 0, UPDATE_SERVICEID, "UPDATE", securityClasses,
+ numClasses, UPDATE_ExecuteRequest);
if (service == (struct rx_service *)0)
Quit("rx_NewService");
rx_SetMaxProcs(service, 2);
}
static int
-Quit(msg, a, b)
- char *msg;
+Quit(char *msg)
{
- fprintf(stderr, msg, a, b);
+ fprintf(stderr, "%s", msg);
exit(1);
}
int
-update_SendFile(register int fd, register struct rx_call *call, register struct stat *status)
+update_SendFile(int fd, struct rx_call *call, struct stat *status)
{
char *buffer = (char *)0;
int blockSize;
blockSize = status->st_blksize;
#endif
length = status->st_size;
- buffer = (char *)malloc(blockSize);
+ buffer = malloc(blockSize);
if (!buffer) {
printf("malloc failed\n");
return UPDATE_ERROR;
}
tlen = htonl(length);
- rx_Write(call, &tlen, sizeof(afs_int32)); /* send length on fetch */
+ rx_Write(call, (char *)&tlen, sizeof(afs_int32)); /* send length on fetch */
while (!error && length) {
- register int nbytes = (length > blockSize ? blockSize : length);
+ int nbytes = (length > blockSize ? blockSize : length);
nbytes = read(fd, buffer, nbytes);
if (nbytes <= 0) {
fprintf(stderr, "File system read failed\n");
return error;
}
-/* Enumerate dir (name) and write dir entry info into temp file.
+/* Enumerate dir (name) and write dir entry info into temp file.
*/
int
update_SendDirInfo(char *name, /* Name of dir to enumerate */
- register struct rx_call *call, /* rx call */
- register struct stat *status, /* stat struct for dir */
+ struct rx_call *call, /* rx call */
+ struct stat *status, /* stat struct for dir */
char *origDir) /* orig name of dir before being localized */
{
DIR *dirp;
struct dirent *dp;
FILE *stream;
struct stat tstatus;
- char filename[MAXSIZE], dirInfoFile[MAXSIZE];
+ char filename[MAXFNSIZE], dirInfoFile[MAXFNSIZE];
int fd, tfd, errcode, error, err;
error = 0;
goto fail;
}
if ((tstatus.st_mode & S_IFMT) != S_IFDIR) { /* not a directory */
- char dirEntry[MAXSIZE];
+ char dirEntry[MAXFNSIZE];
strcpy(dirEntry, origDir);
strcat(dirEntry, "/");
/* AddObject() - Adds the object to the list of exported objects after
* converting to a local path.
*
- * expPath : points to allocated storage in which the exportable path is
+ * expPath : points to allocated storage in which the exportable path is
* passed back.
- * dir : dir name passed in for export
+ * dir : dir name passed in for export
*
*/
static int