2.9BSD/usr/src/cmd/remind/enqueue.c

Compare this file to the similar file:
Show the results in this format:


#include "remind.h"
char *notemp	= "Unable to create /rmd/rmdtemp. Remind is dead.";

enqueue()
{
	register int slptime = 0;
	register i;
	register FILE *pf;
	FILE *rem, *temp;
	int procid;
	time_t now;
	char endrem, written;
	struct rmdblock mm;
	char rmddata[8*MAXRCVRS + MAXMSG + DIRSIZE];
	struct passwd *pw;

#ifndef DEBUG
	signal(SIGINT,SIG_IGN);          /* Ignore Interrupts */
	signal(SIGQUIT,SIG_IGN);          /* Ignore Quits */
	signal(SIGTERM,SIG_IGN);          /* Ignore Termination */
#endif DEBUG

	/* Wait for file to be usable */
	lock();

	/* Kill any existing reminder process that may be "sleeping" */
	if ((pf = fopen(rmdproc,"r")) != NULL)
	{
		if(fscanf(pf,"%d",&procid)<= 0)
			error("/rmd/rmdproc unreadable");
		fclose(pf);
		kill (procid,9);
	}
	if((pf=fopen(rmdproc,"w"))==NULL)
	{
		fprintf(stderr,"remind: cannot open %s for writing\n",rmdproc);
		error("");
	}

	procid = getpid();
	fprintf(pf,"%d\n",procid);
	fclose(pf);

	/* Put new reminder into reminder file (temp) in delivery order */
	if ((rem=fopen(reminders,"r"))==NULL)
	{
		endrem = -1;
		mm.tdeliver = -1L;
	}
	else
		endrem = (fread((char *)&mm, sizeof mm, 1, rem) != 1);
	if ((slptime = tdiff(&m.tdeliver,&m.tsent))
		> (i = tdiff(&mm.tdeliver,&m.tsent)))
			slptime = i;
	if ((temp = fopen(rmdtemp,"w")) == NULL)
		error (notemp);
	else
		if(chmod(rmdtemp,0600) < 0)
		    error("Cannot chmod");

	for (written = 0;;)
	{       if (!endrem &&
			(written||(tdiff(&mm.tdeliver, &m.tdeliver) <= 0)))
		{
			fwrite ((char *)&mm, sizeof mm, 1, temp);
			fread (rmddata, mm.nobytes,1,rem);
			fwrite (rmddata, mm.nobytes, 1, temp);
			endrem = (fread((char *)&mm, sizeof mm, 1, rem) != 1);
		}
		else if (!written)
		{
			fwrite ((char *)&m, sizeof m, 1, temp);
			fwrite ((char *)rcvrlist, 8*m.nrcvrs, 1, temp);
			if (m.dirsize)
			    fwrite (exdir, m.dirsize&0377, 1, temp);
			fwrite (msg, m.msgbytes, 1, temp);
			written++;
		}
		else break;
	}
	fclose (temp);
	if(rem)
	    fclose (rem);
	/*
	 * Dummy all std files
	 */
	freopen(dummy,"r",stdin);
	freopen(dummy,"w",stdout);
	freopen(dummy,"w",stderr);
	cleanup();

	for (;;)
	{	if (slptime > 0)
			sleep(slptime);
		lock();
		now = time((time_t *)0);
		if ((rem = fopen(reminders,"r")) == NULL)
			bye();
		do
		{       if (fread((char *)&m, sizeof m, 1, rem) != 1)
				bye();
			if((pw=getpwnam(m.sender))==NULL)
			{
			    fprintf(stderr,"Unknown user: %s\n",m.sender);
			    Uid = -1;
			}
			else
			    Uid = pw->pw_uid;
			if ((slptime = tdiff(&m.tdeliver, &now)) <= 0)
			{
				fread ((char *)rcvrlist, 8*m.nrcvrs, 1, rem);
				if (m.dirsize)
				    fread(exdir, m.dirsize&0377, 1, rem);
				fread (msg, m.msgbytes, 1, rem);
				if (spawn() == 0)
				{	fclose(rem);
					deliver(); /* Child delivers */
				}
			}
		} while (slptime <= 0);

		/* Copy, removing delivered messages */
		if ((temp = fopen(rmdtemp,"w")) == NULL)
			bye();
		else
			chmod(rmdtemp,0600);
		do
		{
			fread (rmddata, m.nobytes, 1, rem);
			fwrite ((char *)&m, sizeof m, 1, temp);
			fwrite (rmddata, m.nobytes, 1, temp);
		} while (fread((char *)&m, sizeof m, 1, rem) == 1);
		fclose (rem);
		fclose (temp);
		cleanup();
	}
}