1/*
2 * "$Id: banners.c 11093 2013-07-03 20:48:42Z msweet $"
3 *
4 *   Banner routines for the CUPS scheduler.
5 *
6 *   Copyright 2007-2011 by Apple Inc.
7 *   Copyright 1997-2006 by Easy Software Products.
8 *
9 *   These coded instructions, statements, and computer programs are the
10 *   property of Apple Inc. and are protected by Federal copyright
11 *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
12 *   which should have been included with this file.  If this file is
13 *   file is missing or damaged, see the license at "http://www.cups.org/".
14 *
15 * Contents:
16 *
17 *   cupsdFindBanner()  - Find a named banner.
18 *   cupsdLoadBanners() - Load all available banner files...
19 *   add_banner()       - Add a banner to the array.
20 *   compare_banners()  - Compare two banners.
21 *   free_banners()     - Free all banners.
22 */
23
24/*
25 * Include necessary headers...
26 */
27
28#include "cupsd.h"
29#include <cups/dir.h>
30
31
32/*
33 * Local functions...
34 */
35
36static void	add_banner(const char *name, const char *filename);
37static int	compare_banners(const cupsd_banner_t *b0,
38		                const cupsd_banner_t *b1);
39static void	free_banners(void);
40
41
42/*
43 * 'cupsdFindBanner()' - Find a named banner.
44 */
45
46cupsd_banner_t *			/* O - Pointer to banner or NULL */
47cupsdFindBanner(const char *name)	/* I - Name of banner */
48{
49  cupsd_banner_t	key;		/* Search key */
50
51
52  key.name = (char *)name;
53
54  return ((cupsd_banner_t *)cupsArrayFind(Banners, &key));
55}
56
57
58/*
59 * 'cupsdLoadBanners()' - Load all available banner files...
60 */
61
62void
63cupsdLoadBanners(const char *d)		/* I - Directory to search */
64{
65  cups_dir_t	*dir;			/* Directory pointer */
66  cups_dentry_t	*dent;			/* Directory entry */
67  char		filename[1024],		/* Name of banner */
68		*ext;			/* Pointer to extension */
69
70
71 /*
72  * Free old banner info...
73  */
74
75  free_banners();
76
77 /*
78  * Try opening the banner directory...
79  */
80
81  if ((dir = cupsDirOpen(d)) == NULL)
82  {
83    cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdLoadBanners: Unable to open banner directory \"%s\": %s",
84               d, strerror(errno));
85    return;
86  }
87
88 /*
89  * Read entries, skipping directories and backup files.
90  */
91
92  Banners = cupsArrayNew((cups_array_func_t)compare_banners, NULL);
93
94  while ((dent = cupsDirRead(dir)) != NULL)
95  {
96   /*
97    * Check the file to make sure it isn't a directory or a backup
98    * file of some sort...
99    */
100
101    snprintf(filename, sizeof(filename), "%s/%s", d, dent->filename);
102
103    if (S_ISDIR(dent->fileinfo.st_mode))
104      continue;
105
106    if (dent->filename[0] == '~' ||
107        dent->filename[strlen(dent->filename) - 1] == '~')
108      continue;
109
110    if ((ext = strrchr(dent->filename, '.')) != NULL)
111      if (!strcmp(ext, ".bck") ||
112          !strcmp(ext, ".bak") ||
113	  !strcmp(ext, ".sav"))
114	continue;
115
116   /*
117    * Must be a valid file; add it!
118    */
119
120    add_banner(dent->filename, filename);
121  }
122
123 /*
124  * Close the directory...
125  */
126
127  cupsDirClose(dir);
128}
129
130
131/*
132 * 'add_banner()' - Add a banner to the array.
133 */
134
135static void
136add_banner(const char *name,		/* I - Name of banner */
137           const char *filename)	/* I - Filename for banner */
138{
139  mime_type_t		*filetype;	/* Filetype */
140  cupsd_banner_t	*temp;		/* New banner data */
141
142
143 /*
144  * See what the filetype is...
145  */
146
147  if ((filetype = mimeFileType(MimeDatabase, filename, NULL, NULL)) == NULL)
148  {
149    cupsdLogMessage(CUPSD_LOG_WARN,
150                    "add_banner: Banner \"%s\" (\"%s\") is of an unknown file "
151		    "type - skipping!", name, filename);
152    return;
153  }
154
155 /*
156  * Allocate memory...
157  */
158
159  if ((temp = calloc(1, sizeof(cupsd_banner_t))) == NULL)
160  {
161    cupsdLogMessage(CUPSD_LOG_WARN,
162                    "add_banner: Unable to allocate memory for banner \"%s\" - "
163		    "skipping!", name);
164    return;
165  }
166
167 /*
168  * Copy the new banner data over...
169  */
170
171  if ((temp->name = strdup(name)) == NULL)
172  {
173    cupsdLogMessage(CUPSD_LOG_WARN,
174                    "add_banner: Unable to allocate memory for banner \"%s\" - "
175		    "skipping!", name);
176    free(temp);
177    return;
178  }
179
180  temp->filetype = filetype;
181
182  cupsArrayAdd(Banners, temp);
183}
184
185
186/*
187 * 'compare_banners()' - Compare two banners.
188 */
189
190static int				/* O - -1 if name0 < name1, etc. */
191compare_banners(
192    const cupsd_banner_t *b0,		/* I - First banner */
193    const cupsd_banner_t *b1)		/* I - Second banner */
194{
195  return (_cups_strcasecmp(b0->name, b1->name));
196}
197
198
199/*
200 * 'free_banners()' - Free all banners.
201 */
202
203static void
204free_banners(void)
205{
206  cupsd_banner_t	*temp;		/* Current banner */
207
208
209  for (temp = (cupsd_banner_t *)cupsArrayFirst(Banners);
210       temp;
211       temp = (cupsd_banner_t *)cupsArrayNext(Banners))
212  {
213    free(temp->name);
214    free(temp);
215  }
216
217  cupsArrayDelete(Banners);
218  Banners = NULL;
219}
220
221
222/*
223 * End of "$Id: banners.c 11093 2013-07-03 20:48:42Z msweet $".
224 */
225