1dea673e9SRodney W. Grimes /* 2dea673e9SRodney W. Grimes * Copyright (c) 1983, 1993 3dea673e9SRodney W. Grimes * The Regents of the University of California. All rights reserved. 4dea673e9SRodney W. Grimes * 5dea673e9SRodney W. Grimes * 6dea673e9SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 7dea673e9SRodney W. Grimes * modification, are permitted provided that the following conditions 8dea673e9SRodney W. Grimes * are met: 9dea673e9SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 10dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 11dea673e9SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 12dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 13dea673e9SRodney W. Grimes * documentation and/or other materials provided with the distribution. 14dea673e9SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 15dea673e9SRodney W. Grimes * must display the following acknowledgement: 16dea673e9SRodney W. Grimes * This product includes software developed by the University of 17dea673e9SRodney W. Grimes * California, Berkeley and its contributors. 18dea673e9SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 19dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 20dea673e9SRodney W. Grimes * without specific prior written permission. 21dea673e9SRodney W. Grimes * 22dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32dea673e9SRodney W. Grimes * SUCH DAMAGE. 33dea673e9SRodney W. Grimes */ 34dea673e9SRodney W. Grimes 35dea673e9SRodney W. Grimes #ifndef lint 369b3fe531SPhilippe Charnier static const char copyright[] = 37dea673e9SRodney W. Grimes "@(#) Copyright (c) 1983, 1993\n\ 38dea673e9SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 39dea673e9SRodney W. Grimes #endif /* not lint */ 40dea673e9SRodney W. Grimes 41dea673e9SRodney W. Grimes #ifndef lint 429b3fe531SPhilippe Charnier #if 0 435458e2f4SJoerg Wunsch static char sccsid[] = "@(#)recvjob.c 8.2 (Berkeley) 4/27/95"; 449b3fe531SPhilippe Charnier #endif 459b3fe531SPhilippe Charnier static const char rcsid[] = 4697d92980SPeter Wemm "$FreeBSD$"; 47dea673e9SRodney W. Grimes #endif /* not lint */ 48dea673e9SRodney W. Grimes 49dea673e9SRodney W. Grimes /* 50dea673e9SRodney W. Grimes * Receive printer jobs from the network, queue them and 51dea673e9SRodney W. Grimes * start the printer daemon. 52dea673e9SRodney W. Grimes */ 53dea673e9SRodney W. Grimes #include <sys/param.h> 54dea673e9SRodney W. Grimes #include <sys/mount.h> 55dea673e9SRodney W. Grimes #include <sys/stat.h> 56dea673e9SRodney W. Grimes 57dea673e9SRodney W. Grimes #include <unistd.h> 58dea673e9SRodney W. Grimes #include <signal.h> 59dea673e9SRodney W. Grimes #include <fcntl.h> 60dea673e9SRodney W. Grimes #include <dirent.h> 61dea673e9SRodney W. Grimes #include <syslog.h> 62dea673e9SRodney W. Grimes #include <stdio.h> 63dea673e9SRodney W. Grimes #include <stdlib.h> 64dea673e9SRodney W. Grimes #include <string.h> 65dea673e9SRodney W. Grimes #include "lp.h" 66dea673e9SRodney W. Grimes #include "lp.local.h" 67dea673e9SRodney W. Grimes #include "extern.h" 68dea673e9SRodney W. Grimes #include "pathnames.h" 69dea673e9SRodney W. Grimes 70dea673e9SRodney W. Grimes #define ack() (void) write(1, sp, 1); 71dea673e9SRodney W. Grimes 725f87a7b6SWarner Losh static char dfname[NAME_MAX]; /* data files */ 73dea673e9SRodney W. Grimes static int minfree; /* keep at least minfree blocks available */ 74ba7a1ad7SGarance A Drosehn static const char *sp = ""; 755f87a7b6SWarner Losh static char tfname[NAME_MAX]; /* tmp copy of cf before linking */ 76dea673e9SRodney W. Grimes 77ba7a1ad7SGarance A Drosehn static int chksize(int _size); 78ba7a1ad7SGarance A Drosehn static void frecverr(const char *_msg, ...); 79ba7a1ad7SGarance A Drosehn static int noresponse(void); 80ba7a1ad7SGarance A Drosehn static void rcleanup(int _signo); 81ba7a1ad7SGarance A Drosehn static int read_number(const char *_fn); 82ba7a1ad7SGarance A Drosehn static int readfile(struct printer *_pp, char *_file, int _size); 83ba7a1ad7SGarance A Drosehn static int readjob(struct printer *_pp); 84dea673e9SRodney W. Grimes 85dea673e9SRodney W. Grimes 86dea673e9SRodney W. Grimes void 87ba7a1ad7SGarance A Drosehn recvjob(const char *printer) 88dea673e9SRodney W. Grimes { 89dea673e9SRodney W. Grimes struct stat stb; 90dea673e9SRodney W. Grimes int status; 914a1a0dbeSGarrett Wollman struct printer myprinter, *pp = &myprinter; 92dea673e9SRodney W. Grimes 93dea673e9SRodney W. Grimes /* 94dea673e9SRodney W. Grimes * Perform lookup for printer name or abbreviation 95dea673e9SRodney W. Grimes */ 968830deaeSGarrett Wollman init_printer(pp); 974a1a0dbeSGarrett Wollman status = getprintcap(printer, pp); 984a1a0dbeSGarrett Wollman switch (status) { 994a1a0dbeSGarrett Wollman case PCAPERR_OSERR: 100dea673e9SRodney W. Grimes frecverr("cannot open printer description file"); 1014a1a0dbeSGarrett Wollman break; 1024a1a0dbeSGarrett Wollman case PCAPERR_NOTFOUND: 103dea673e9SRodney W. Grimes frecverr("unknown printer %s", printer); 1044a1a0dbeSGarrett Wollman break; 1054a1a0dbeSGarrett Wollman case PCAPERR_TCLOOP: 1064a1a0dbeSGarrett Wollman fatal(pp, "potential reference loop detected in printcap file"); 1074a1a0dbeSGarrett Wollman default: 1084a1a0dbeSGarrett Wollman break; 1094a1a0dbeSGarrett Wollman } 110dea673e9SRodney W. Grimes 111dea673e9SRodney W. Grimes (void) close(2); /* set up log file */ 1124a1a0dbeSGarrett Wollman if (open(pp->log_file, O_WRONLY|O_APPEND, 0664) < 0) { 1134a1a0dbeSGarrett Wollman syslog(LOG_ERR, "%s: %m", pp->log_file); 114dea673e9SRodney W. Grimes (void) open(_PATH_DEVNULL, O_WRONLY); 115dea673e9SRodney W. Grimes } 116dea673e9SRodney W. Grimes 1174a1a0dbeSGarrett Wollman if (chdir(pp->spool_dir) < 0) 1184a1a0dbeSGarrett Wollman frecverr("%s: %s: %m", pp->printer, pp->spool_dir); 1194a1a0dbeSGarrett Wollman if (stat(pp->lock_file, &stb) == 0) { 120dea673e9SRodney W. Grimes if (stb.st_mode & 010) { 121dea673e9SRodney W. Grimes /* queue is disabled */ 122dea673e9SRodney W. Grimes putchar('\1'); /* return error code */ 123dea673e9SRodney W. Grimes exit(1); 124dea673e9SRodney W. Grimes } 1254a1a0dbeSGarrett Wollman } else if (stat(pp->spool_dir, &stb) < 0) 1264a1a0dbeSGarrett Wollman frecverr("%s: %s: %m", pp->printer, pp->spool_dir); 127dea673e9SRodney W. Grimes minfree = 2 * read_number("minfree"); /* scale KB to 512 blocks */ 128dea673e9SRodney W. Grimes signal(SIGTERM, rcleanup); 129dea673e9SRodney W. Grimes signal(SIGPIPE, rcleanup); 130dea673e9SRodney W. Grimes 1314a1a0dbeSGarrett Wollman if (readjob(pp)) 1324a1a0dbeSGarrett Wollman printjob(pp); 133dea673e9SRodney W. Grimes } 134dea673e9SRodney W. Grimes 135dea673e9SRodney W. Grimes /* 136dea673e9SRodney W. Grimes * Read printer jobs sent by lpd and copy them to the spooling directory. 137dea673e9SRodney W. Grimes * Return the number of jobs successfully transfered. 138dea673e9SRodney W. Grimes */ 139dea673e9SRodney W. Grimes static int 140ba7a1ad7SGarance A Drosehn readjob(struct printer *pp) 141dea673e9SRodney W. Grimes { 1426522ebecSGarance A Drosehn register int size; 143dea673e9SRodney W. Grimes register char *cp; 1446522ebecSGarance A Drosehn int cfcnt, dfcnt; 1456522ebecSGarance A Drosehn char givenid[32], givenhost[MAXHOSTNAMELEN]; 146dea673e9SRodney W. Grimes 147dea673e9SRodney W. Grimes ack(); 1486522ebecSGarance A Drosehn cfcnt = 0; 1496522ebecSGarance A Drosehn dfcnt = 0; 150dea673e9SRodney W. Grimes for (;;) { 151dea673e9SRodney W. Grimes /* 152dea673e9SRodney W. Grimes * Read a command to tell us what to do 153dea673e9SRodney W. Grimes */ 154dea673e9SRodney W. Grimes cp = line; 155dea673e9SRodney W. Grimes do { 156dea673e9SRodney W. Grimes if ((size = read(1, cp, 1)) != 1) { 1573aeddf3cSGarance A Drosehn if (size < 0) { 1589b3fe531SPhilippe Charnier frecverr("%s: lost connection", 1594a1a0dbeSGarrett Wollman pp->printer); 1603aeddf3cSGarance A Drosehn /*NOTREACHED*/ 1613aeddf3cSGarance A Drosehn } 1626522ebecSGarance A Drosehn return (cfcnt); 163dea673e9SRodney W. Grimes } 1645f87a7b6SWarner Losh } while (*cp++ != '\n' && (cp - line + 1) < sizeof(line)); 1653aeddf3cSGarance A Drosehn if (cp - line + 1 >= sizeof(line)) { 1663aeddf3cSGarance A Drosehn frecverr("%s: readjob overflow", pp->printer); 1673aeddf3cSGarance A Drosehn /*NOTREACHED*/ 1683aeddf3cSGarance A Drosehn } 169dea673e9SRodney W. Grimes *--cp = '\0'; 170dea673e9SRodney W. Grimes cp = line; 171dea673e9SRodney W. Grimes switch (*cp++) { 172dea673e9SRodney W. Grimes case '\1': /* cleanup because data sent was bad */ 173dea673e9SRodney W. Grimes rcleanup(0); 174dea673e9SRodney W. Grimes continue; 175dea673e9SRodney W. Grimes 176dea673e9SRodney W. Grimes case '\2': /* read cf file */ 177dea673e9SRodney W. Grimes size = 0; 1786522ebecSGarance A Drosehn dfcnt = 0; 179dea673e9SRodney W. Grimes while (*cp >= '0' && *cp <= '9') 180dea673e9SRodney W. Grimes size = size * 10 + (*cp++ - '0'); 181dea673e9SRodney W. Grimes if (*cp++ != ' ') 182dea673e9SRodney W. Grimes break; 183dea673e9SRodney W. Grimes /* 184dea673e9SRodney W. Grimes * host name has been authenticated, we use our 185dea673e9SRodney W. Grimes * view of the host name since we may be passed 186dea673e9SRodney W. Grimes * something different than what gethostbyaddr() 187dea673e9SRodney W. Grimes * returns 188dea673e9SRodney W. Grimes */ 1895f87a7b6SWarner Losh strncpy(cp + 6, from, sizeof(line) + line - cp - 7); 1905f87a7b6SWarner Losh line[sizeof(line) - 1 ] = '\0'; 1915f87a7b6SWarner Losh strncpy(tfname, cp, sizeof(tfname) - 1); 1925f87a7b6SWarner Losh tfname[sizeof (tfname) - 1] = '\0'; 193dea673e9SRodney W. Grimes tfname[0] = 't'; 1945f87a7b6SWarner Losh if (strchr(tfname, '/')) 1955f87a7b6SWarner Losh frecverr("readjob: %s: illegal path name", 1965f87a7b6SWarner Losh tfname); 197dea673e9SRodney W. Grimes if (!chksize(size)) { 198dea673e9SRodney W. Grimes (void) write(1, "\2", 1); 199dea673e9SRodney W. Grimes continue; 200dea673e9SRodney W. Grimes } 2013aeddf3cSGarance A Drosehn if (!readfile(pp, tfname, size)) { 202dea673e9SRodney W. Grimes rcleanup(0); 203dea673e9SRodney W. Grimes continue; 204dea673e9SRodney W. Grimes } 205dea673e9SRodney W. Grimes if (link(tfname, cp) < 0) 206dea673e9SRodney W. Grimes frecverr("%s: %m", tfname); 207dea673e9SRodney W. Grimes (void) unlink(tfname); 208dea673e9SRodney W. Grimes tfname[0] = '\0'; 2096522ebecSGarance A Drosehn cfcnt++; 210dea673e9SRodney W. Grimes continue; 211dea673e9SRodney W. Grimes 212dea673e9SRodney W. Grimes case '\3': /* read df file */ 2136522ebecSGarance A Drosehn *givenid = '\0'; 2146522ebecSGarance A Drosehn *givenhost = '\0'; 215dea673e9SRodney W. Grimes size = 0; 216dea673e9SRodney W. Grimes while (*cp >= '0' && *cp <= '9') 217dea673e9SRodney W. Grimes size = size * 10 + (*cp++ - '0'); 218dea673e9SRodney W. Grimes if (*cp++ != ' ') 219dea673e9SRodney W. Grimes break; 220dea673e9SRodney W. Grimes if (!chksize(size)) { 221dea673e9SRodney W. Grimes (void) write(1, "\2", 1); 222dea673e9SRodney W. Grimes continue; 223dea673e9SRodney W. Grimes } 2245f87a7b6SWarner Losh (void) strncpy(dfname, cp, sizeof(dfname) - 1); 2255f87a7b6SWarner Losh dfname[sizeof(dfname) - 1] = '\0'; 2263aeddf3cSGarance A Drosehn if (strchr(dfname, '/')) { 227dea673e9SRodney W. Grimes frecverr("readjob: %s: illegal path name", 228dea673e9SRodney W. Grimes dfname); 2293aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2303aeddf3cSGarance A Drosehn } 2316522ebecSGarance A Drosehn dfcnt++; 2326522ebecSGarance A Drosehn trstat_init(pp, dfname, dfcnt); 2333aeddf3cSGarance A Drosehn (void) readfile(pp, dfname, size); 2346522ebecSGarance A Drosehn trstat_write(pp, TR_RECVING, size, givenid, from, 2356522ebecSGarance A Drosehn givenhost); 236dea673e9SRodney W. Grimes continue; 237dea673e9SRodney W. Grimes } 238dea673e9SRodney W. Grimes frecverr("protocol screwup: %s", line); 2393aeddf3cSGarance A Drosehn /*NOTREACHED*/ 240dea673e9SRodney W. Grimes } 241dea673e9SRodney W. Grimes } 242dea673e9SRodney W. Grimes 243dea673e9SRodney W. Grimes /* 244dea673e9SRodney W. Grimes * Read files send by lpd and copy them to the spooling directory. 245dea673e9SRodney W. Grimes */ 246dea673e9SRodney W. Grimes static int 247ba7a1ad7SGarance A Drosehn readfile(struct printer *pp, char *file, int size) 248dea673e9SRodney W. Grimes { 249dea673e9SRodney W. Grimes register char *cp; 250dea673e9SRodney W. Grimes char buf[BUFSIZ]; 251dea673e9SRodney W. Grimes register int i, j, amt; 252dea673e9SRodney W. Grimes int fd, err; 253dea673e9SRodney W. Grimes 254dea673e9SRodney W. Grimes fd = open(file, O_CREAT|O_EXCL|O_WRONLY, FILMOD); 2553aeddf3cSGarance A Drosehn if (fd < 0) { 2563aeddf3cSGarance A Drosehn frecverr("%s: readfile: error on open(%s): %m", 2573aeddf3cSGarance A Drosehn pp->printer, file); 2583aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2593aeddf3cSGarance A Drosehn } 260dea673e9SRodney W. Grimes ack(); 261dea673e9SRodney W. Grimes err = 0; 262dea673e9SRodney W. Grimes for (i = 0; i < size; i += BUFSIZ) { 263dea673e9SRodney W. Grimes amt = BUFSIZ; 264dea673e9SRodney W. Grimes cp = buf; 265dea673e9SRodney W. Grimes if (i + amt > size) 266dea673e9SRodney W. Grimes amt = size - i; 267dea673e9SRodney W. Grimes do { 268dea673e9SRodney W. Grimes j = read(1, cp, amt); 2693aeddf3cSGarance A Drosehn if (j <= 0) { 2703aeddf3cSGarance A Drosehn frecverr("%s: lost connection", pp->printer); 2713aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2723aeddf3cSGarance A Drosehn } 273dea673e9SRodney W. Grimes amt -= j; 274dea673e9SRodney W. Grimes cp += j; 275dea673e9SRodney W. Grimes } while (amt > 0); 276dea673e9SRodney W. Grimes amt = BUFSIZ; 277dea673e9SRodney W. Grimes if (i + amt > size) 278dea673e9SRodney W. Grimes amt = size - i; 279dea673e9SRodney W. Grimes if (write(fd, buf, amt) != amt) { 280dea673e9SRodney W. Grimes err++; 281dea673e9SRodney W. Grimes break; 282dea673e9SRodney W. Grimes } 283dea673e9SRodney W. Grimes } 284dea673e9SRodney W. Grimes (void) close(fd); 2853aeddf3cSGarance A Drosehn if (err) { 2863aeddf3cSGarance A Drosehn frecverr("%s: write error on close(%s)", pp->printer, file); 2873aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2883aeddf3cSGarance A Drosehn } 289dea673e9SRodney W. Grimes if (noresponse()) { /* file sent had bad data in it */ 290ed4d1cf9SWarner Losh if (strchr(file, '/') == NULL) 291dea673e9SRodney W. Grimes (void) unlink(file); 292dea673e9SRodney W. Grimes return (0); 293dea673e9SRodney W. Grimes } 294dea673e9SRodney W. Grimes ack(); 295dea673e9SRodney W. Grimes return (1); 296dea673e9SRodney W. Grimes } 297dea673e9SRodney W. Grimes 298dea673e9SRodney W. Grimes static int 299ba7a1ad7SGarance A Drosehn noresponse(void) 300dea673e9SRodney W. Grimes { 301dea673e9SRodney W. Grimes char resp; 302dea673e9SRodney W. Grimes 3033aeddf3cSGarance A Drosehn if (read(1, &resp, 1) != 1) { 3043aeddf3cSGarance A Drosehn frecverr("lost connection in noresponse()"); 3053aeddf3cSGarance A Drosehn /*NOTREACHED*/ 3063aeddf3cSGarance A Drosehn } 307dea673e9SRodney W. Grimes if (resp == '\0') 308dea673e9SRodney W. Grimes return(0); 309dea673e9SRodney W. Grimes return(1); 310dea673e9SRodney W. Grimes } 311dea673e9SRodney W. Grimes 312dea673e9SRodney W. Grimes /* 313dea673e9SRodney W. Grimes * Check to see if there is enough space on the disk for size bytes. 314dea673e9SRodney W. Grimes * 1 == OK, 0 == Not OK. 315dea673e9SRodney W. Grimes */ 316dea673e9SRodney W. Grimes static int 317ba7a1ad7SGarance A Drosehn chksize(int size) 318dea673e9SRodney W. Grimes { 319dea673e9SRodney W. Grimes int spacefree; 320dea673e9SRodney W. Grimes struct statfs sfb; 321dea673e9SRodney W. Grimes 322dea673e9SRodney W. Grimes if (statfs(".", &sfb) < 0) { 323dea673e9SRodney W. Grimes syslog(LOG_ERR, "%s: %m", "statfs(\".\")"); 324dea673e9SRodney W. Grimes return (1); 325dea673e9SRodney W. Grimes } 326dea673e9SRodney W. Grimes spacefree = sfb.f_bavail * (sfb.f_bsize / 512); 327dea673e9SRodney W. Grimes size = (size + 511) / 512; 328dea673e9SRodney W. Grimes if (minfree + size > spacefree) 329dea673e9SRodney W. Grimes return(0); 330dea673e9SRodney W. Grimes return(1); 331dea673e9SRodney W. Grimes } 332dea673e9SRodney W. Grimes 333dea673e9SRodney W. Grimes static int 334ba7a1ad7SGarance A Drosehn read_number(const char *fn) 335dea673e9SRodney W. Grimes { 336dea673e9SRodney W. Grimes char lin[80]; 337dea673e9SRodney W. Grimes register FILE *fp; 338dea673e9SRodney W. Grimes 339dea673e9SRodney W. Grimes if ((fp = fopen(fn, "r")) == NULL) 340dea673e9SRodney W. Grimes return (0); 341dea673e9SRodney W. Grimes if (fgets(lin, 80, fp) == NULL) { 342dea673e9SRodney W. Grimes fclose(fp); 343dea673e9SRodney W. Grimes return (0); 344dea673e9SRodney W. Grimes } 345dea673e9SRodney W. Grimes fclose(fp); 346dea673e9SRodney W. Grimes return (atoi(lin)); 347dea673e9SRodney W. Grimes } 348dea673e9SRodney W. Grimes 349dea673e9SRodney W. Grimes /* 350dea673e9SRodney W. Grimes * Remove all the files associated with the current job being transfered. 351dea673e9SRodney W. Grimes */ 352dea673e9SRodney W. Grimes static void 353ba7a1ad7SGarance A Drosehn rcleanup(int signo __unused) 354dea673e9SRodney W. Grimes { 355ed4d1cf9SWarner Losh if (tfname[0] && strchr(tfname, '/') == NULL) 356dea673e9SRodney W. Grimes (void) unlink(tfname); 357ed4d1cf9SWarner Losh if (dfname[0] && strchr(dfname, '/') == NULL) { 358dea673e9SRodney W. Grimes do { 359dea673e9SRodney W. Grimes do 360dea673e9SRodney W. Grimes (void) unlink(dfname); 361dea673e9SRodney W. Grimes while (dfname[2]-- != 'A'); 362dea673e9SRodney W. Grimes dfname[2] = 'z'; 363dea673e9SRodney W. Grimes } while (dfname[0]-- != 'd'); 364ed4d1cf9SWarner Losh } 365dea673e9SRodney W. Grimes dfname[0] = '\0'; 366dea673e9SRodney W. Grimes } 367dea673e9SRodney W. Grimes 3686ee8b269SWarner Losh #ifdef __STDC__ 369dea673e9SRodney W. Grimes #include <stdarg.h> 370dea673e9SRodney W. Grimes #else 371dea673e9SRodney W. Grimes #include <varargs.h> 372dea673e9SRodney W. Grimes #endif 373dea673e9SRodney W. Grimes 374dea673e9SRodney W. Grimes static void 3756ee8b269SWarner Losh #ifdef __STDC__ 376dea673e9SRodney W. Grimes frecverr(const char *msg, ...) 377dea673e9SRodney W. Grimes #else 378dea673e9SRodney W. Grimes frecverr(msg, va_alist) 379dea673e9SRodney W. Grimes char *msg; 380dea673e9SRodney W. Grimes va_dcl 381dea673e9SRodney W. Grimes #endif 382dea673e9SRodney W. Grimes { 383dea673e9SRodney W. Grimes va_list ap; 3846ee8b269SWarner Losh #ifdef __STDC__ 385dea673e9SRodney W. Grimes va_start(ap, msg); 386dea673e9SRodney W. Grimes #else 387dea673e9SRodney W. Grimes va_start(ap); 388dea673e9SRodney W. Grimes #endif 389e84ad74cSGarance A Drosehn syslog(LOG_ERR, "Error receiving job from %s:", fromb); 390dea673e9SRodney W. Grimes vsyslog(LOG_ERR, msg, ap); 391dea673e9SRodney W. Grimes va_end(ap); 392e84ad74cSGarance A Drosehn /* 393e84ad74cSGarance A Drosehn * rcleanup is not called until AFTER logging the error message, 394e84ad74cSGarance A Drosehn * because rcleanup will zap some variables which may have been 395e84ad74cSGarance A Drosehn * supplied as parameters for that msg... 396e84ad74cSGarance A Drosehn */ 397e84ad74cSGarance A Drosehn rcleanup(0); 398e84ad74cSGarance A Drosehn /* 399e84ad74cSGarance A Drosehn * Add a minimal delay before returning the final error code to 400e84ad74cSGarance A Drosehn * the sending host. This just in case that machine responds 401e84ad74cSGarance A Drosehn * this error by INSTANTLY retrying (and instantly re-failing...). 402e84ad74cSGarance A Drosehn * It would be stupid of the sending host to do that, but if there 403e84ad74cSGarance A Drosehn * was a broken implementation which did it, the result might be 404e84ad74cSGarance A Drosehn * obscure performance problems and a flood of syslog messages on 405e84ad74cSGarance A Drosehn * the receiving host. 406e84ad74cSGarance A Drosehn */ 407e84ad74cSGarance A Drosehn sleep(2); /* a paranoid throttling measure */ 408dea673e9SRodney W. Grimes putchar('\1'); /* return error code */ 409dea673e9SRodney W. Grimes exit(1); 410dea673e9SRodney W. Grimes } 411