1 1.15 christos /* $NetBSD: startdaemon.c,v 1.15 2007/05/16 20:45:45 christos Exp $ */ 2 1.7 jtc 3 1.1 cgd /* 4 1.4 cgd * Copyright (c) 1983, 1993, 1994 5 1.4 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.13 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.9 mrg #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.9 mrg #if 0 35 1.4 cgd static char sccsid[] = "@(#)startdaemon.c 8.2 (Berkeley) 4/17/94"; 36 1.9 mrg #else 37 1.15 christos __RCSID("$NetBSD: startdaemon.c,v 1.15 2007/05/16 20:45:45 christos Exp $"); 38 1.9 mrg #endif 39 1.1 cgd #endif /* not lint */ 40 1.1 cgd 41 1.1 cgd 42 1.4 cgd #include <sys/param.h> 43 1.1 cgd #include <sys/socket.h> 44 1.1 cgd #include <sys/un.h> 45 1.4 cgd 46 1.4 cgd #include <dirent.h> 47 1.4 cgd #include <errno.h> 48 1.1 cgd #include <stdio.h> 49 1.4 cgd #include <unistd.h> 50 1.4 cgd #include <string.h> 51 1.9 mrg #include <err.h> 52 1.4 cgd #include "lp.h" 53 1.1 cgd #include "pathnames.h" 54 1.1 cgd 55 1.5 hpeyerl extern uid_t uid, euid; 56 1.5 hpeyerl 57 1.4 cgd /* 58 1.4 cgd * Tell the printer daemon that there are new files in the spool directory. 59 1.4 cgd */ 60 1.4 cgd 61 1.4 cgd int 62 1.14 christos startdaemon(const char *pname) 63 1.1 cgd { 64 1.4 cgd struct sockaddr_un un; 65 1.11 mrg int s; 66 1.15 christos int n; 67 1.1 cgd char buf[BUFSIZ]; 68 1.1 cgd 69 1.10 lukem s = socket(AF_LOCAL, SOCK_STREAM, 0); 70 1.1 cgd if (s < 0) { 71 1.9 mrg warn("socket"); 72 1.1 cgd return(0); 73 1.1 cgd } 74 1.4 cgd memset(&un, 0, sizeof(un)); 75 1.10 lukem un.sun_family = AF_LOCAL; 76 1.8 mrg strncpy(un.sun_path, _PATH_SOCKETNAME, sizeof(un.sun_path) - 1); 77 1.4 cgd #ifndef SUN_LEN 78 1.4 cgd #define SUN_LEN(unp) (strlen((unp)->sun_path) + 2) 79 1.4 cgd #endif 80 1.5 hpeyerl seteuid(euid); 81 1.11 mrg if (connect(s, (const struct sockaddr *)&un, 82 1.11 mrg (int)SUN_LEN(&un)) < 0) { 83 1.5 hpeyerl seteuid(uid); 84 1.9 mrg warn("connect"); 85 1.8 mrg (void)close(s); 86 1.1 cgd return(0); 87 1.1 cgd } 88 1.5 hpeyerl seteuid(uid); 89 1.14 christos n = snprintf(buf, sizeof(buf), "\1%s\n", pname); 90 1.1 cgd if (write(s, buf, n) != n) { 91 1.9 mrg warn("write"); 92 1.8 mrg (void)close(s); 93 1.1 cgd return(0); 94 1.1 cgd } 95 1.1 cgd if (read(s, buf, 1) == 1) { 96 1.1 cgd if (buf[0] == '\0') { /* everything is OK */ 97 1.8 mrg (void)close(s); 98 1.1 cgd return(1); 99 1.1 cgd } 100 1.1 cgd putchar(buf[0]); 101 1.1 cgd } 102 1.1 cgd while ((n = read(s, buf, sizeof(buf))) > 0) 103 1.1 cgd fwrite(buf, 1, n, stdout); 104 1.8 mrg (void)close(s); 105 1.1 cgd return(0); 106 1.1 cgd } 107