/src/samba/source3/printing/print_svid.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 1997-1998 by Norm Jacobs, Colorado Springs, Colorado, USA |
3 | | * Copyright (C) 1997-1998 by Sun Microsystem, Inc. |
4 | | * All Rights Reserved |
5 | | * |
6 | | * This program is free software; you can redistribute it and/or modify |
7 | | * it under the terms of the GNU General Public License as published by |
8 | | * the Free Software Foundation; either version 3 of the License, or |
9 | | * (at your option) any later version. |
10 | | * |
11 | | * This program is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | | * GNU General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU General Public License |
17 | | * along with this program; if not, see <http://www.gnu.org/licenses/>. |
18 | | */ |
19 | | |
20 | | /* |
21 | | * This module implements support for gathering and comparing available |
22 | | * printer information on a SVID or XPG4 compliant system. It does this |
23 | | * through the use of the SVID/XPG4 command "lpstat(1)". |
24 | | * |
25 | | * The expectations is that execution of the command "lpstat -v" will |
26 | | * generate responses in the form of: |
27 | | * |
28 | | * device for serial: /dev/term/b |
29 | | * system for fax: server |
30 | | * system for color: server (as printer chroma) |
31 | | */ |
32 | | |
33 | | |
34 | | #include "includes.h" |
35 | | #include "printing/pcap.h" |
36 | | #include "lib/util_file.h" |
37 | | |
38 | | #if defined(SYSV) || defined(HPUX) |
39 | | bool sysv_cache_reload(struct pcap_cache **_pcache) |
40 | | { |
41 | | char **lines; |
42 | | int i; |
43 | | struct pcap_cache *pcache = NULL; |
44 | | char **argl = NULL; |
45 | | |
46 | | #if defined(HPUX) |
47 | | DEBUG(5, ("reloading hpux printcap cache\n")); |
48 | | #else |
49 | | DEBUG(5, ("reloading sysv printcap cache\n")); |
50 | | #endif |
51 | | |
52 | | argl = str_list_make_empty(talloc_tos()); |
53 | | str_list_add_printf(&argl, "/usr/bin/lpstat"); |
54 | | str_list_add_printf(&argl, "-v"); |
55 | | if (argl == NULL) { |
56 | | return false; |
57 | | } |
58 | | |
59 | | lines = file_lines_ploadv(talloc_tos(), argl, NULL); |
60 | | if (lines == NULL) { |
61 | | #if defined(HPUX) |
62 | | |
63 | | /* |
64 | | * if "lpstat -v" is NULL then we check if schedular is running if it is |
65 | | * that means no printers are added on the HP-UX system, if schedular is not |
66 | | * running we display reload error. |
67 | | */ |
68 | | |
69 | | char **scheduler; |
70 | | |
71 | | argl[1] = talloc_strdup(argl, "-r"); |
72 | | if (argl[1] == NULL) { |
73 | | TALLOC_FREE(argl); |
74 | | return false; |
75 | | } |
76 | | scheduler = file_lines_ploadv(talloc_tos(), argl, NULL); |
77 | | TALLOC_FREE(argl); |
78 | | if(!strcmp(*scheduler,"scheduler is running")){ |
79 | | DEBUG(3,("No Printers found!!!\n")); |
80 | | TALLOC_FREE(scheduler); |
81 | | return True; |
82 | | } |
83 | | else{ |
84 | | DEBUG(3,("Scheduler is not running!!!\n")); |
85 | | TALLOC_FREE(scheduler); |
86 | | return False; |
87 | | } |
88 | | #else |
89 | | DEBUG(3,("No Printers found!!!\n")); |
90 | | return False; |
91 | | #endif |
92 | | } |
93 | | TALLOC_FREE(argl); |
94 | | |
95 | | for (i = 0; lines[i]; i++) { |
96 | | char *name, *tmp; |
97 | | char *buf = lines[i]; |
98 | | |
99 | | /* eat "system/device for " */ |
100 | | if (((tmp = strchr_m(buf, ' ')) == NULL) || |
101 | | ((tmp = strchr_m(++tmp, ' ')) == NULL)) |
102 | | continue; |
103 | | |
104 | | /* |
105 | | * In case we're only at the "for ". |
106 | | */ |
107 | | |
108 | | if(!strncmp("for ", ++tmp, 4)) { |
109 | | tmp=strchr_m(tmp, ' '); |
110 | | tmp++; |
111 | | } |
112 | | |
113 | | /* Eat whitespace. */ |
114 | | |
115 | | while(*tmp == ' ') |
116 | | ++tmp; |
117 | | |
118 | | /* |
119 | | * On HPUX there is an extra line that can be ignored. |
120 | | * d.thibadeau 2001/08/09 |
121 | | */ |
122 | | if(!strncmp("remote to", tmp, 9)) |
123 | | continue; |
124 | | |
125 | | name = tmp; |
126 | | |
127 | | /* truncate the ": ..." */ |
128 | | if ((tmp = strchr_m(name, ':')) != NULL) |
129 | | *tmp = '\0'; |
130 | | |
131 | | /* add it to the cache */ |
132 | | if (!pcap_cache_add_specific(&pcache, name, NULL, NULL)) { |
133 | | TALLOC_FREE(lines); |
134 | | pcap_cache_destroy_specific(&pcache); |
135 | | return false; |
136 | | } |
137 | | } |
138 | | |
139 | | TALLOC_FREE(lines); |
140 | | *_pcache = pcache; |
141 | | return true; |
142 | | } |
143 | | |
144 | | #else |
145 | | /* this keeps fussy compilers happy */ |
146 | | void print_svid_dummy(void); |
147 | 0 | void print_svid_dummy(void) {} |
148 | | #endif |