|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 5357 (0x14ed)
Types: TextFile
Names: »fldr.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z«
└─⟦dcb95597f⟧
└─⟦this⟧ »fldr.c«
#ifndef lint
static char rcsid[] =
"$Header: fldr.c,v 2.7 86/10/09 16:01:08 deboor Exp $";
static char notice[] =
"This program is in the public domain and is available for unlimited \
distribution as long as this notice is enclosed.";
#endif
/*
* Routines that have a lot to do with the fldr structure
*
* $Source: /c/support/deboor/usr/src/old/vmh/RCS/fldr.c,v $
* $Revision: 2.7 $
* $Author: deboor $
*
* FUNCTIONS:
* freeF free all memory used by a folder
* getF find folder structure for a folder
* recheckfldrs check all folders for modification
* syncfolders synchronize in-core folder info with .info files
*/
#include "vmh.h" /* Mine */
FLDR *F,
*FHead;
/*
* get F -- check the F-list for a matching inode, otherwise
* build a new one and put it on the list. the folder name
* passed should be an absolute pathname.
*/
FLDR *
getF(folder)
char *folder;
{
struct stat sbuf; /* Sigh, stat done 3 times??? */
register FLDR *f;
if (stat(folder, &sbuf) < 0)
punt("Stat error in getF");
f = findF(sbuf.st_ino); /* See if there already */
if (f != NULL)
return(f); /* If exists, return it now */
f = AllocST(FLDR); /* Allocate a structure */
f->f_lock = 1;
(void) strcpy(f->f_name, folder); /* Set name of the folder */
f->f_inode = sbuf.st_ino; /* Set inode number */
f->f_mtime = sbuf.st_mtime; /* then the mod time */
f->f_modified = 0; /* unmodified */
f->f_sequences = (struct seq *)NULL;
f->f_cur = f->f_top = f->f_bot = (INFO *) 0; /* Init to NULL for potentially */
f->f_head = f->f_tail = (INFO *) 0; /* empty folder */
f->f_link = FHead; /* Put at start of list */
FHead = f; /* Rest of list after me */
my_gmsg(f); /* Build msgs structure */
readinfo (f); /* read .info file */
f->f_modified = 0; /* unmodified */
init_sequences (f); /* read in all the sequences */
/* (sets f->f_cur, too) */
initmarks(f);
/*
* if non-empty folder, put cur in the center
*/
if (!FEmpty(f)) {
f->f_top = i_pre (f->f_cur, topSize/2 + 1);
}
f->f_lock = 0;
return(f);
}
/*
* Search the folder-list for the folder of interest.
*/
FLDR *
findF(inode)
ino_t inode; /* Inode of directory to look for in F cache */
{
register FLDR *f = FHead;
while (f != NULL) {
if (f->f_inode == inode)
return(f);
else
f = f->f_link;
}
return((FLDR *)NULL);
}
/*
* Make sure all the .info disk files match their in-core images
*/
syncfolders()
{
register FLDR *f;
set_cur_fold (strncmp(F->f_name, rootpath, rootlen) ? F->f_name :
&F->f_name[rootlen+1]);
for (f=FHead; f != NULL; f = f->f_link) {
if ( ! f->f_lock )
updatefolder(f);
}
}
/*
* If a fldr has been modified, write it back out to disk and
* reset the modified flag.
*/
int fdreserved;
updatefolder(f)
FLDR *f;
{
int chan;
char infopath[PATHLENGTH];
(void) close(fdreserved); /* Release save'd fd */
dump_sequences (f); /* write out the sequences */
if ( f->f_modified ) { /* If the .info file has changed */
(void) strcat (strcpy (infopath, f->f_name), "/.info");
(void) unlink(infopath); /* Delete old .info file */
chan = creat(infopath, 0600); /* Recreate the file */
if (chan == -1) /* creat open'd for write */
punt("Open error in updatefolder");
flushinfo (chan, f);
(void) close(chan);
f->f_modified = 0;
}
fdreserved = dup(0); /* Reserve spare fd again! */
}
/*
* Release all the memory for the fldr structure and take
* it off the list. Does *not* write it out to disk first.
*/
freeF(f)
FLDR *f;
{
FLDR *fprev;
struct seq *sp;
struct seq *tsp;
free_sequences (f);
if (FHead == NULL) /* If empty list */
punt("Empty f-list in freeF?");
if (FHead == f) /* If first on the list */
FHead = f->f_link;
else {
for (fprev = FHead ; ; fprev = fprev->f_link) {
if (fprev == NULL)
punt("F-list corrupted");
if (fprev->f_link == f) {
fprev->f_link = f->f_link;
break;
}
}
}
Free ((char *)f);
}
/*
* Check to make sure that all the in-core .info files are still
* current. Rebuild and redisplay if necessary.
*/
recheckfldrs()
{
FLDR *f,
*tf;
int curflag; /* True if checking "current" folder */
struct stat sbuf;
int switchCur = 0; /* switch to +inbox if curF is gone */
char *inboxV[2]; /* for switch to +inbox */
for (f=FHead; f != NULL; f = f->f_link)
{
curflag = (F == f); /* true if current folder */
if (f->f_lock) /*don't do ANYTHING til it's unlocked */
continue;
if (stat(f->f_name, &sbuf) < 0) /* Do the stat */
{ /* If not there, */
freeF(f); /* forget it! */
if (curflag) /* current gone? */
switchCur = 1; /* switch to +inbox when done */
}
else if (checkinfo(f)) /* else if there, check .info */
{
char name[PATHLENGTH];
(void) strcpy(name, f->f_name); /* remember ... */
freeF(f); /* Release old one */
/* Assumes new f gets put at start! */
tf = getF(name); /* Rebuild the f struct */
if (curflag) {
F = tf;
showinfo();
wrefresh(topWin);
}
}
}
inboxV[0] = defalt;
inboxV[1] = (char *) 0;
if (switchCur)
cmdSwitch (1, 0, 1, inboxV);
}