Note: This is a beta release of Red Hat Bugzilla 5.0. The data contained within is a snapshot of the live data so any changes you make will not be reflected in the production Bugzilla. Also email is disabled so feel free to test any aspect of the site that you want. File any problems you find or give feedback here.
Bug 8271 - lpd job printing too vague about errors; doesn't syslog them
Summary: lpd job printing too vague about errors; doesn't syslog them
Keywords:
Status: CLOSED RAWHIDE
Alias: None
Product: Red Hat Linux
Classification: Retired
Component: lpr
Version: 6.1
Hardware: All
OS: Linux
medium
medium
Target Milestone: ---
Assignee: Bernhard Rosenkraenzer
QA Contact:
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2000-01-07 19:07 UTC by Jonathan Kamens
Modified: 2008-05-01 15:37 UTC (History)
0 users

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2000-02-10 14:55:13 UTC


Attachments (Terms of Use)
new patch for lpr-0.50 (deleted)
2000-02-10 14:45 UTC, Jonathan Kamens
no flags Details | Diff

Description Jonathan Kamens 2000-01-07 19:07:34 UTC
Lpd bundles together several different errors with very different possible
causes under a single error code, "ACCESS".  Furthermore, while it sends
E-mail when this error occurs, it doesn't syslog anything.  The patch below
splits the error into three different errors and logs the error to syslog
in addition to sending E-mail.

--- lpd/printjob.c.orig	Fri Jan  7 14:08:11 2000
+++ lpd/printjob.c	Fri Jan  7 14:11:19 2000
@@ -58,6 +58,8 @@
 #define	FILTERERR	3
 #define	ACCESS		4
 #define UNLINK		5
+#define BADLINK         6
+#define NOSTAT          7

 static dev_t	 fdev;		/* device of file pointed to by symlink */
 static ino_t	 fino;		/* inode of file pointed to by symlink */
@@ -443,6 +445,7 @@
 			continue;

 		default:	/* some file to print */
+                  	cp = NULL;
 			switch (i = print(line[0], line+1)) {
 			case ERROR:
 				if (bombed == OK)
@@ -452,8 +455,16 @@
 				(void) fclose(cfp);
 				return(REPRINT);
 			case FILTERERR:
+                          	if (! cp) cp = "FILTERERR";
 			case ACCESS:
+                          	if (! cp) cp = "ACCESS";
+                        case NOSTAT:
+                          	if (! cp) cp = "NOSTAT";
+                        case BADLINK:
+                          	if (! cp) cp = "BADLINK";
 				bombed = i;
+                                syslog(LOG_ERR, "%s: %s: %s error on line
\"%s\"",
+                                       printer, file, cp, line);
 				sendmail(logname, bombed);
 			}
 			title[0] = '\0';
@@ -535,7 +546,13 @@

 	/* Open the file as the user. */

-	if (lstat(file, &stb) < 0 || (fi = open(file, O_RDONLY)) < 0) {
+	if (lstat(file, &stb) < 0) {
+		seteuid(euid);
+		setegid(egid);
+		return(NOSTAT);
+       }
+
+        if ((fi = open(file, O_RDONLY)) < 0) {
 		seteuid(euid);
 		setegid(egid);
 		return(ACCESS);
@@ -552,7 +569,7 @@
 	 */
 	if ((stb.st_mode & S_IFMT) == S_IFLNK && fstat(fi, &stb) == 0 &&
 	    (stb.st_dev != fdev || stb.st_ino != fino))
-		return(ACCESS);
+		return(BADLINK);
 	if (!SF && !tof) {		/* start on a fresh page */
 		(void) write(ofd, FF, strlen(FF));
 		tof = 1;
@@ -990,7 +1007,8 @@
 				(void) fclose(cfp);
 				return(REPRINT);
 			case ACCESS:
-				sendmail(logname, ACCESS);
+                        case NOSTAT:
+				sendmail(logname, sendresult);
 			case ERROR:
 				err = ERROR;
 			}
@@ -1087,7 +1105,13 @@

 	/* Open the file as the user. */

-	if (lstat(file, &stb) < 0 || (f = open(file, O_RDONLY)) < 0) {
+	if (lstat(file, &stb) < 0) {
+		seteuid(euid);
+		setegid(egid);
+		return(NOSTAT);
+	}
+
+	if ((f = open(file, O_RDONLY)) < 0) {
 		seteuid(euid);
 		setegid(egid);
 		return(ACCESS);
@@ -1105,7 +1129,7 @@
 	 */
 	if ((stb.st_mode & S_IFMT) == S_IFLNK && fstat(f, &stb) == 0 &&
 	    (stb.st_dev != fdev || stb.st_ino != fino))
-		return(ACCESS);
+		return(BADLINK);
 	(void) snprintf(buf, sizeof(buf), "%c%d %s\n", type, stb.st_size, file);
 	amt = strlen(buf);
 	for (i = 0;  ; i++) {
@@ -1371,10 +1395,18 @@
 			(void) fclose(fp);
 			cp = "FILTERERR";
 			break;
-		case ACCESS:
+		case BADLINK:
 			printf("\nwas not printed because it was not linked to the original
file\n");
-			cp = "ACCESS";
+			cp = "BADLINK";
 			break;
+                case ACCESS:
+                	printf("\nwas not printed because the file could not be
accessed\n");
+                        cp = "ACCESS";
+                        break;
+                case NOSTAT:
+                	printf("\nwas not printed because the daemon could not
stat the file\n");
+                        cp = "NOSTAT";
+                        break;
 		case UNLINK:
 			printf("\nwas not unlinked: permission denied\n");
 			break;

Comment 1 Jonathan Kamens 2000-02-10 14:45:59 UTC
Created attachment 109 [details]
new patch for lpr-0.50

Comment 2 Bernhard Rosenkraenzer 2000-02-10 14:55:59 UTC
Thanks, in CVS.


Note You need to log in before you can comment on or make changes to this bug.