18a16b7a1SPedro F. Giffuni /*- 28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 38a16b7a1SPedro F. Giffuni * 4dea673e9SRodney W. Grimes * Copyright (c) 1983, 1993 5dea673e9SRodney W. Grimes * The Regents of the University of California. All rights reserved. 6dea673e9SRodney W. Grimes * 7dea673e9SRodney W. Grimes * 8dea673e9SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 9dea673e9SRodney W. Grimes * modification, are permitted provided that the following conditions 10dea673e9SRodney W. Grimes * are met: 11dea673e9SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 12dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 13dea673e9SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 14dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 15dea673e9SRodney W. Grimes * documentation and/or other materials provided with the distribution. 16fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 17dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 18dea673e9SRodney W. Grimes * without specific prior written permission. 19dea673e9SRodney W. Grimes * 20dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30dea673e9SRodney W. Grimes * SUCH DAMAGE. 31dea673e9SRodney W. Grimes */ 32dea673e9SRodney W. Grimes 33dea673e9SRodney W. Grimes #ifndef lint 349b3fe531SPhilippe Charnier static const char copyright[] = 35dea673e9SRodney W. Grimes "@(#) Copyright (c) 1983, 1993\n\ 36dea673e9SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 37dea673e9SRodney W. Grimes #endif /* not lint */ 38dea673e9SRodney W. Grimes 399b3fe531SPhilippe Charnier #if 0 40a6381ce1SGarance A Drosehn #ifndef lint 415458e2f4SJoerg Wunsch static char sccsid[] = "@(#)recvjob.c 8.2 (Berkeley) 4/27/95"; 42a6381ce1SGarance A Drosehn #endif /* not lint */ 439b3fe531SPhilippe Charnier #endif 44055c9045SGarance A Drosehn 45055c9045SGarance A Drosehn #include "lp.cdefs.h" /* A cross-platform version of <sys/cdefs.h> */ 46055c9045SGarance A Drosehn __FBSDID("$FreeBSD$"); 47dea673e9SRodney W. Grimes 48dea673e9SRodney W. Grimes /* 49dea673e9SRodney W. Grimes * Receive printer jobs from the network, queue them and 50dea673e9SRodney W. Grimes * start the printer daemon. 51dea673e9SRodney W. Grimes */ 52dea673e9SRodney W. Grimes #include <sys/param.h> 53dea673e9SRodney W. Grimes #include <sys/mount.h> 54dea673e9SRodney W. Grimes #include <sys/stat.h> 55dea673e9SRodney W. Grimes 56dea673e9SRodney W. Grimes #include <unistd.h> 57dea673e9SRodney W. Grimes #include <signal.h> 58dea673e9SRodney W. Grimes #include <fcntl.h> 59dea673e9SRodney W. Grimes #include <dirent.h> 606d39e1b7SGarance A Drosehn #include <errno.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" 67442e0eafSGarance A Drosehn #include "ctlinfo.h" 68dea673e9SRodney W. Grimes #include "extern.h" 69dea673e9SRodney W. Grimes #include "pathnames.h" 70dea673e9SRodney W. Grimes 71*365348f6SElyes Haouas #define ack() (void) write(STDOUT_FILENO, sp, (size_t)1) 72dea673e9SRodney W. Grimes 730de95e16SGarance A Drosehn /* 740de95e16SGarance A Drosehn * The buffer size to use when reading/writing spool files. 750de95e16SGarance A Drosehn */ 760de95e16SGarance A Drosehn #define SPL_BUFSIZ BUFSIZ 770de95e16SGarance A Drosehn 785f87a7b6SWarner Losh static char dfname[NAME_MAX]; /* data files */ 79dea673e9SRodney W. Grimes static int minfree; /* keep at least minfree blocks available */ 80ba7a1ad7SGarance A Drosehn static const char *sp = ""; 815f87a7b6SWarner Losh static char tfname[NAME_MAX]; /* tmp copy of cf before linking */ 82dea673e9SRodney W. Grimes 83ba7a1ad7SGarance A Drosehn static int chksize(int _size); 846d39e1b7SGarance A Drosehn static void frecverr(const char *_msg, ...) __printf0like(1, 2); 85ba7a1ad7SGarance A Drosehn static int noresponse(void); 86ba7a1ad7SGarance A Drosehn static void rcleanup(int _signo); 87ba7a1ad7SGarance A Drosehn static int read_number(const char *_fn); 88190c0c38SGarance A Drosehn static int readfile(struct printer *_pp, char *_file, size_t _size); 89ba7a1ad7SGarance A Drosehn static int readjob(struct printer *_pp); 90dea673e9SRodney W. Grimes 91dea673e9SRodney W. Grimes 92dea673e9SRodney W. Grimes void 93ba7a1ad7SGarance A Drosehn recvjob(const char *printer) 94dea673e9SRodney W. Grimes { 95dea673e9SRodney W. Grimes struct stat stb; 96dea673e9SRodney W. Grimes int status; 974a1a0dbeSGarrett Wollman struct printer myprinter, *pp = &myprinter; 98dea673e9SRodney W. Grimes 99dea673e9SRodney W. Grimes /* 100dea673e9SRodney W. Grimes * Perform lookup for printer name or abbreviation 101dea673e9SRodney W. Grimes */ 1028830deaeSGarrett Wollman init_printer(pp); 1034a1a0dbeSGarrett Wollman status = getprintcap(printer, pp); 1044a1a0dbeSGarrett Wollman switch (status) { 1054a1a0dbeSGarrett Wollman case PCAPERR_OSERR: 106dea673e9SRodney W. Grimes frecverr("cannot open printer description file"); 1074a1a0dbeSGarrett Wollman break; 1084a1a0dbeSGarrett Wollman case PCAPERR_NOTFOUND: 109dea673e9SRodney W. Grimes frecverr("unknown printer %s", printer); 1104a1a0dbeSGarrett Wollman break; 1114a1a0dbeSGarrett Wollman case PCAPERR_TCLOOP: 1124a1a0dbeSGarrett Wollman fatal(pp, "potential reference loop detected in printcap file"); 1134a1a0dbeSGarrett Wollman default: 1144a1a0dbeSGarrett Wollman break; 1154a1a0dbeSGarrett Wollman } 116dea673e9SRodney W. Grimes 11753953407SGarance A Drosehn (void) close(STDERR_FILENO); /* set up log file */ 1184a1a0dbeSGarrett Wollman if (open(pp->log_file, O_WRONLY|O_APPEND, 0664) < 0) { 1194a1a0dbeSGarrett Wollman syslog(LOG_ERR, "%s: %m", pp->log_file); 120dea673e9SRodney W. Grimes (void) open(_PATH_DEVNULL, O_WRONLY); 121dea673e9SRodney W. Grimes } 122dea673e9SRodney W. Grimes 1234a1a0dbeSGarrett Wollman if (chdir(pp->spool_dir) < 0) 1246d39e1b7SGarance A Drosehn frecverr("%s: chdir(%s): %s", pp->printer, pp->spool_dir, 1256d39e1b7SGarance A Drosehn strerror(errno)); 1264a1a0dbeSGarrett Wollman if (stat(pp->lock_file, &stb) == 0) { 127dea673e9SRodney W. Grimes if (stb.st_mode & 010) { 128dea673e9SRodney W. Grimes /* queue is disabled */ 129dea673e9SRodney W. Grimes putchar('\1'); /* return error code */ 130dea673e9SRodney W. Grimes exit(1); 131dea673e9SRodney W. Grimes } 1324a1a0dbeSGarrett Wollman } else if (stat(pp->spool_dir, &stb) < 0) 1336d39e1b7SGarance A Drosehn frecverr("%s: stat(%s): %s", pp->printer, pp->spool_dir, 1346d39e1b7SGarance A Drosehn strerror(errno)); 135dea673e9SRodney W. Grimes minfree = 2 * read_number("minfree"); /* scale KB to 512 blocks */ 136dea673e9SRodney W. Grimes signal(SIGTERM, rcleanup); 137dea673e9SRodney W. Grimes signal(SIGPIPE, rcleanup); 138dea673e9SRodney W. Grimes 1394a1a0dbeSGarrett Wollman if (readjob(pp)) 1404a1a0dbeSGarrett Wollman printjob(pp); 141dea673e9SRodney W. Grimes } 142dea673e9SRodney W. Grimes 143dea673e9SRodney W. Grimes /* 144dea673e9SRodney W. Grimes * Read printer jobs sent by lpd and copy them to the spooling directory. 145b5635ba0SPedro F. Giffuni * Return the number of jobs successfully transferred. 146dea673e9SRodney W. Grimes */ 147dea673e9SRodney W. Grimes static int 148ba7a1ad7SGarance A Drosehn readjob(struct printer *pp) 149dea673e9SRodney W. Grimes { 1506522ebecSGarance A Drosehn register int size; 1516522ebecSGarance A Drosehn int cfcnt, dfcnt; 152190c0c38SGarance A Drosehn char *cp, *clastp, *errmsg; 1536522ebecSGarance A Drosehn char givenid[32], givenhost[MAXHOSTNAMELEN]; 154dea673e9SRodney W. Grimes 155dea673e9SRodney W. Grimes ack(); 1566522ebecSGarance A Drosehn cfcnt = 0; 1576522ebecSGarance A Drosehn dfcnt = 0; 158dea673e9SRodney W. Grimes for (;;) { 159dea673e9SRodney W. Grimes /* 160dea673e9SRodney W. Grimes * Read a command to tell us what to do 161dea673e9SRodney W. Grimes */ 162dea673e9SRodney W. Grimes cp = line; 163190c0c38SGarance A Drosehn clastp = line + sizeof(line) - 1; 164dea673e9SRodney W. Grimes do { 165190c0c38SGarance A Drosehn size = read(STDOUT_FILENO, cp, (size_t)1); 166190c0c38SGarance A Drosehn if (size != (ssize_t)1) { 167190c0c38SGarance A Drosehn if (size < (ssize_t)0) { 1689b3fe531SPhilippe Charnier frecverr("%s: lost connection", 1694a1a0dbeSGarrett Wollman pp->printer); 1703aeddf3cSGarance A Drosehn /*NOTREACHED*/ 1713aeddf3cSGarance A Drosehn } 1726522ebecSGarance A Drosehn return (cfcnt); 173dea673e9SRodney W. Grimes } 174190c0c38SGarance A Drosehn } while ((*cp++ != '\n') && (cp <= clastp)); 175190c0c38SGarance A Drosehn if (cp > clastp) { 1763aeddf3cSGarance A Drosehn frecverr("%s: readjob overflow", pp->printer); 1773aeddf3cSGarance A Drosehn /*NOTREACHED*/ 1783aeddf3cSGarance A Drosehn } 179dea673e9SRodney W. Grimes *--cp = '\0'; 180dea673e9SRodney W. Grimes cp = line; 181dea673e9SRodney W. Grimes switch (*cp++) { 182dea673e9SRodney W. Grimes case '\1': /* cleanup because data sent was bad */ 183dea673e9SRodney W. Grimes rcleanup(0); 184dea673e9SRodney W. Grimes continue; 185dea673e9SRodney W. Grimes 186dea673e9SRodney W. Grimes case '\2': /* read cf file */ 187dea673e9SRodney W. Grimes size = 0; 1886522ebecSGarance A Drosehn dfcnt = 0; 189dea673e9SRodney W. Grimes while (*cp >= '0' && *cp <= '9') 190dea673e9SRodney W. Grimes size = size * 10 + (*cp++ - '0'); 191dea673e9SRodney W. Grimes if (*cp++ != ' ') 192dea673e9SRodney W. Grimes break; 193dea673e9SRodney W. Grimes /* 194dea673e9SRodney W. Grimes * host name has been authenticated, we use our 195dea673e9SRodney W. Grimes * view of the host name since we may be passed 196dea673e9SRodney W. Grimes * something different than what gethostbyaddr() 197dea673e9SRodney W. Grimes * returns 198dea673e9SRodney W. Grimes */ 1995d7321f6SGarance A Drosehn strlcpy(cp + 6, from_host, sizeof(line) 2005d7321f6SGarance A Drosehn + (size_t)(line - cp - 6)); 2017cf2c478SGarance A Drosehn if (strchr(cp, '/')) { 2027cf2c478SGarance A Drosehn frecverr("readjob: %s: illegal path name", cp); 2037cf2c478SGarance A Drosehn /*NOTREACHED*/ 2047cf2c478SGarance A Drosehn } 2055d7321f6SGarance A Drosehn strlcpy(tfname, cp, sizeof(tfname)); 2065f87a7b6SWarner Losh tfname[sizeof (tfname) - 1] = '\0'; 207dea673e9SRodney W. Grimes tfname[0] = 't'; 208dea673e9SRodney W. Grimes if (!chksize(size)) { 209190c0c38SGarance A Drosehn (void) write(STDOUT_FILENO, "\2", (size_t)1); 210dea673e9SRodney W. Grimes continue; 211dea673e9SRodney W. Grimes } 212190c0c38SGarance A Drosehn if (!readfile(pp, tfname, (size_t)size)) { 213dea673e9SRodney W. Grimes rcleanup(0); 214dea673e9SRodney W. Grimes continue; 215dea673e9SRodney W. Grimes } 216442e0eafSGarance A Drosehn errmsg = ctl_renametf(pp->printer, tfname); 217dea673e9SRodney W. Grimes tfname[0] = '\0'; 218442e0eafSGarance A Drosehn if (errmsg != NULL) { 219442e0eafSGarance A Drosehn frecverr("%s: %s", pp->printer, errmsg); 220442e0eafSGarance A Drosehn /*NOTREACHED*/ 221442e0eafSGarance A Drosehn } 2226522ebecSGarance A Drosehn cfcnt++; 223dea673e9SRodney W. Grimes continue; 224dea673e9SRodney W. Grimes 225dea673e9SRodney W. Grimes case '\3': /* read df file */ 2266522ebecSGarance A Drosehn *givenid = '\0'; 2276522ebecSGarance A Drosehn *givenhost = '\0'; 228dea673e9SRodney W. Grimes size = 0; 229dea673e9SRodney W. Grimes while (*cp >= '0' && *cp <= '9') 230dea673e9SRodney W. Grimes size = size * 10 + (*cp++ - '0'); 231dea673e9SRodney W. Grimes if (*cp++ != ' ') 232dea673e9SRodney W. Grimes break; 2337cf2c478SGarance A Drosehn if (strchr(cp, '/')) { 2347cf2c478SGarance A Drosehn frecverr("readjob: %s: illegal path name", cp); 2357cf2c478SGarance A Drosehn /*NOTREACHED*/ 2367cf2c478SGarance A Drosehn } 237dea673e9SRodney W. Grimes if (!chksize(size)) { 238190c0c38SGarance A Drosehn (void) write(STDOUT_FILENO, "\2", (size_t)1); 239dea673e9SRodney W. Grimes continue; 240dea673e9SRodney W. Grimes } 2415d7321f6SGarance A Drosehn strlcpy(dfname, cp, sizeof(dfname)); 2426522ebecSGarance A Drosehn dfcnt++; 2436522ebecSGarance A Drosehn trstat_init(pp, dfname, dfcnt); 244190c0c38SGarance A Drosehn (void) readfile(pp, dfname, (size_t)size); 245190c0c38SGarance A Drosehn trstat_write(pp, TR_RECVING, (size_t)size, givenid, 246190c0c38SGarance A Drosehn from_host, givenhost); 247dea673e9SRodney W. Grimes continue; 248dea673e9SRodney W. Grimes } 249dea673e9SRodney W. Grimes frecverr("protocol screwup: %s", line); 2503aeddf3cSGarance A Drosehn /*NOTREACHED*/ 251dea673e9SRodney W. Grimes } 252dea673e9SRodney W. Grimes } 253dea673e9SRodney W. Grimes 254dea673e9SRodney W. Grimes /* 255dea673e9SRodney W. Grimes * Read files send by lpd and copy them to the spooling directory. 256dea673e9SRodney W. Grimes */ 257dea673e9SRodney W. Grimes static int 258190c0c38SGarance A Drosehn readfile(struct printer *pp, char *file, size_t size) 259dea673e9SRodney W. Grimes { 260dea673e9SRodney W. Grimes register char *cp; 2610de95e16SGarance A Drosehn char buf[SPL_BUFSIZ]; 262190c0c38SGarance A Drosehn size_t amt, i; 263190c0c38SGarance A Drosehn int err, fd, j; 264dea673e9SRodney W. Grimes 265dea673e9SRodney W. Grimes fd = open(file, O_CREAT|O_EXCL|O_WRONLY, FILMOD); 2663aeddf3cSGarance A Drosehn if (fd < 0) { 2676d39e1b7SGarance A Drosehn frecverr("%s: readfile: error on open(%s): %s", 2686d39e1b7SGarance A Drosehn pp->printer, file, strerror(errno)); 2693aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2703aeddf3cSGarance A Drosehn } 271dea673e9SRodney W. Grimes ack(); 272dea673e9SRodney W. Grimes err = 0; 2730de95e16SGarance A Drosehn for (i = 0; i < size; i += SPL_BUFSIZ) { 2740de95e16SGarance A Drosehn amt = SPL_BUFSIZ; 275dea673e9SRodney W. Grimes cp = buf; 276dea673e9SRodney W. Grimes if (i + amt > size) 277dea673e9SRodney W. Grimes amt = size - i; 278dea673e9SRodney W. Grimes do { 2796897f282SGarance A Drosehn j = read(STDOUT_FILENO, cp, amt); 2803aeddf3cSGarance A Drosehn if (j <= 0) { 2813aeddf3cSGarance A Drosehn frecverr("%s: lost connection", pp->printer); 2823aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2833aeddf3cSGarance A Drosehn } 284dea673e9SRodney W. Grimes amt -= j; 285dea673e9SRodney W. Grimes cp += j; 286dea673e9SRodney W. Grimes } while (amt > 0); 2870de95e16SGarance A Drosehn amt = SPL_BUFSIZ; 288dea673e9SRodney W. Grimes if (i + amt > size) 289dea673e9SRodney W. Grimes amt = size - i; 290190c0c38SGarance A Drosehn if (write(fd, buf, amt) != (ssize_t)amt) { 291dea673e9SRodney W. Grimes err++; 292dea673e9SRodney W. Grimes break; 293dea673e9SRodney W. Grimes } 294dea673e9SRodney W. Grimes } 295dea673e9SRodney W. Grimes (void) close(fd); 2963aeddf3cSGarance A Drosehn if (err) { 2973aeddf3cSGarance A Drosehn frecverr("%s: write error on close(%s)", pp->printer, file); 2983aeddf3cSGarance A Drosehn /*NOTREACHED*/ 2993aeddf3cSGarance A Drosehn } 300dea673e9SRodney W. Grimes if (noresponse()) { /* file sent had bad data in it */ 301ed4d1cf9SWarner Losh if (strchr(file, '/') == NULL) 302dea673e9SRodney W. Grimes (void) unlink(file); 303dea673e9SRodney W. Grimes return (0); 304dea673e9SRodney W. Grimes } 305dea673e9SRodney W. Grimes ack(); 306dea673e9SRodney W. Grimes return (1); 307dea673e9SRodney W. Grimes } 308dea673e9SRodney W. Grimes 309dea673e9SRodney W. Grimes static int 310ba7a1ad7SGarance A Drosehn noresponse(void) 311dea673e9SRodney W. Grimes { 312dea673e9SRodney W. Grimes char resp; 313dea673e9SRodney W. Grimes 314190c0c38SGarance A Drosehn if (read(STDOUT_FILENO, &resp, (size_t)1) != 1) { 3153aeddf3cSGarance A Drosehn frecverr("lost connection in noresponse()"); 3163aeddf3cSGarance A Drosehn /*NOTREACHED*/ 3173aeddf3cSGarance A Drosehn } 318dea673e9SRodney W. Grimes if (resp == '\0') 319dea673e9SRodney W. Grimes return(0); 320dea673e9SRodney W. Grimes return(1); 321dea673e9SRodney W. Grimes } 322dea673e9SRodney W. Grimes 323dea673e9SRodney W. Grimes /* 324dea673e9SRodney W. Grimes * Check to see if there is enough space on the disk for size bytes. 325dea673e9SRodney W. Grimes * 1 == OK, 0 == Not OK. 326dea673e9SRodney W. Grimes */ 327dea673e9SRodney W. Grimes static int 328ba7a1ad7SGarance A Drosehn chksize(int size) 329dea673e9SRodney W. Grimes { 330ee9069d1SBernd Walter int64_t spacefree; 331dea673e9SRodney W. Grimes struct statfs sfb; 332dea673e9SRodney W. Grimes 333dea673e9SRodney W. Grimes if (statfs(".", &sfb) < 0) { 334dea673e9SRodney W. Grimes syslog(LOG_ERR, "%s: %m", "statfs(\".\")"); 335dea673e9SRodney W. Grimes return (1); 336dea673e9SRodney W. Grimes } 337dea673e9SRodney W. Grimes spacefree = sfb.f_bavail * (sfb.f_bsize / 512); 338dea673e9SRodney W. Grimes size = (size + 511) / 512; 339dea673e9SRodney W. Grimes if (minfree + size > spacefree) 340dea673e9SRodney W. Grimes return(0); 341dea673e9SRodney W. Grimes return(1); 342dea673e9SRodney W. Grimes } 343dea673e9SRodney W. Grimes 344dea673e9SRodney W. Grimes static int 345ba7a1ad7SGarance A Drosehn read_number(const char *fn) 346dea673e9SRodney W. Grimes { 347dea673e9SRodney W. Grimes char lin[80]; 348dea673e9SRodney W. Grimes register FILE *fp; 349dea673e9SRodney W. Grimes 350dea673e9SRodney W. Grimes if ((fp = fopen(fn, "r")) == NULL) 351dea673e9SRodney W. Grimes return (0); 352d0691403SKevin Lo if (fgets(lin, sizeof(lin), fp) == NULL) { 353dea673e9SRodney W. Grimes fclose(fp); 354dea673e9SRodney W. Grimes return (0); 355dea673e9SRodney W. Grimes } 356dea673e9SRodney W. Grimes fclose(fp); 357dea673e9SRodney W. Grimes return (atoi(lin)); 358dea673e9SRodney W. Grimes } 359dea673e9SRodney W. Grimes 360dea673e9SRodney W. Grimes /* 361b5635ba0SPedro F. Giffuni * Remove all the files associated with the current job being transferred. 362dea673e9SRodney W. Grimes */ 363dea673e9SRodney W. Grimes static void 364ba7a1ad7SGarance A Drosehn rcleanup(int signo __unused) 365dea673e9SRodney W. Grimes { 366ed4d1cf9SWarner Losh if (tfname[0] && strchr(tfname, '/') == NULL) 367dea673e9SRodney W. Grimes (void) unlink(tfname); 368ed4d1cf9SWarner Losh if (dfname[0] && strchr(dfname, '/') == NULL) { 369dea673e9SRodney W. Grimes do { 370dea673e9SRodney W. Grimes do 371dea673e9SRodney W. Grimes (void) unlink(dfname); 372dea673e9SRodney W. Grimes while (dfname[2]-- != 'A'); 373dea673e9SRodney W. Grimes dfname[2] = 'z'; 374dea673e9SRodney W. Grimes } while (dfname[0]-- != 'd'); 375ed4d1cf9SWarner Losh } 376dea673e9SRodney W. Grimes dfname[0] = '\0'; 377dea673e9SRodney W. Grimes } 378dea673e9SRodney W. Grimes 379dea673e9SRodney W. Grimes #include <stdarg.h> 380dea673e9SRodney W. Grimes 381dea673e9SRodney W. Grimes static void 382dea673e9SRodney W. Grimes frecverr(const char *msg, ...) 383dea673e9SRodney W. Grimes { 384dea673e9SRodney W. Grimes va_list ap; 385dea673e9SRodney W. Grimes va_start(ap, msg); 386cc3fd56fSGarance A Drosehn syslog(LOG_ERR, "Error receiving job from %s:", from_host); 387dea673e9SRodney W. Grimes vsyslog(LOG_ERR, msg, ap); 388dea673e9SRodney W. Grimes va_end(ap); 389e84ad74cSGarance A Drosehn /* 390e84ad74cSGarance A Drosehn * rcleanup is not called until AFTER logging the error message, 391e84ad74cSGarance A Drosehn * because rcleanup will zap some variables which may have been 392e84ad74cSGarance A Drosehn * supplied as parameters for that msg... 393e84ad74cSGarance A Drosehn */ 394e84ad74cSGarance A Drosehn rcleanup(0); 395e84ad74cSGarance A Drosehn /* 396e84ad74cSGarance A Drosehn * Add a minimal delay before returning the final error code to 397e84ad74cSGarance A Drosehn * the sending host. This just in case that machine responds 398e84ad74cSGarance A Drosehn * this error by INSTANTLY retrying (and instantly re-failing...). 399e84ad74cSGarance A Drosehn * It would be stupid of the sending host to do that, but if there 400e84ad74cSGarance A Drosehn * was a broken implementation which did it, the result might be 401e84ad74cSGarance A Drosehn * obscure performance problems and a flood of syslog messages on 402e84ad74cSGarance A Drosehn * the receiving host. 403e84ad74cSGarance A Drosehn */ 404e84ad74cSGarance A Drosehn sleep(2); /* a paranoid throttling measure */ 405dea673e9SRodney W. Grimes putchar('\1'); /* return error code */ 406dea673e9SRodney W. Grimes exit(1); 407dea673e9SRodney W. Grimes } 408