Coverage Report

Created: 2026-09-03 07:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/source3/printing/print_aix.c
Line
Count
Source
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 */