/* $Id$ * * This generates printcaps and other files for Athena print servers * * Copyright (C) 1992-1998 by the Massachusetts Institute of Technology. * For copying and distribution information, please see the file * . */ #include #include #include #include #include #include #include #include #include #ifdef HAVE_KRB4 #include #endif #include #include "util.h" EXEC SQL INCLUDE sqlca; RCSID("$Header$"); char *whoami = "cups-lpd-print.gen"; char *db = "moira/moira"; /* OMG, I hate this, but it's cleaner, I guess? */ void do_host(char *host); void sqlerr(void); #ifndef MAX #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) #endif int main(int argc, char **argv) { EXEC SQL BEGIN DECLARE SECTION; char name[MACHINE_NAME_SIZE]; EXEC SQL END DECLARE SECTION; init_acls(); EXEC SQL CONNECT :db; EXEC SQL WHENEVER SQLERROR DO sqlerr(); EXEC SQL DECLARE csr_hosts CURSOR FOR SELECT m.name FROM machine m, serverhosts sh WHERE m.mach_id = sh.mach_id AND sh.service = 'CUPS-LPD' AND sh.enable = 1; EXEC SQL OPEN csr_hosts; while (1) { EXEC SQL FETCH csr_hosts INTO :name; if (sqlca.sqlcode) break; strtrim(name); do_host(name); } EXEC SQL CLOSE csr_hosts; exit(MR_SUCCESS); } void printer_user_list(FILE *out, char *type, int id, char *str) { struct save_queue *sq; struct imember *m; sq = get_acl(type, id, NULL); while (sq_remove_data(sq, &m)) { if (m->type == 'U') fprintf(out, "%s %s\n", str, m->name); freeimember(m); } sq_destroy(sq); } void do_host(char *host) { EXEC SQL BEGIN DECLARE SECTION; char rp[PRINTERS_RP_SIZE], name[PRINTERS_NAME_SIZE]; char duplexname[PRINTERS_DUPLEXNAME_SIZE], location[PRINTERS_LOCATION_SIZE]; char hwtype[PRINTERS_HWTYPE_SIZE], lowerhwtype[PRINTERS_HWTYPE_SIZE]; char modtime[PRINTERS_MODTIME_SIZE], lmodtime[LIST_MODTIME_SIZE]; char contact[PRINTERS_CONTACT_SIZE], hostname[MACHINE_NAME_SIZE]; char cupshosts[MACHINE_NAME_SIZE], prtype [PRINTERS_TYPE_SIZE]; char *spoolhost = host, *unixtime_fmt = UNIXTIME_FMT, *p; char *lhost; int ka, pc, ac, lpc_acl, top_lpc_acl, banner, rm; EXEC SQL END DECLARE SECTION; TARFILE *tf; FILE *out; char filename[MAXPATHLEN], *duptc; time_t mtime, now = time(NULL); lhost = (char *) strdup (host); for (p = lhost; *p; p++) *p = tolower(*p); sprintf(filename, "%s/cups-lpd/%s", DCM_DIR, host); tf = tarfile_open(filename); /* LPRng printers */ out = tarfile_start(tf, "/etc/cups/lprng.printers.txt", 0644, 0, 0, "root", "lp", now); EXEC SQL DECLARE csr_lprng CURSOR FOR SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype, m.name, pr.banner, pr.location, pr.contact, pr.ka, pr.ac, pr.type as prtype FROM printers pr, machine m, serverhosts sh WHERE m.mach_id = sh.mach_id AND sh.service = 'PRINT' AND sh.enable = 1 AND pr.rm = m.mach_id ORDER BY pr.name; EXEC SQL OPEN csr_lprng; while (1) { EXEC SQL FETCH csr_lprng INTO :rp, :name, :duplexname, :hwtype, :hostname, :banner, :location, :contact, :ka, :ac, :prtype; if (sqlca.sqlcode) break; strtrim(rp); strtrim(name); strtrim(duplexname); strtrim(hwtype); strtrim(hostname); strtrim(location); strtrim(contact); strcpy(lowerhwtype, hwtype); for (p = lowerhwtype; *p; p++) *p = tolower(*p); for (p = name;*p;p++) *p = tolower(*p); for (p = duplexname;*p;p++) *p = tolower(*p); fprintf(out, "%s|%s|%s|%s|%s|%s|%s\n", name,duplexname,hostname,location,hwtype,prtype,rp); } EXEC SQL CLOSE csr_lprng; tarfile_end(tf); /* CUPS printers */ out = tarfile_start(tf, "/etc/cups/cups.printers.txt", 0644, 0, 0, "root", "lp", now); EXEC SQL DECLARE csr_cups CURSOR FOR SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype, m.name, pr.banner, pr.location, pr.contact, pr.ka, pr.ac, pr.type as prtype FROM printers pr, machine m, serverhosts sh WHERE m.mach_id = sh.mach_id AND sh.service = 'CUPS-PRINT' AND sh.enable = 1 AND pr.rm = m.mach_id ORDER BY pr.name; EXEC SQL OPEN csr_cups; while (1) { EXEC SQL FETCH csr_cups INTO :rp, :name, :duplexname, :hwtype, :hostname, :banner, :location, :contact, :ka, :ac, :prtype; if (sqlca.sqlcode) break; strtrim(rp); strtrim(name); strtrim(duplexname); strtrim(hwtype); strtrim(hostname); strtrim(location); strtrim(contact); strcpy(lowerhwtype, hwtype); for (p = lowerhwtype; *p; p++) *p = tolower(*p); for (p = name;*p;p++) *p = tolower(*p); for (p = duplexname;*p;p++) *p = tolower(*p); fprintf(out, "%s|%s|%s|%s|%s|%s\n", name,duplexname,hostname,location,hwtype,prtype); } EXEC SQL CLOSE csr_cups; tarfile_end(tf); tarfile_close(tf); } void sqlerr(void) { db_error(sqlca.sqlcode); }