📄 util.c
字号:
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 + -