From d95777ac34f68a3525786103b9217f6397d9f1d4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 1 Aug 2000 00:41:19 +0000 Subject: Added print job substitutions for %{printername}, %{sharename} and %{portname} from the NT printer tdb. Also added checks for time restrictions before allowing a job to print. Jeremy. (This used to be commit 8cfb55e81abebf0354e6d470ed68bbac1d6560ad) --- source3/printing/nt_printing.c | 62 +++++++++++++++++++++++++++++++++++++----- source3/printing/printing.c | 25 +++++++++++------ 2 files changed, 71 insertions(+), 16 deletions(-) (limited to 'source3/printing') diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index 1b9fe8b15f..0265cf5593 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -1380,7 +1380,7 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin fstrcpy(info.servername, global_myname); fstrcpy(info.printername, sharename); - fstrcpy(info.portname, sharename); + fstrcpy(info.portname, SAMBA_PRINTER_PORT_NAME); fstrcpy(info.drivername, lp_printerdriver(snum)); pstrcpy(info.comment, ""); fstrcpy(info.printprocessor, "winprint"); @@ -1398,10 +1398,8 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin if ((info.devmode = construct_nt_devicemode(info.printername)) == NULL) goto fail; -#if 1 if (!nt_printing_getsec(sharename, &info.secdesc_buf)) goto fail; -#endif *info_ptr = (NT_PRINTER_INFO_LEVEL_2 *)memdup(&info, sizeof(info)); if (! *info_ptr) { @@ -1438,7 +1436,8 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen dbuf = tdb_fetch(tdb, kbuf); #if 1 /* JRATEST */ - if (!dbuf.dptr) return get_a_printer_2_default(info_ptr, sharename); + if (!dbuf.dptr) + return get_a_printer_2_default(info_ptr, sharename); #else if (!dbuf.dptr) return 1; #endif @@ -1543,13 +1542,32 @@ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) return (success); } +/**************************************************************************** + Get the parameters we can substitute in an NT print job. +****************************************************************************/ + +void get_printer_subst_params(int snum, fstring *printername, fstring *sharename, fstring *portname) +{ + NT_PRINTER_INFO_LEVEL *printer = NULL; + + **printername = **sharename = **portname = '\0'; + + if (get_a_printer(&printer, 2, lp_servicename(snum))!=0) + return; + + fstrcpy(*printername, printer->info_2->printername); + fstrcpy(*sharename, printer->info_2->sharename); + fstrcpy(*portname, printer->info_2->portname); + + free_a_printer(&printer, 2); +} + /* * The function below are the high level ones. * only those ones must be called from the spoolss code. * JFM. */ - /**************************************************************************** ****************************************************************************/ uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) @@ -1827,10 +1845,10 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level, return (False); } - /**************************************************************************** -store a security desc for a printer + Store a security desc for a printer. ****************************************************************************/ + uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr) { SEC_DESC_BUF *new_secdesc_ctr = NULL; @@ -2160,4 +2178,34 @@ BOOL print_access_check(struct current_user *user, int snum, return result; } + +/**************************************************************************** + Check the time parameters allow a print operation. +*****************************************************************************/ + +BOOL print_time_access_check(int snum) +{ + NT_PRINTER_INFO_LEVEL *printer = NULL; + BOOL ok = False; + time_t now = time(NULL); + struct tm *t; + uint32 mins; + + if (get_a_printer(&printer, 2, lp_servicename(snum))!=0) + return False; + + if (printer->info_2->starttime == 0 && printer->info_2->untiltime == 0) + ok = True; + + t = gmtime(&now); + mins = (uint32)t->tm_hour*60 + (uint32)t->tm_min; + + if (mins >= printer->info_2->starttime && mins <= printer->info_2->untiltime) + ok = True; + + free_a_printer(&printer, 2); + + return ok; +} + #undef OLD_NTDOMAIN diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 64d5a7c4b1..c6252b8fb1 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -716,8 +716,9 @@ int print_job_start(struct current_user *user, int snum, char *jobname) } /**************************************************************************** -print a file - called on closing the file. This spools the job + Print a file - called on closing the file. This spools the job. ****************************************************************************/ + BOOL print_job_end(int jobid) { struct printjob *pjob = print_job_find(jobid); @@ -728,13 +729,16 @@ BOOL print_job_end(int jobid) char *wd, *p; pstring jobname; - if (!pjob) return False; + if (!pjob) + return False; - if (pjob->spooled || pjob->pid != local_pid) return False; + if (pjob->spooled || pjob->pid != local_pid) + return False; snum = print_job_snum(jobid); - if (sys_fstat(pjob->fd, &sbuf) == 0) pjob->size = sbuf.st_size; + if (sys_fstat(pjob->fd, &sbuf) == 0) + pjob->size = sbuf.st_size; close(pjob->fd); pjob->fd = -1; @@ -749,14 +753,17 @@ BOOL print_job_end(int jobid) /* we print from the directory path to give the best chance of parsing the lpq output */ wd = sys_getwd(current_directory); - if (!wd) return False; + if (!wd) + return False; pstrcpy(print_directory, pjob->filename); p = strrchr(print_directory,'/'); - if (!p) return False; + if (!p) + return False; *p++ = 0; - if (chdir(print_directory) != 0) return False; + if (chdir(print_directory) != 0) + return False; pstrcpy(jobname, pjob->jobname); pstring_sub(jobname, "'", "_"); @@ -780,10 +787,10 @@ BOOL print_job_end(int jobid) return True; } - /**************************************************************************** -check if the print queue has been updated recently enough + Check if the print queue has been updated recently enough. ****************************************************************************/ + static BOOL print_cache_expired(int snum) { fstring key; -- cgit