4.3BSD/usr/contrib/notes/src/note.c
#ifdef RCSIDENT
static char rcsid[] = "$Header: note.c,v 1.7 85/01/18 15:32:57 notes Rel $";
#endif RCSIDENT
/*
* Putnote
*
* Take the given text, and make put it into the note file.
* following algorithm:
* reserve space for text
* write the text
* make the note header record
* lock the index file
* write the note header info
* unlock the index file
* rewrite the correct text header info
*
*
* Delnote(io, noteno): marks the status word as deleted.
*
* Original authors: Rob Kolstad and Ray Essick Winter 1980
* modified; Ray Essick December 1981
*/
#include "parms.h"
#include "structs.h"
putnote (io, where, title, status, note, auth, policy, lockit, addid, fromsys, addtime)
struct io_f *io;
struct daddr_f *where;
char *title;
struct note_f *note;
struct auth_f *auth;
/* policy = true if this is the policy note */
/* addid = fales if we already have an id for the note */
/* addtime = false if we already have a time for the note */
char *fromsys; /* whom we recieved it from (routing) */
{
int count;
char *p;
int notenum;
note -> n_nresp = 0; /* no responses yet */
if (addtime) /* dont if compressing... */
{
gettime (¬e -> n_rcvd);
gettime (¬e -> n_lmod); /* date of last mod is same */
}
note -> n_auth = *auth; /* move author over */
strcpy (note -> n_from, fromsys); /* who gave it to us */
note -> n_rindx = (-1); /* no place for responses yet */
note -> n_stat = status; /* director message, deleted, etc */
note -> n_addr = *where; /* where on disk */
strncpy (note -> ntitle, title, TITLEN); /* copy */
note -> ntitle[TITLEN - 1] = '\0'; /* stop for sure */
if (lockit)
locknf (io, DSCRLOCK); /* BEGIN CRITICAL SECTION */
getdscr (io, &io -> descr); /* grab notesfile header */
if (io -> descr.d_stat & NFINVALID)
{
if (lockit)
unlocknf (io, DSCRLOCK);
closenf (io);
opennf (io, 0); /* get new links */
printf ("Sorry, your note has been lost in a compression");
/*
* Should give the user a chance to recover his text somewhere
* in here
*/
fflush (stdout);
sleep (1);
return (-1);
}
if (addid)
{
#ifdef SHAREDATA
strmove (System, note -> n_id.sys); /* copy sys name */
#else ! SHAREDATA
strmove (io -> descr.d_id.sys, note -> n_id.sys);
#endif SHAREDATA
note -> n_id.uniqid = ++(io -> descr.d_id.uniqid);
/* and unique id num */
#ifdef UNIQPLEX
note -> n_id.uniqid += UNIQPLEX * io -> descr.d_nfnum;
/* mpx in nf num */
#endif
}
if (policy)
{
io -> descr.d_plcy = 1; /* mark as having a policy note */
notenum = 0;
}
else
notenum = ++io -> descr.d_nnote; /* this note's number */
if (addtime) /* see if want timestamp */
gettime (&io -> descr.d_lastm); /* last time file modified */
putnrec (io, notenum, note); /* write note info */
putdscr (io, &io -> descr); /* rewrite header info */
if (lockit)
unlocknf (io, DSCRLOCK); /* END CRITICAL SECTION */
io -> nnotwrit++; /* bump count of writes */
return (io -> descr.d_nnote); /* tell which slot it is in */
}
delnote (io, noteno, lockit)
struct io_f *io;
{
struct note_f note;
if (lockit)
locknf (io, DSCRLOCK); /* CRITICAL */
getnrec (io, noteno, ¬e); /* get the note */
note.n_stat |= DELETED; /* deleted */
putnrec (io, noteno, ¬e);
getdscr (io, &io -> descr); /* update delete count */
io -> descr.d_delnote++;
io -> descr.d_delresp += note.n_nresp; /* count resps */
putdscr (io, &io -> descr);
if (lockit)
unlocknf (io, DSCRLOCK); /* END CRITICAL */
}