summaryrefslogtreecommitdiff
path: root/print/psutils/patches/patch-aa
blob: e794e1714a3392b71a876d84dd219ad249e14a1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
$NetBSD: patch-aa,v 1.1 1998/11/09 18:02:36 agc Exp $

Read default papersize from a configuration file at run-time.
If it's not in the correct format, or it's not found, default to
the papersize that was compiled in.

--- psutil.c	1998/10/30 16:48:18	1.1
+++ psutil.c	1998/11/09 16:18:30
@@ -19,6 +19,7 @@
 
 #include <string.h>
 #include <sys/types.h>
+#include <sys/param.h>
 #include <sys/stat.h>
 
 #define iscomment(x,y) (strncmp(x,y,strlen(y)) == 0)
@@ -64,12 +65,68 @@
    { NULL, 0, 0 }
 };
 
+/* bounds-checking strncpy */
+static char *
+strnncpy(char *to, size_t tosize, char *from, size_t cc)
+{
+	size_t	len;
+
+	if ((len = cc) >= tosize - 1) {
+		len = tosize - 1;
+	}
+	(void) strncpy(to, from, len);
+	to[len] = 0;
+	return to;
+}
+
+#if (defined(BSD) && BSD >= 199306)
+#include <ctype.h>
+
+/* read PAPERSIZE from file */
+static int
+readconfig(char *name, size_t namesize)
+{
+	FILE	*fp;
+	char	 buf[BUFSIZ];
+	char	*cp;
+	int	 found;
+
+	found = 0;
+	if ((fp = fopen("@prefix@/etc/psutils.cfg", "r")) != (FILE *) NULL) {
+		while (fgets(buf, sizeof(buf), fp) != (char *) NULL) {
+			buf[strlen(buf) - 1] = 0;
+			for (cp = buf ; *cp && *cp != '\n' && isspace(*cp) ; cp++) {
+			}
+			if (*cp == '#') {
+				continue;
+			}
+			if (strncmp(cp, "PAPERSIZE=", 10) == 0) {
+				for (cp += 10; *cp && isspace(*cp) ; cp++) {
+				}
+				if (*cp != 0) {
+					(void) strnncpy(name, namesize, cp, strlen(cp));
+					found = 1;
+					break;
+				}
+			}
+		}
+		(void) fclose(fp);
+	}
+	return found;
+}
+#endif
+
 /* return pointer to paper size struct or NULL */
 Paper* findpaper(char *name)
 {
    Paper *pp;
+   char	papersize[BUFSIZ];
+
+   if (!readconfig(papersize, sizeof(papersize))) {
+	(void) strnncpy(papersize, sizeof(papersize), name, strlen(name));
+   }
    for (pp = papersizes; PaperName(pp); pp++) {
-      if (strcmp(PaperName(pp), name) == 0) {
+      if (strcmp(PaperName(pp), papersize) == 0) {
 	 return pp;
       }
    }