summaryrefslogtreecommitdiff
path: root/source3/printing/printing.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1998-11-03 02:25:28 +0000
committerJeremy Allison <jra@samba.org>1998-11-03 02:25:28 +0000
commit01e04614c7c466fdbdc398c782acaa931965f925 (patch)
treea1fcea4972a969633b057a6f99a611d379f1fe76 /source3/printing/printing.c
parent5900f6c85bfdf43712f51528b9d14b14338c8a0d (diff)
downloadsamba-01e04614c7c466fdbdc398c782acaa931965f925.tar.gz
samba-01e04614c7c466fdbdc398c782acaa931965f925.tar.bz2
samba-01e04614c7c466fdbdc398c782acaa931965f925.zip
Makefile.in configure configure.in include/proto.h smbd/noquotas.c smbd/quotas.c:
Added quotas patch for autoconf from Dejan Ilic <svedja@lysator.liu.se>. printing/printing.c: Filenames with spaces patch from Allan Bjorklund <allan@umich.edu> utils/nmblookup.c: Fix usage() function. smbd/reply.c: Split out the security=server and security=domain checks into check_server_security() and check_domain_security() to aid the writing of the 'hack' appliance mode invented by John Schimmel. Jeremy. (This used to be commit f09ab9b52251087a58af92ec753537ca34a970fc)
Diffstat (limited to 'source3/printing/printing.c')
-rw-r--r--source3/printing/printing.c282
1 files changed, 106 insertions, 176 deletions
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index 4df965204a..ddc0f70d18 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -193,6 +193,11 @@ here is an example of lpq output under osf/1
Warning: no daemon present
Rank Pri Owner Job Files Total Size
1st 0 tridge 148 README 8096 bytes
+
+
+<allan@umich.edu> June 30, 1998.
+Modified to handle file names with spaces, like the parse_lpq_lprng code
+further below.
****************************************************************************/
static BOOL parse_lpq_bsd(char *line,print_queue_struct *buf,BOOL first)
{
@@ -202,19 +207,21 @@ static BOOL parse_lpq_bsd(char *line,print_queue_struct *buf,BOOL first)
#define USERTOK 2
#define JOBTOK 3
#define FILETOK 4
-#define TOTALTOK 5
+#define TOTALTOK (count - 1)
#define NTOK 6
+#define MAXTOK 128
#else /* OSF1 */
#define RANKTOK 0
#define USERTOK 1
#define JOBTOK 2
#define FILETOK 3
-#define TOTALTOK 4
+#define TOTALTOK (count - 1)
#define NTOK 5
+#define MAXTOK 128
#endif /* OSF1 */
- fstring tok[NTOK];
- int count=0;
+ char *tok[MAXTOK];
+ int count = 0;
#ifdef OSF1
int length;
@@ -223,38 +230,19 @@ static BOOL parse_lpq_bsd(char *line,print_queue_struct *buf,BOOL first)
return(False);
#endif /* OSF1 */
- /* handle the case of "(standard input)" as a filename */
- string_sub(line,"standard input","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0;
- count<NTOK &&
- next_token(&line,tok[count],NULL, sizeof(tok[count]));
- count++) ;
+ tok[0] = strtok(line," \t");
+ count++;
+
+ while (((tok[count] = strtok(NULL," \t")) != NULL) && (count < MAXTOK)) {
+ count++;
+ }
- /* we must get NTOK tokens */
+ /* we must get at least NTOK tokens */
if (count < NTOK)
return(False);
/* the Job and Total columns must be integer */
- if (!isdigit((int)*tok[JOBTOK]) || !isdigit((int)*tok[TOTALTOK])) return(False);
-
- /* if the fname contains a space then use STDIN */
- if (strchr(tok[FILETOK],' '))
- fstrcpy(tok[FILETOK],"STDIN");
-
- /* only take the last part of the filename */
- {
- fstring tmp;
- char *p = strrchr(tok[FILETOK],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[FILETOK],tmp);
- }
- }
-
+ if (!isdigit(*tok[JOBTOK]) || !isdigit(*tok[TOTALTOK])) return(False);
buf->job = atoi(tok[JOBTOK]);
buf->size = atoi(tok[TOTALTOK]);
@@ -262,6 +250,23 @@ static BOOL parse_lpq_bsd(char *line,print_queue_struct *buf,BOOL first)
buf->time = time(NULL);
StrnCpy(buf->user,tok[USERTOK],sizeof(buf->user)-1);
StrnCpy(buf->file,tok[FILETOK],sizeof(buf->file)-1);
+
+ if ((FILETOK + 1) != TOTALTOK) {
+ int bufsize;
+ int i;
+
+ bufsize = sizeof(buf->file) - strlen(buf->file) - 1;
+
+ for (i = (FILETOK + 1); i < TOTALTOK; i++) {
+ strncat(buf->file," ",bufsize);
+ strncat(buf->file,tok[i],bufsize - 1);
+ bufsize = sizeof(buf->file) - strlen(buf->file) - 1;
+ if (bufsize <= 0) {
+ break;
+ }
+ }
+ }
+
#ifdef PRIOTOK
buf->priority = atoi(tok[PRIOTOK]);
#else
@@ -274,19 +279,20 @@ static BOOL parse_lpq_bsd(char *line,print_queue_struct *buf,BOOL first)
<magnus@hum.auc.dk>
LPRng_time modifies the current date by inserting the hour and minute from
the lpq output. The lpq time looks like "23:15:07"
+
+<allan@umich.edu> June 30, 1998.
+Modified to work with the re-written parse_lpq_lprng routine.
*/
-static time_t LPRng_time(fstring tok[],int pos)
+static time_t LPRng_time(char *time_string)
{
time_t jobtime;
struct tm *t;
- fstring tmp_time;
jobtime = time(NULL); /* default case: take current time */
t = localtime(&jobtime);
- t->tm_hour = atoi(tok[pos]);
- fstrcpy(tmp_time,tok[pos]);
- t->tm_min = atoi(tmp_time+3);
- t->tm_sec = atoi(tmp_time+6);
+ t->tm_hour = atoi(time_string);
+ t->tm_min = atoi(time_string+3);
+ t->tm_sec = atoi(time_string+6);
jobtime = mktime(t);
return jobtime;
@@ -294,162 +300,86 @@ static time_t LPRng_time(fstring tok[],int pos)
/****************************************************************************
- parse a lpq line
- <magnus@hum.auc.dk>
- Most of the code is directly reused from parse_lpq_bsd()
-
-here are two examples of lpq output under lprng (LPRng-2.3.0)
-
-Printer: humprn@hum-fak
- Queue: 1 printable job
- Server: pid 4840 active, Unspooler: pid 4841 active
- Status: job 'cfA659hum-fak', closing device at Fri Jun 21 10:10:21 1996
- Rank Owner Class Job Files Size Time
-active magnus@hum-fak A 659 /var/spool/smb/Notesblok-ikke-na4024 10:03:31
-
-Printer: humprn@hum-fak (printing disabled)
- Queue: 1 printable job
- Warning: no server present
- Status: finished operations at Fri Jun 21 10:10:32 1996
- Rank Owner Class Job Files Size Time
-1 magnus@hum-fak A 387 /var/spool/smb/netbudget.xls 21230 10:50:53
-
-******************************************************************************
-
-NEW FOR LPRng-3.3.5 !
-
-<reinelt@eunet.at>
-This will not happen anymore: with LPRng-3.3.5 there is always a blank between
-the filename and the size, and the format has changed:
-
-Printer: lj6@lizard 'HP LaserJet 6P'
- Queue: 2 printable jobs
- Server: pid 11941 active
- Unspooler: pid 11942 active
- Status: printed all 1818 bytes at 19:49:59
- Rank Owner/ID Class Job Files Size Time
-active root@lizard+937 A 937 (stdin) 1818 19:49:58
-2 root@lizard+969 A 969 junk.txt 2170 19:50:12
-
+ parse a lprng lpq line
+ <allan@umich.edu> June 30, 1998.
+ Re-wrote this to handle file names with spaces, multiple file names on one
+ lpq line, etc;
****************************************************************************/
static BOOL parse_lpq_lprng(char *line,print_queue_struct *buf,BOOL first)
{
-#define LPRNG_RANKTOK 0
-#define LPRNG_USERTOK 1
-#define LPRNG_PRIOTOK 2
-#define LPRNG_JOBTOK 3
-#define LPRNG_FILETOK 4
-#define LPRNG_TOTALTOK 5
-#define LPRNG_TIMETOK 6
-#define LPRNG_NTOK 7
+#define LPRNG_RANKTOK 0
+#define LPRNG_USERTOK 1
+#define LPRNG_PRIOTOK 2
+#define LPRNG_JOBTOK 3
+#define LPRNG_FILETOK 4
+#define LPRNG_TOTALTOK (num_tok - 2)
+#define LPRNG_TIMETOK (num_tok - 1)
+#define LPRNG_NTOK 7
+#define LPRNG_MAXTOK 128 /* PFMA just to keep us from running away. */
+
+ char *tokarr[LPRNG_MAXTOK];
+ char *cptr;
+ int num_tok = 0;
+
+ tokarr[0] = strtok(line," \t");
+ num_tok++;
+ while (((tokarr[num_tok] = strtok(NULL," \t")) != NULL)
+ && (num_tok < LPRNG_MAXTOK)) {
+ num_tok++;
+ }
-/****************************************************************************
-From lpd_status.c in LPRng source.
-0 1 2 3 4 5 6 7
-12345678901234567890123456789012345678901234567890123456789012345678901234
-" Rank Owner Class Job Files Size Time"
- plp_snprintf( msg, sizeof(msg), "%-6s %-19s %c %03d %-32s",
- number, line, priority, cfp->number, error );
- plp_snprintf( msg + len, sizeof(msg)-len, "%4d",
- cfp->jobsize );
- plp_snprintf( msg+len, sizeof(msg)-len, " %s",
- Time_str( 1, cfp->statb.st_ctime ) );
-****************************************************************************/
- /* The following define's are to be able to adjust the values if the
-LPRng source changes. This is from version 2.3.0. Magnus */
-#define SPACE_W 1
-#define RANK_W 6
-#define OWNER_W 19
-#define CLASS_W 1
-#define JOB_W 3
-#define FILE_W 32
-/* The JOBSIZE_W is too small for big jobs, so time is pushed to the right */
-#define JOBSIZE_W 4
-
-#define RANK_POS 0
-#define OWNER_POS RANK_POS+RANK_W+SPACE_W
-#define CLASS_POS OWNER_POS+OWNER_W+SPACE_W
-#define JOB_POS CLASS_POS+CLASS_W+SPACE_W
-#define FILE_POS JOB_POS+JOB_W+SPACE_W
-#define JOBSIZE_POS FILE_POS+FILE_W
+ /* We must get at least LPRNG_NTOK tokens. */
+ if (num_tok < LPRNG_NTOK) {
+ return(False);
+ }
-
- fstring tok[LPRNG_NTOK];
- int count=0;
+ if (!isdigit(*tokarr[LPRNG_JOBTOK]) || !isdigit(*tokarr[LPRNG_TOTALTOK])) {
+ return(False);
+ }
-#ifdef OLD_LPRNG
-/* We only need this bugfix for older versions of lprng - current
- information is that version 3.3.5 must not have this line
- in order to work correctly.
-*/
+ buf->job = atoi(tokarr[LPRNG_JOBTOK]);
+ buf->size = atoi(tokarr[LPRNG_TOTALTOK]);
-/*
-Need to insert one space in front of the size, to be able to use
-next_token() unchanged. I would have liked to be able to insert a
-space instead, to prevent losing that one char, but perl has spoiled
-me :-\ So I did it the easiest way.
+ if (strequal(tokarr[LPRNG_RANKTOK],"active")) {
+ buf->status = LPQ_PRINTING;
+ } else if (isdigit(*tokarr[LPRNG_RANKTOK])) {
+ buf->status = LPQ_QUEUED;
+ } else {
+ buf->status = LPQ_PAUSED;
+ }
-HINT: Use as short a path as possible for the samba spool directory.
-A long spool-path will just waste significant chars of the file name.
-*/
+ buf->priority = *tokarr[LPRNG_PRIOTOK] -'A';
- line[JOBSIZE_POS-1]=' ';
-#endif /* OLD_LPRNG */
+ buf->time = LPRng_time(tokarr[LPRNG_TIMETOK]);
- /* handle the case of "(stdin)" as a filename */
- string_sub(line,"stdin","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0;
- count<LPRNG_NTOK &&
- next_token(&line,tok[count],NULL, sizeof(tok[count]));
- count++) ;
+ StrnCpy(buf->user,tokarr[LPRNG_USERTOK],sizeof(buf->user)-1);
- /* we must get LPRNG_NTOK tokens */
- if (count < LPRNG_NTOK)
- return(False);
+ /* The '@hostname' prevents windows from displaying the printing icon
+ * for the current user on the taskbar. Plop in a null.
+ */
- /* the Job and Total columns must be integer */
- if (!isdigit((int)*tok[LPRNG_JOBTOK]) || !isdigit((int)*tok[LPRNG_TOTALTOK])) return(False);
+ if ((cptr = strchr(buf->user,'@')) != NULL) {
+ *cptr = '\0';
+ }
- /* if the fname contains a space then use STDIN */
- /* I do not understand how this would be possible. Magnus. */
- if (strchr(tok[LPRNG_FILETOK],' '))
- fstrcpy(tok[LPRNG_FILETOK],"STDIN");
+ StrnCpy(buf->file,tokarr[LPRNG_FILETOK],sizeof(buf->file)-1);
- /* only take the last part of the filename */
- {
- fstring tmp;
- char *p = strrchr(tok[LPRNG_FILETOK],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[LPRNG_FILETOK],tmp);
+ if ((LPRNG_FILETOK + 1) != LPRNG_TOTALTOK) {
+ int bufsize;
+ int i;
+
+ bufsize = sizeof(buf->file) - strlen(buf->file) - 1;
+
+ for (i = (LPRNG_FILETOK + 1); i < LPRNG_TOTALTOK; i++) {
+ strncat(buf->file," ",bufsize);
+ strncat(buf->file,tokarr[i],bufsize - 1);
+ bufsize = sizeof(buf->file) - strlen(buf->file) - 1;
+ if (bufsize <= 0) {
+ break;
}
+ }
}
-
- buf->job = atoi(tok[LPRNG_JOBTOK]);
- buf->size = atoi(tok[LPRNG_TOTALTOK]);
- if (strequal(tok[LPRNG_RANKTOK],"active"))
- buf->status = LPQ_PRINTING;
- else if (strequal(tok[LPRNG_RANKTOK],"hold"))
- buf->status = LPQ_PAUSED;
- else
- buf->status = LPQ_QUEUED;
- /* buf->time = time(NULL); */
- buf->time = LPRng_time(tok,LPRNG_TIMETOK);
-DEBUG(3,("Time reported for job %d is %s", buf->job, ctime(&buf->time)));
- StrnCpy(buf->user,tok[LPRNG_USERTOK],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[LPRNG_FILETOK],sizeof(buf->file)-1);
-#ifdef LPRNG_PRIOTOK
- /* Here I try to map the CLASS char to a number, but the number
- is never shown in Print Manager under NT anyway... Magnus. */
- buf->priority = atoi(tok[LPRNG_PRIOTOK]-('A'-1));
-#else
- buf->priority = 1;
-#endif
return(True);
}