staden-lg/src/bap/actf.c

117 lines
2.6 KiB
C

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "mcspec.h"
#include "fort.h"
/* static error messages for use in actf_() */
static char *actferrlist[] = {
"Error! - stack underflow",
"Error! - unknown JOB to ACTF()",
"Error creating busy file",
"Error deleting busy file",
"Sorry, database busy"
};
/* global variables - exported in actf.h */
int actfptr = 0; /* stack pointer - points to first free location */
/* types */
typedef struct {
char *filename;
} actfstack_t;
/* local variables */
static actfstack_t actfstack[10];
/*
* Display an error either via ERROM() if we've got a KBOUT or to stderr
* otherwise.
*/
static void actferr(int errnum, int_f *KBOUT) {
if (KBOUT)
errom_(KBOUT, actferrlist[errnum-1], strlen(actferrlist[errnum-1]));
else
fprintf(stderr, "%s\n", actferrlist[errnum-1]);
return;
}
/*
* in FORTRAN as INTEGER FUNCTION ACTF(JOB,FILNAM,FILNAMLEN,COPYNUM,KBOUT)
*
* JOB = 1 : lock FILNAM (push filename and copynumber onto stack)
*
* JOB = 2 : unlock last locked file (pull off stack)
* (in this case only trust COPYNUM and KBOUT to contain legal
* and relevant data.)
*
* Locking mechanism done by creating a 'busy' file of format 'FILE_busy'.
*/
int_f actf_(int_f *JOB_p,
char *FILNAM_p,
int_f *FILNAMLEN_p,
char *COPYNUM_p,
int_f *KBOUT,
int_fl FILNAM_l,
int_fl COPYNUM_l)
{
char fname[256], *cptr;
struct stat statbuf;
int fd, i;
if (*JOB_p == 1) {
/* char buf[10]; */
/* copy correct amount of FILNAM_p */
for (i=0; i<*FILNAMLEN_p; i++) {
fname[i] = FILNAM_p[i];
}
strcpy(&fname[i], "_BUSYx");
fname[i+5] = *COPYNUM_p;
/* add data to our stack */
/* actfstack[actfptr].filename = strdup(fname); */
i = strlen(fname);
cptr = actfstack[actfptr].filename = (char *)malloc(i+1);
for (; i>=0; i--)
cptr[i] = fname[i];
/* do the locking */
if (stat(fname, &statbuf) != -1) {
/* lock already exists */
actferr(5, KBOUT);
return 5;
}
if ((fd = open(fname, O_CREAT, 0600)) == -1) {
actferr(3, KBOUT);
return 3;
}
/* fprintf(buf, "%d", getuid()); - wrong... ADDRESS of getuid()
write(fd, buf, sizeof(buf));*/
close(fd);
/* inc stack pointer */
actfptr++;
return 0;
} else if (*JOB_p == 2) {
/* dec stack pointer */
actfptr--;
if (actfptr < 0) {
actferr(1, KBOUT);
return 1;
}
/* do the unlocking */
if (unlink(actfstack[actfptr].filename) == -1) {
actferr(4, KBOUT);
return 4;
}
return 0;
} else {
/* unknown job */
actferr(2, KBOUT);
return 2;
}
}