⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	register FILE *fp;	for (tries = 0; tries < 10; tries++)	{		sleep((unsigned) (10 * tries));		errno = 0;		fp = fopen(filename, mode);		if (fp != NULL)			break;		if (errno != ENFILE && errno != EINTR)			break;	}	errno = 0;	return (fp);}/***  PUTLINE -- put a line like fputs obeying SMTP conventions****	This routine always guarantees outputing a newline (or CRLF,**	as appropriate) at the end of the string.****	Parameters:**		l -- line to put.**		fp -- file to put it onto.**		m -- the mailer used to control output.****	Returns:**		none****	Side Effects:**		output of l to fp.*/# define SMTPLINELIM	990	/* maximum line length */putline(l, fp, m)	register char *l;	FILE *fp;	MAILER *m;{	register char *p;	char svchar;	/* strip out 0200 bits -- these can look like TELNET protocol */	if (bitnset(M_LIMITS, m->m_flags))	{		p = l;		while ((*p++ &= ~0200) != 0)			continue;	}	do	{		/* find the end of the line */		p = index(l, '\n');		if (p == NULL)			p = &l[strlen(l)];		/* check for line overflow */		while ((p - l) > SMTPLINELIM && bitnset(M_LIMITS, m->m_flags))		{			register char *q = &l[SMTPLINELIM - 1];			svchar = *q;			*q = '\0';			if (l[0] == '.' && bitnset(M_XDOT, m->m_flags))				(void) putc('.', fp);			fputs(l, fp);			(void) putc('!', fp);			fputs(m->m_eol, fp);			*q = svchar;			l = q;		}		/* output last part */		svchar = *p;		*p = '\0';		  /*		   * Remove redundant CR characters from the end of lines		   */		while (p != l && p[-1] == '\r')			*--p = '\0';		if (l[0] == '.' && bitnset(M_XDOT, m->m_flags))			(void) putc('.', fp);		fputs(l, fp);		fputs(m->m_eol, fp);		*p = svchar;		l = p;		if (*l == '\n')			l++;	} while (l[0] != '\0');}#ifdef INTER/***  PUTLINE_8BIT -- put a line like fputs obeying SMTP conventions****	This routine always guarantees outputing a newline (or CRLF,**	as appropriate) at the end of the string.****	This routine is almost a copy of putline, but this one does**	not strip off the 8th bit. This routine will be used in**	putbody() routine.****	Parameters:**		l -- line to put.**		fp -- file to put it onto.**		m -- the mailer used to control output.****	Returns:**		none****	Side Effects:**		output of l to fp.*/# define SMTPLINELIM	990	/* maximum line length */putline_8bit(l, fp, m)	register char *l;	FILE *fp;	MAILER *m;{	register char *p;	char svchar;	do	{		/* find the end of the line */		p = index(l, '\n');		if (p == NULL)			p = &l[strlen(l)];		/* check for line overflow */		while ((p - l) > SMTPLINELIM && bitnset(M_LIMITS, m->m_flags))		{			register char *q = &l[SMTPLINELIM - 1];			svchar = *q;			*q = '\0';			if (l[0] == '.' && bitnset(M_XDOT, m->m_flags))				(void) putc('.', fp);			fputs(l, fp);			(void) putc('!', fp);			fputs(m->m_eol, fp);			*q = svchar;			l = q;		}		/* output last part */		svchar = *p;		*p = '\0';		  /*		   * Remove redundant CR characters from the end of lines		   */		while (p != l && p[-1] == '\r')			*--p = '\0';		if (l[0] == '.' && bitnset(M_XDOT, m->m_flags))			(void) putc('.', fp);		fputs(l, fp);		fputs(m->m_eol, fp);		*p = svchar;		l = p;		if (*l == '\n')			l++;	} while (l[0] != '\0');}#endif/***  XUNLINK -- unlink a file, doing logging as appropriate.****	Parameters:**		f -- name of file to unlink.****	Returns:**		none.****	Side Effects:**		f is unlinked.*/xunlink(f)	char *f;{	register int i;# ifdef LOG	if (LogLevel > 20)		syslog(LOG_DEBUG, "%s: unlink %s\n", CurEnv->e_id, f);# endif LOG	i = unlink(f);# ifdef LOG	if (i < 0 && LogLevel > 21)		syslog(LOG_DEBUG, "%s: unlink-fail %d", f, errno);# endif LOG}/***  SFGETS -- "safe" fgets -- times out and ignores random interrupts.****	Parameters:**		buf -- place to put the input line.**		siz -- size of buf.**		fp -- file to read from.****	Returns:**		NULL on error (including timeout).  This will also leave**			buf containing a null string.**		buf otherwise.****	Side Effects:**		Errno is set if an error occurs.*/static jmp_buf	CtxReadTimeout;#ifndef ETIMEDOUT#define ETIMEDOUT	EINTR#endifchar *sfgets(buf, siz, fp)	char *buf;	int siz;	FILE *fp;{	register EVENT *ev = NULL;	register char *p;	extern readtimeout();	extern int errno;	/* set the timeout */	if (ReadTimeout != 0)	{		if (setjmp(CtxReadTimeout) != 0)		{			extern char *RealHostName;			errno = ETIMEDOUT;			if (RealHostName) 				syserr("net hang reading from %s",					RealHostName);			else				syserr("input hang");			errno = ETIMEDOUT; /* syserr() resets errno */			buf[0] = '\0';			return (NULL);		}		ev = setevent((time_t) ReadTimeout, readtimeout, 0);	}	/* try to read */	p = NULL;	while (p == NULL && !feof(fp) && !ferror(fp))	{		errno = 0;		p = fgets(buf, siz, fp);		if (errno == EINTR)			clearerr(fp);	}	/* clear the event if it has not sprung */	clrevent(ev);	/* clean up the books and exit */	if (p == NULL)	{		buf[0] = '\0';		return (NULL);	}#ifndef INTER	for (p = buf; *p != '\0'; p++)		*p &= ~0200;#endif	return (buf);}staticreadtimeout(){	longjmp(CtxReadTimeout, 1);}/***  FGETFOLDED -- like fgets, but know about folded lines.****	Parameters:**		buf -- place to put result.**		n -- bytes available.**		f -- file to read from.****	Returns:**		buf on success, NULL on error or EOF.****	Side Effects:**		buf gets lines from f, with continuation lines (lines**		with leading white space) appended.  CRLF's are mapped**		into single newlines.  Any trailing NL is stripped.*/char *fgetfolded(buf, n, f)	char *buf;	register int n;	FILE *f;{	register char *p = buf;	register int i;	n--;	while ((i = getc(f)) != EOF)	{		if (i == '\r')		{			i = getc(f);			if (i != '\n')			{				if (i != EOF)					(void) ungetc(i, f);				i = '\r';			}		}		if (--n > 0)			*p++ = i;		if (i == '\n')		{			LineNumber++;			i = getc(f);			if (i != EOF)				(void) ungetc(i, f);			if (i != ' ' && i != '\t')			{				*--p = '\0';				return (buf);			}		}	}	return (NULL);}/***  CURTIME -- return current time.****	Parameters:**		none.****	Returns:**		the current time.****	Side Effects:**		none.*/time_tcurtime(){	auto time_t t;	(void) time(&t);	return (t);}/***  ATOBOOL -- convert a string representation to boolean.****	Defaults to "TRUE"****	Parameters:**		s -- string to convert.  Takes "tTyY" as true,**			others as false.****	Returns:**		A boolean representation of the string.****	Side Effects:**		none.*/boolatobool(s)	register char *s;{	if (*s == '\0' || index("tTyY", *s) != NULL)		return (TRUE);	return (FALSE);}/***  ATOOCT -- convert a string representation to octal.****	Parameters:**		s -- string to convert.****	Returns:**		An integer representing the string interpreted as an**		octal number.****	Side Effects:**		none.*/atooct(s)	register char *s;{	register int i = 0;	while (*s >= '0' && *s <= '7')		i = (i << 3) | (*s++ - '0');	return (i);}/***  WAITFOR -- wait for a particular process id.****	Parameters:**		pid -- process id to wait for.****	Returns:**		status of pid.**		-1 if pid never shows up.****	Side Effects:**		none.*/waitfor(pid)	int pid;{	auto int st;	int i;	do	{		errno = 0;		i = wait(&st);	} while ((i >= 0 || errno == EINTR) && i != pid);	if (i < 0)		st = -1;	return (st);}/***  BITINTERSECT -- tell if two bitmaps intersect****	Parameters:**		a, b -- the bitmaps in question****	Returns:**		TRUE if they have a non-null intersection**		FALSE otherwise****	Side Effects:**		none.*/boolbitintersect(a, b)	BITMAP a;	BITMAP b;{	int i;	for (i = BITMAPBYTES / sizeof (int); --i >= 0; )		if ((a[i] & b[i]) != 0)			return (TRUE);	return (FALSE);}/***  BITZEROP -- tell if a bitmap is all zero****	Parameters:**		map -- the bit map to check****	Returns:**		TRUE if map is all zero.**		FALSE if there are any bits set in map.****	Side Effects:**		none.*/boolbitzerop(map)	BITMAP map;{	int i;	for (i = BITMAPBYTES / sizeof (int); --i >= 0; )		if (map[i] != 0)			return (FALSE);	return (TRUE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -