if ((filename = get_file(con, &filestats, buf, sizeof(buf))) != NULL)
{
+ _cupsRWLockRead(&MimeDatabase->lock);
+
type = mimeFileType(MimeDatabase, filename, NULL, NULL);
+ _cupsRWUnlock(&MimeDatabase->lock);
+
cupsdLogClient(con, CUPSD_LOG_DEBUG, "filename=\"%s\", type=%s/%s", filename, type ? type->super : "", type ? type->type : "");
if (is_cgi(con, filename, &filestats, type))
MimeDatabase = mimeNew();
mimeSetErrorCallback(MimeDatabase, mime_error_cb, NULL);
+ _cupsRWInit(&MimeDatabase->lock);
+ _cupsRWLockWrite(&MimeDatabase->lock);
MimeDatabase = mimeLoadTypes(MimeDatabase, mimedir);
MimeDatabase = mimeLoadTypes(MimeDatabase, ServerRoot);
MimeDatabase = mimeLoadFilters(MimeDatabase, mimedir, temp);
MimeDatabase = mimeLoadFilters(MimeDatabase, ServerRoot, temp);
+ _cupsRWUnlock(&MimeDatabase->lock);
if (!MimeDatabase)
{
strlcpy(type, "octet-stream", sizeof(type));
}
+ _cupsRWLockRead(&MimeDatabase->lock);
+
if (!strcmp(super, "application") && !strcmp(type, "octet-stream"))
{
/*
else
filetype = mimeType(MimeDatabase, super, type);
+ _cupsRWUnlock(&MimeDatabase->lock);
+
if (filetype &&
(!format ||
(!strcmp(super, "application") && !strcmp(type, "octet-stream"))))
strlcpy(type, "octet-stream", sizeof(type));
}
+ _cupsRWLockRead(&MimeDatabase->lock);
+
if (!strcmp(super, "application") && !strcmp(type, "octet-stream"))
{
/*
else
filetype = mimeType(MimeDatabase, super, type);
+ _cupsRWUnlock(&MimeDatabase->lock);
+
if (filetype)
{
/*
return;
}
+ _cupsRWLockRead(&MimeDatabase->lock);
+
if ((strcmp(super, "application") || strcmp(type, "octet-stream")) &&
!mimeType(MimeDatabase, super, type))
{
format->values[0].string.text);
ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE,
"document-format", NULL, format->values[0].string.text);
+
+ _cupsRWUnlock(&MimeDatabase->lock);
+
return;
}
+
+ _cupsRWUnlock(&MimeDatabase->lock);
}
/*
if (stat(filename, &fileinfo))
fileinfo.st_size = 0;
+ _cupsRWLockWrite(&MimeDatabase->lock);
+
if (job->retry_as_raster)
{
/*
abort_state = IPP_JOB_ABORTED;
ippSetString(job->attrs, &job->reasons, 0, "document-unprintable-error");
+
+ _cupsRWUnlock(&MimeDatabase->lock);
+
goto abort_job;
}
cupsArrayDelete(filters);
filters = prefilters;
}
+
+ _cupsRWUnlock(&MimeDatabase->lock);
}
/*
* Find all the d##### files...
*/
+ _cupsRWLockRead(&MimeDatabase->lock);
+
for (fileid = 1; fileid < 10000; fileid ++)
{
snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
job->filetypes[fileid - 1] = mimeType(MimeDatabase, "application",
"vnd.cups-raw");
}
+
+ _cupsRWUnlock(&MimeDatabase->lock);
}
/*
number --;
+ _cupsRWLockRead(&MimeDatabase->lock);
+
job->compressions[number] = compression;
job->filetypes[number] = mimeType(MimeDatabase, super, type);
job->filetypes[number] = mimeType(MimeDatabase, "application",
"vnd.cups-raw");
}
+
+ _cupsRWUnlock(&MimeDatabase->lock);
}
else
cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d of %s.", line, linenum, filename);
# include <cups/array.h>
# include <cups/ipp.h>
# include <cups/file.h>
+# include <cups/thread-private.h>
# include <regex.h>
cups_array_t *srcs; /* Filters sorted by source type */
mime_error_cb_t error_cb; /* Error message callback */
void *error_ctx; /* Pointer for callback */
+ _cups_rwlock_t lock; /* Read/write lock for guarding data for background updates */
} mime_t;
p->state_time = time(NULL);
p->accepting = 0;
p->shared = DefaultShared;
+
+ _cupsRWLockWrite(&MimeDatabase->lock);
+
p->filetype = mimeAddType(MimeDatabase, "printer", name);
+ _cupsRWUnlock(&MimeDatabase->lock);
+
cupsdSetString(&p->job_sheets[0], "none");
cupsdSetString(&p->job_sheets[1], "none");
if (p->printers != NULL)
free(p->printers);
+ _cupsRWLockWrite(&MimeDatabase->lock);
+
delete_printer_filters(p);
for (i = 0; i < p->num_reasons; i ++)
mimeDeleteType(MimeDatabase, p->filetype);
mimeDeleteType(MimeDatabase, p->prefiltertype);
+ _cupsRWUnlock(&MimeDatabase->lock);
+
cupsdFreeStrings(&(p->users));
cupsdFreeQuotas(p);
* Rename the printer type...
*/
+ _cupsRWLockWrite(&MimeDatabase->lock);
+
mimeDeleteType(MimeDatabase, p->filetype);
p->filetype = mimeAddType(MimeDatabase, "printer", name);
p->prefiltertype = mimeAddType(MimeDatabase, "prefilter", name);
}
+ _cupsRWUnlock(&MimeDatabase->lock);
+
/*
* Rename the printer...
*/
cupsdCreateCommonData();
_cupsRWLockWrite(&p->lock);
+ _cupsRWLockWrite(&MimeDatabase->lock);
/*
* Clear out old filters, if any...
add_printer_formats(p);
+ _cupsRWUnlock(&MimeDatabase->lock);
+
/*
* Add name-default attributes...
*/