#include <sys/types.h>
#include <afs/procmgmt.h> /* signal(), kill(), wait(), etc. */
#include <sys/stat.h>
-#ifdef AFS_NT40_ENV
#include <fcntl.h>
+#ifdef AFS_NT40_ENV
#include <io.h>
#include <windows.h>
#include <WINNT/afsevent.h>
#endif
#include <rx/rx_globals.h>
+#ifdef O_LARGEFILE
+#define afs_stat stat64
+#define afs_fstat fstat64
+#define afs_open open64
+#define afs_fopen fopen64
+#else /* !O_LARGEFILE */
+#define afs_stat stat
+#define afs_fstat fstat
+#define afs_open open
+#define afs_fopen fopen
+#endif /* !O_LARGEFILE */
extern int BreakVolumeCallBacks(), InitCallBack();
extern int BreakVolumeCallBacks(), InitCallBack(), BreakLaterCallBacks();
extern int GetKeysFromToken();
extern int RXAFS_ExecuteRequest();
extern int RXSTATS_ExecuteRequest();
+afs_int32 Do_VLRegisterRPC();
int eventlog = 0, rxlog = 0;
FILE *debugFile;
CheckDescriptors()
{
#ifndef AFS_NT40_ENV
- struct stat status;
+ struct afs_stat status;
register int tsize = getdtablesize();
register int i;
for (i = 0; i < tsize; i++) {
- if (fstat(i, &status) != -1) {
+ if (afs_fstat(i, &status) != -1) {
printf("%d: dev %x, inode %u, length %u, type/mode %x\n", i,
status.st_dev, status.st_ino, status.st_size,
status.st_mode);
#if defined(AFS_PTHREAD_ENV)
softsig_signal(SIGTERM, CheckDescriptors_Signal);
#else
- signal(SIGTERM, CheckDescriptors_Signal);
+ (void)signal(SIGTERM, CheckDescriptors_Signal);
#endif
#endif
}
+#if defined(AFS_PTHREAD_ENV)
+char *
+threadNum(void)
+{
+ return pthread_getspecific(rx_thread_id_key);
+}
+#endif
/* proc called by rxkad module to get a key */
static int
CheckAdminName()
{
int fd = 0;
- struct stat status;
+ struct afs_stat status;
- if ((stat("/AdminName", &status)) || /* if file does not exist */
+ if ((afs_stat("/AdminName", &status)) || /* if file does not exist */
(status.st_size <= 0) || /* or it is too short */
(status.st_size >= (MAXADMINNAME)) || /* or it is too long */
- !(fd = open("/AdminName", O_RDONLY, 0))) { /* or the open fails */
+ !(fd = afs_open("/AdminName", O_RDONLY, 0))) { /* or the open fails */
strcpy(adminName, "System:Administrators"); /* use the default name */
} else {
(void)read(fd, adminName, status.st_size); /* use name from the file */
Do_VLRegisterRPC();
/* Force wakeup in case we missed something; pthreads does timedwait */
#ifndef AFS_PTHREAD_ENV
- LWP_NoYieldSignal(&fsync_wait);
+ LWP_NoYieldSignal(fsync_wait);
#endif
if (printBanner && (++msg & 1)) { /* Every 10 minutes */
time_t now = FT_ApproxTime();
assert(pthread_mutex_init(&fsync_glock_mutex, NULL) == 0);
#endif
- FSYNC_LOCK while (1) {
+ while (1) {
+ FSYNC_LOCK;
#ifdef AFS_PTHREAD_ENV
/* rounding is fine */
fsync_next.tv_nsec = 0;
if (code != 0 && code != ETIMEDOUT)
ViceLog(0, ("pthread_cond_timedwait returned %d\n", code));
#else /* AFS_PTHREAD_ENV */
- if ((code = LWP_WaitProcess(&fsync_wait)) != LWP_SUCCESS)
+ if ((code = LWP_WaitProcess(fsync_wait)) != LWP_SUCCESS)
ViceLog(0, ("LWP_WaitProcess returned %d\n", code));
#endif /* AFS_PTHREAD_ENV */
+ FSYNC_UNLOCK;
ViceLog(2, ("Checking for fsync events\n"));
do {
code = BreakLaterCallBacks();
ShutDownAndCore(int dopanic)
{
time_t now = time(0);
- char *tstr;
char tbuffer[32];
ViceLog(0,
/* default supports help flag */
strcpy(buffer, "Usage: fileserver ");
+ strcpy(buffer, "[-auditlog <log path>] ");
strcat(buffer, "[-d <debug level>] ");
strcat(buffer, "[-p <number of processes>] ");
strcat(buffer, "[-spare <number of spare blocks>] ");
strcat(buffer, "[-rxpck <number of rx extra packets>] ");
strcat(buffer, "[-rxdbg (enable rx debugging)] ");
strcat(buffer, "[-rxdbge (enable rxevent debugging)] ");
+#if AFS_PTHREAD_ENV
+ strcat(buffer, "[-vattachpar <number of volume attach threads>] ");
+#endif
#ifdef AFS_AIX32_ENV
strcat(buffer, "[-m <min percentage spare in partition>] ");
#endif
strcat(buffer, "[-realm <Kerberos realm name>] ");
strcat(buffer, "[-udpsize <size of socket buffer in bytes>] ");
strcat(buffer, "[-sendsize <size of send buffer in bytes>] ");
+ strcat(buffer, "[-abortthreshold <abort threshold>] ");
/* strcat(buffer, "[-enable_peer_stats] "); */
/* strcat(buffer, "[-enable_process_stats] "); */
strcat(buffer, "[-help]\n");
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-d")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -d\n");
+ return -1;
+ }
debuglevel = atoi(argv[++i]);
LogLevel = debuglevel;
} else if (!strcmp(argv[i], "-banner")) {
printBanner = 1;
} else if (!strcmp(argv[i], "-implicit")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -implicit\n");
+ return -1;
+ }
implicitAdminRights = ParseRights(argv[++i]);
if (implicitAdminRights < 0)
return implicitAdminRights;
int lwps_max =
max_fileserver_thread() - FILESERVER_HELPER_THREADS;
Sawlwps = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -p\n");
+ return -1;
+ }
lwps = atoi(argv[++i]);
if (lwps > lwps_max)
lwps = lwps_max;
lwps = 6;
} else if (!strcmp(argv[i], "-b")) {
Sawbufs = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -b\n");
+ return -1;
+ }
buffs = atoi(argv[++i]);
} else if (!strcmp(argv[i], "-l")) {
Sawlarge = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -l\n");
+ return -1;
+ }
large = atoi(argv[++i]);
} else if (!strcmp(argv[i], "-vc")) {
SawVC = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -vc\n");
+ return -1;
+ }
volcache = atoi(argv[++i]);
} else if (!strcmp(argv[i], "-novbc")) {
novbc = 1;
} else if (!strcmp(argv[i], "-rxpck")) {
Sawrxpck = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -rxpck\n");
+ return -1;
+ }
rxpackets = atoi(argv[++i]);
+#ifdef AFS_PTHREAD_ENV
+ } else if (!strcmp(argv[i], "-vattachpar")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -vattachpar\n");
+ return -1;
+ }
+ vol_attach_threads = atoi(argv[++i]);
+#endif /* AFS_PTHREAD_ENV */
} else if (!strcmp(argv[i], "-s")) {
Sawsmall = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -s\n");
+ return -1;
+ }
nSmallVns = atoi(argv[++i]);
} else if (!strcmp(argv[i], "-abortthreshold")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -abortthreshold\n");
+ return -1;
+ }
abort_threshold = atoi(argv[++i]);
- } else if (!strcmp(argv[i], "-k"))
+ } else if (!strcmp(argv[i], "-k")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -k\n");
+ return -1;
+ }
stack = atoi(argv[++i]);
+ }
#if defined(AFS_SGI_ENV)
else if (!strcmp(argv[i], "-lock")) {
SawLock = 1;
}
#endif
else if (!strcmp(argv[i], "-spare")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -spare\n");
+ return -1;
+ }
BlocksSpare = atoi(argv[++i]);
SawSpare = 1;
} else if (!strcmp(argv[i], "-pctspare")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -pctspare\n");
+ return -1;
+ }
PctSpare = atoi(argv[++i]);
BlocksSpare = 0; /* has non-zero default */
SawPctSpare = 1;
- } else if (!strcmp(argv[i], "-w"))
+ } else if (!strcmp(argv[i], "-w")) {
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -w\n");
+ return -1;
+ }
fiveminutes = atoi(argv[++i]);
- else if (!strcmp(argv[i], "-hr")) {
- int hr = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "-hr")) {
+ int hr;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -hr\n");
+ return -1;
+ }
+ hr = atoi(argv[++i]);
if ((hr < 1) || (hr > 36)) {
printf
("host acl refresh interval of %d hours is invalid; hours must be between 1 and 36\n\n",
eventlog = 1;
else if (!strcmp(argv[i], "-cb")) {
Sawcbs = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -cb\n");
+ return -1;
+ }
numberofcbs = atoi(argv[++i]);
if ((numberofcbs < 10000) || (numberofcbs > 2147483647)) {
printf
}
} else if (!strcmp(argv[i], "-busyat")) {
Sawbusy = 1;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -busyat\n");
+ return -1;
+ }
busy_threshold = atoi(argv[++i]);
if (busy_threshold < 10) {
printf
#ifdef AFS_AIX32_ENV
else if (!strcmp(argv[i], "-m")) {
extern int aixlow_water;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -m\n");
+ return -1;
+ }
aixlow_water = atoi(argv[++i]);
if ((aixlow_water < 0) || (aixlow_water > 30)) {
printf("space reserved %d% invalid; must be between 0-30%\n",
else if (!strcmp(argv[i], "-nojumbo")) {
rxJumbograms = 0;
} else if (!strcmp(argv[i], "-realm")) {
- extern char local_realm[AFS_REALM_SZ];
+ extern char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
+ extern int num_lrealms;
+ if ((i + 1) >= argc) {
+ fprintf(stderr, "missing argument for -realm\n");
+ return -1;
+ }
if (strlen(argv[++i]) >= AFS_REALM_SZ) {
printf
("-realm argument must contain fewer than %d characters.\n",
AFS_REALM_SZ);
return -1;
}
- strncpy(local_realm, argv[i], AFS_REALM_SZ);
+ if (num_lrealms == -1)
+ num_lrealms = 0;
+ if (num_lrealms >= AFS_NUM_LREALMS) {
+ printf
+ ("a maximum of %d -realm arguments can be specified.\n",
+ AFS_NUM_LREALMS);
+ return -1;
+ }
+ strncpy(local_realms[num_lrealms++], argv[i], AFS_REALM_SZ);
} else if (!strcmp(argv[i], "-udpsize")) {
if ((i + 1) >= argc) {
printf("You have to specify -udpsize <integer value>\n");
} else if (!strcmp(argv[i], "-enable_process_stats")) {
rx_enableProcessRPCStats();
}
+ else if (strcmp(argv[i], "-auditlog") == 0) {
+ int tempfd, flags;
+ FILE *auditout;
+ char oldName[MAXPATHLEN];
+ char *fileName = argv[++i];
+
+#ifndef AFS_NT40_ENV
+ struct stat statbuf;
+
+ if ((lstat(fileName, &statbuf) == 0)
+ && (S_ISFIFO(statbuf.st_mode))) {
+ flags = O_WRONLY | O_NONBLOCK;
+ } else
+#endif
+ {
+ strcpy(oldName, fileName);
+ strcat(oldName, ".old");
+ renamefile(fileName, oldName);
+ flags = O_WRONLY | O_TRUNC | O_CREAT;
+ }
+ tempfd = open(fileName, flags, 0666);
+ if (tempfd > -1) {
+ auditout = fdopen(tempfd, "a");
+ if (auditout) {
+ osi_audit_file(auditout);
+ } else
+ printf("Warning: auditlog %s not writable, ignored.\n", fileName);
+ } else
+ printf("Warning: auditlog %s not writable, ignored.\n", fileName);
+ }
#ifndef AFS_NT40_ENV
else if (strcmp(argv[i], "-syslog") == 0) {
/* set syslog logging flag */
serverLogSyslogFacility = atoi(argv[i] + 8);
}
#endif
+ else if (strcmp(argv[i], "-mrafslogs") == 0) {
+ /* set syslog logging flag */
+ mrafsStyleLogs = 1;
+ }
else {
return (-1);
}
static void
NewParms(int initializing)
{
- static struct stat sbuf;
+ static struct afs_stat sbuf;
register int i, fd;
char *parms;
char *argv[MAXPARMS];
register int argc;
- if (!(stat("/vice/file/parms", &sbuf))) {
+ if (!(afs_stat("/vice/file/parms", &sbuf))) {
parms = (char *)malloc(sbuf.st_size);
if (!parms)
return;
- fd = open("parms", O_RDONLY, 0666);
+ fd = afs_open("parms", O_RDONLY, 0666);
if (fd <= 0) {
ViceLog(0, ("Open for parms failed with errno = %d\n", errno));
return;
{
afs_int32 fd, nentries, i;
struct versionStamp vsn;
- struct stat status;
+ struct afs_stat status;
afsUUID uuid;
- if ((stat(AFSDIR_SERVER_SYSID_FILEPATH, &status))
+ if ((afs_stat(AFSDIR_SERVER_SYSID_FILEPATH, &status))
|| (status.st_size <= 0)) {
ViceLog(0, ("%s: doesn't exist\n", AFSDIR_SERVER_SYSID_FILEPATH));
return ENOENT;
}
- if (!(fd = open(AFSDIR_SERVER_SYSID_FILEPATH, O_RDONLY, 0))) {
+ if (!(fd = afs_open(AFSDIR_SERVER_SYSID_FILEPATH, O_RDONLY, 0))) {
ViceLog(0,
("%s: can't open (%d)\n", AFSDIR_SERVER_SYSID_FILEPATH,
errno));
afs_int32
WriteSysIdFile()
{
- afs_int32 fd, nentries, i;
+ afs_int32 fd, i;
struct versionStamp vsn;
- struct stat status;
+ struct afs_stat status;
afsUUID uuid;
- if (!stat(AFSDIR_SERVER_SYSID_FILEPATH, &status)) {
+ if (!afs_stat(AFSDIR_SERVER_SYSID_FILEPATH, &status)) {
/*
* File exists; keep the old one around
*/
renamefile(AFSDIR_SERVER_SYSID_FILEPATH,
AFSDIR_SERVER_OLDSYSID_FILEPATH);
}
- fd = open(AFSDIR_SERVER_SYSID_FILEPATH, O_WRONLY | O_TRUNC | O_CREAT,
- 0666);
+ fd = afs_open(AFSDIR_SERVER_SYSID_FILEPATH, O_WRONLY | O_TRUNC | O_CREAT,
+ 0666);
if (fd < 1) {
ViceLog(0,
("%s: can't create (%d)\n", AFSDIR_SERVER_SYSID_FILEPATH,
if (code) {
if (code == VL_MULTIPADDR) {
ViceLog(0,
- ("VL_RegisterAddrs rpc failed; The ethernet address exist on a different server; repair it\n"));
+ ("VL_RegisterAddrs rpc failed; The IP address exists on a different server; repair it\n"));
ViceLog(0,
("VL_RegisterAddrs rpc failed; See VLLog for details\n"));
return code;
afs_int32
InitVL()
{
- int (*old) ();
afs_int32 code;
- afs_int32 cnt, i;
extern int rxi_numNetAddrs;
extern afs_uint32 rxi_NetAddrs[];
int
main(int argc, char *argv[])
{
- int i;
afs_int32 code;
- FILE *file;
char tbuffer[32];
struct rx_securityClass *sc[4];
struct rx_service *tservice;
#ifdef AFS_PTHREAD_ENV
- pthread_t parentPid, serverPid;
+ pthread_t serverPid;
pthread_attr_t tattr;
#else /* AFS_PTHREAD_ENV */
PROCESS parentPid, serverPid;
struct rlimit rlim; /* max number of open file descriptors */
#endif
int curLimit;
+ time_t t;
#ifdef AFS_AIX32_ENV
struct sigaction nsa;
sigaction(SIGABRT, &nsa, NULL);
sigaction(SIGSEGV, &nsa, NULL);
#endif
+ osi_audit_init();
/* Initialize dirpaths */
if (!(initAFSDirPath() & AFSDIR_SERVER_PATHS_OK)) {
exit(2);
}
#ifndef AFS_QUIETFS_ENV
- console = fopen("/dev/console", "w");
+ console = afs_fopen("/dev/console", "w");
#endif
if (ParseArgs(argc, argv)) {
NewParms(1);
/* Open FileLog on stdout, stderr, fd 1 and fd2 (for perror), sigh. */
+#ifndef AFS_NT40_ENV
serverLogSyslogTag = "fileserver";
+#endif
OpenLog(AFSDIR_SERVER_FILELOG_FILEPATH);
SetupLogSignals();
V_BreakVolumeCallbacks = BreakVolumeCallBacksLater;
}
+#ifdef AFS_PTHREAD_ENV
+ SetLogThreadNumProgram( threadNum );
+#endif
+
/* initialize libacl routines */
acl_Initialize(ACL_VERSION);
sc[1] = 0; /* rxvab_NewServerSecurityObject(key1, 0) */
sc[2] = rxkad_NewServerSecurityObject(rxkad_clear, NULL, get_key, NULL);
sc[3] = rxkad_NewServerSecurityObject(rxkad_crypt, NULL, get_key, NULL);
- tservice =
- rx_NewService( /* port */ 0, /* service id */ 1, /*service name */
- "AFS",
- /* security classes */ sc, /* numb sec classes */ 4,
- RXAFS_ExecuteRequest);
+ tservice = rx_NewService( /* port */ 0, /* service id */ 1, /*service name */
+ "AFS",
+ /* security classes */ sc,
+ /* numb sec classes */
+ 4, RXAFS_ExecuteRequest);
if (!tservice) {
ViceLog(0,
("Failed to initialize RX, probably two servers running.\n"));
/* Some rx debugging */
if (rxlog || eventlog) {
- debugFile = fopen("rx_dbg", "w");
+ debugFile = afs_fopen("rx_dbg", "w");
if (rxlog)
rx_debugFile = debugFile;
if (eventlog)
TM_GetTimeOfDay(&tp, 0);
#ifndef AFS_QUIETFS_ENV
- if (console != NULL) {
+ if (console != NULL) {
+ time_t t = tp.tv_sec;
fprintf(console, "File server has started at %s\r",
- afs_ctime(&tp.tv_sec, tbuffer, sizeof(tbuffer)));
+ afs_ctime(&t, tbuffer, sizeof(tbuffer)));
}
#endif
} else {
char hoststr[16];
memcpy(&FS_HostAddr_NBO, he->h_addr, 4);
- afs_inet_ntoa_r(FS_HostAddr_NBO, hoststr);
+ (void)afs_inet_ntoa_r(FS_HostAddr_NBO, hoststr);
FS_HostAddr_HBO = ntohl(FS_HostAddr_NBO);
ViceLog(0,
("FileServer %s has address %s (0x%x or 0x%x in host byte order)\n",
#if defined(AFS_PTHREAD_ENV) && !defined(AFS_NT40_ENV)
softsig_signal(SIGQUIT, ShutDown_Signal);
#else
- signal(SIGQUIT, ShutDown_Signal);
+ (void)signal(SIGQUIT, ShutDown_Signal);
#endif
+ t = tp.tv_sec;
ViceLog(0,
("File Server started %s",
- afs_ctime(&tp.tv_sec, tbuffer, sizeof(tbuffer))));
+ afs_ctime(&t, tbuffer, sizeof(tbuffer))));
#if FS_STATS_DETAILED
afs_FullPerfStats.det.epoch.tv_sec = StartTime = tp.tv_sec;
#endif