This is init.c in view mode; [Download] [Up]
/*
* Display the welcome screen and find the Pcomm support files. Returns a
* pointer to a static area (or shared memory) containing the STATUS
* structure. All errors are fatal.
*/
#define TMP_FILE "/tmp/pcommXXXXXX"
#include <stdio.h>
#include <curses.h>
#include "config.h"
#include "misc.h"
#include "status.h"
#ifdef SHAREDMEM
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#endif /* SHAREDMEM */
struct STATUS *
init(short_cut)
char *short_cut;
{
char *strcpy();
struct STATUS *s_ptr;
void info();
#ifdef SHAREDMEM
int i, mode;
extern int shm_id;
char *memset();
char *shmat(); /* comment out, if required */
void perror(), exit();
/*
* Since the "pcomm_input" program does not run set-user/group-id
* the mode must be set so the effective ID can read/write to the
* shared memory segment. Kinda strange... real ID's aren't used.
*/
#ifdef SETUGID
mode = 0666;
#else /* SETUGID */
mode = 0600;
#endif /* SETUGID */
/* create a shared memory segment */
shm_id = shmget(IPC_PRIVATE, sizeof (struct STATUS), mode|IPC_CREAT|IPC_EXCL|IPC_NOWAIT);
if (shm_id < 0) {
endwin();
perror("shmget");
exit(1);
}
s_ptr = (struct STATUS *) shmat(shm_id, (char *) 0, 0);
if ((int) s_ptr == -1) {
endwin();
perror("shmat");
exit(1);
}
#else /* SHAREDMEM */
char *mktemp(), tempfile[sizeof(TMP_FILE)];
static struct STATUS s;
s_ptr = &s;
#endif /* SHAREDMEM */
/* some defaults */
s_ptr->fd = -1;
s_ptr->dup_fd = -1;
s_ptr->add_lf = 0;
s_ptr->log = 0;
s_ptr->print = 0;
strcpy(s_ptr->log_path, "NOT_DEFINED");
#ifdef SHAREDMEM
s_ptr->clr = 0;
s_ptr->row = 0;
s_ptr->col = 0;
for (i=0; i<MAX_ROW; i++)
memset(s_ptr->vs[i], '\0', MAX_COL);
#else /* SHAREDMEM */
strcpy(tempfile, TMP_FILE);
strcpy(s_ptr->vs_path, mktemp(tempfile));
#endif /* SHAREDMEM */
/* display herald if no short-cut */
if (short_cut == NULL)
info(AUTO_CLEAR);
erase();
refresh();
return(s_ptr);
}
/*
* Search the extra directory (supplied on the command line), then the
* directory in the PCOMM environmental variable, then the current working
* directory, and lastly, the default directory.
*/
char *
findfile(extra, name)
char *extra, *name;
{
int i;
char *pcomm, *getenv(), *path, pbuf[200], *getcwd(), *str_dup();
char temp[200];
/* see if PCOMM variable is set */
pcomm = getenv("PCOMM");
if (pcomm == NULL || *pcomm == '\0')
pcomm = NULL;
else {
/* zap the trailing separator */
if (pcomm[strlen(pcomm)-1] == '/')
pcomm[strlen(pcomm)-1] = '\0';
}
for (i=0; i<4; i++) {
/* directory search order */
switch (i) {
case 0: /* extra directory from command line */
path = extra;
break;
case 1: /* PCOMM environmental variable */
path = pcomm;
break;
case 2: /* current working directory */
path = getcwd(pbuf, 200);
break;
case 3: /* Pcomm's default directory */
path = DEFAULT_DIR;
break;
}
if (path == NULL)
continue;
sprintf(temp, "%s/%s", path, name);
/* read permission checked */
if (!access(temp, 4))
return(str_dup(temp));
}
return(NULL);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.