Line data Source code
1 : /*
2 : AIX-specific printcap loading
3 : Copyright (C) Jean-Pierre.Boulard@univ-rennes1.fr 1996
4 :
5 : This program is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU General Public License as published by
7 : the Free Software Foundation; either version 3 of the License, or
8 : (at your option) any later version.
9 :
10 : This program is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : GNU General Public License for more details.
14 :
15 : You should have received a copy of the GNU General Public License
16 : along with this program. If not, see <http://www.gnu.org/licenses/>.
17 : */
18 :
19 : /*
20 : * This module implements AIX-specific printcap loading. Most of the code
21 : * here was originally provided by Jean-Pierre.Boulard@univ-rennes1.fr in
22 : * the Samba 1.9.14 release, and was formerly contained in pcap.c. It has
23 : * been moved here and condensed as part of a larger effort to clean up and
24 : * simplify the printcap code. -- Rob Foehl, 2004/12/06
25 : */
26 :
27 : #include "includes.h"
28 : #include "system/filesys.h"
29 : #include "printing/pcap.h"
30 :
31 : #ifdef AIX
32 : bool aix_cache_reload(struct pcap_cache **_pcache)
33 : {
34 : int iEtat;
35 : FILE *pfile;
36 : char *line = NULL, *p;
37 : char *name = NULL;
38 : struct pcap_cache *pcache = NULL;
39 : TALLOC_CTX *ctx = talloc_init("aix_cache_reload");
40 :
41 : if (!ctx) {
42 : return false;
43 : }
44 :
45 : DEBUG(5, ("reloading aix printcap cache\n"));
46 :
47 : if ((pfile = fopen(lp_printcapname(), "r")) == NULL) {
48 : DEBUG(0,( "Unable to open qconfig file %s for read!\n", lp_printcapname()));
49 : TALLOC_FREE(ctx);
50 : return false;
51 : }
52 :
53 : iEtat = 0;
54 : /* scan qconfig file for searching <printername>: */
55 : while (line = fgets_slash(ctx, NULL, 1024, pfile)) {
56 : bool ok;
57 :
58 : if (*line == '*' || *line == 0) {
59 : TALLOC_FREE(line);
60 : continue;
61 : }
62 :
63 : switch (iEtat) {
64 : case 0: /* locate an entry */
65 : if (*line == '\t' || *line == ' ') {
66 : TALLOC_FREE(line);
67 : continue;
68 : }
69 :
70 : if ((p = strchr_m(line, ':'))) {
71 : char *saveptr;
72 : *p = '\0';
73 : p = strtok_r(line, ":", &saveptr);
74 : if (strcmp(p, "bsh") != 0) {
75 : name = talloc_strdup(ctx, p);
76 : if (!name) {
77 : pcap_cache_destroy_specific(&pcache);
78 : TALLOC_FREE(line);
79 : fclose(pfile);
80 : TALLOC_FREE(ctx);
81 : return false;
82 : }
83 : iEtat = 1;
84 : continue;
85 : }
86 : }
87 : break;
88 :
89 : case 1: /* scanning device stanza */
90 : if (*line == '*' || *line == 0)
91 : continue;
92 :
93 : if (*line != '\t' && *line != ' ') {
94 : /* name is found without stanza device */
95 : /* probably a good printer ??? */
96 : iEtat = 0;
97 : ok = pcap_cache_add_specific(&pcache,
98 : name, NULL, NULL);
99 : if (!ok) {
100 : pcap_cache_destroy_specific(&pcache);
101 : TALLOC_FREE(line);
102 : fclose(pfile);
103 : TALLOC_FREE(ctx);
104 : return false;
105 : }
106 : continue;
107 : }
108 :
109 : if (strstr_m(line, "backend")) {
110 : /* it's a device, not a virtual printer */
111 : iEtat = 0;
112 : } else if (strstr_m(line, "device")) {
113 : /* it's a good virtual printer */
114 : iEtat = 0;
115 : ok = pcap_cache_add_specific(&pcache,
116 : name, NULL, NULL);
117 : if (!ok) {
118 : pcap_cache_destroy_specific(&pcache);
119 : SAFE_FREE(line);
120 : fclose(pfile);
121 : TALLOC_FREE(ctx);
122 : return false;
123 : }
124 : continue;
125 : }
126 : break;
127 : }
128 : }
129 :
130 : *_pcache = pcache;
131 : fclose(pfile);
132 : TALLOC_FREE(ctx);
133 : return true;
134 : }
135 :
136 : #else
137 : /* this keeps fussy compilers happy */
138 : void print_aix_dummy(void);
139 0 : void print_aix_dummy(void) {}
140 : #endif /* AIX */
|