📄 printers.c
字号:
for (i = 0; i < NumBanners; i ++) attr->values[i + 1].string.text = strdup(Banners[i].name); } }#endif DEBUG_printf(("Function CreateCommonData() \n")); }#if 0/* * 'DeleteAllPrinters()' - Delete all printers from the system. */voidDeleteAllPrinters(void){ printer_t *p, /* Pointer to current printer/class */ *next; /* Pointer to next printer in list */ for (p = Printers; p != NULL; p = next) { next = p->next; if (!(p->type & CUPS_PRINTER_CLASS)) DeletePrinter(p, 0); }}/* * 'DeletePrinter()' - Delete a printer from the system. */voidDeletePrinter(printer_t *p, /* I - Printer to delete */ int update) /* I - Update printers.conf? */{ int i; /* Looping var */ printer_t *current, /* Current printer in list */ *prev; /* Previous printer in list */#ifdef __sgi char filename[1024]; /* Interface script filename */#endif /* __sgi */ DEBUG_printf(("DeletePrinter(%08x): p->name = \"%s\"...\n", p, p->name)); /* * Range check input... */ if (p == NULL) return; /* * Find the printer in the list... */ for (prev = NULL, current = Printers; current != NULL; prev = current, current = current->next) if (p == current) break; if (current == NULL) { LogMessage(L_ERROR, "Tried to delete a non-existent printer %s!\n", p->name); return; } /* * Remove the printer from the list... */ if (prev == NULL) Printers = p->next; else prev->next = p->next; NumPrinters --; /* * Stop printing on this printer... */ StopPrinter(p, update); /* * If this printer is the next for browsing, point to the next one... */ if (p == BrowseNext) BrowseNext = p->next; /* * Remove the dummy interface/icon/option files under IRIX... */#ifdef __sgi snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name); unlink(filename); snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui", p->name); unlink(filename); snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name); unlink(filename); snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name); unlink(filename); snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name); unlink(filename); snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name); unlink(filename);#endif /* __sgi */ /* * If p is the default printer, assign the next one... */ if (p == DefaultPrinter) { DefaultPrinter = Printers; WritePrintcap(); } /* * Remove this printer from any classes... */ if (!(p->type & CUPS_PRINTER_IMPLICIT)) DeletePrinterFromClasses(p); /* * Free all memory used by the printer... */ if (p->printers != NULL) free(p->printers); if (MaxPrinterHistory) { for (i = 0; i < p->num_history; i ++) ippDelete(p->history[i]); free(p->history); } for (i = 0; i < p->num_reasons; i ++) free(p->reasons[i]); ippDelete(p->attrs); DeletePrinterFilters(p); FreePrinterUsers(p); FreeQuotas(p); ClearString(&p->uri); ClearString(&p->hostname); ClearString(&p->name); ClearString(&p->location); ClearString(&p->make_model); ClearString(&p->info); ClearString(&p->job_sheets[0]); ClearString(&p->job_sheets[1]); ClearString(&p->device_uri); free(p); /* * Write a new /etc/printcap file... */ WritePrintcap();}/* * 'DeletePrinterFilters()' - Delete all MIME filters for a printer. */voidDeletePrinterFilters(printer_t *p) /* I - Printer to remove from */{ int i; /* Looping var */ mime_filter_t *filter; /* MIME filter looping var */ /* * Range check input... */ if (p == NULL) return; /* * Remove all filters from the MIME database that have a destination * type == printer... */ for (filter = MimeDatabase->filters, i = MimeDatabase->num_filters; i > 0; i --, filter ++) if (filter->dst == p->filetype) { /* * Delete the current filter... */ MimeDatabase->num_filters --; if (i > 1) memmove(filter, filter + 1, sizeof(mime_filter_t) * (i - 1)); filter --; }}#endif/* * 'FindDest()' - Find a destination in the list. */printer_t * /* O - Destination in list */FindDest(const char *name) /* I - Name of printer or class to find */{ printer_t *p; /* Current destination */ int diff; /* Difference */ for (p = Printers; p != NULL; p = p->next) if ((diff = strcasecmp(name, p->name)) == 0)/* name == p->name */ return (p); else if (diff < 0) /* name < p->name */ return (NULL); return (NULL);}/* * 'FindPrinter()' - Find a printer in the list. */printer_t * /* O - Printer in list */FindPrinter(const char *name) /* I - Name of printer to find */{ printer_t *p; /* Current printer */ int diff; /* Difference */ for (p = Printers; p != NULL; p = p->next) if ((diff = strcasecmp(name, p->name)) == 0 )/* && !(p->type & CUPS_PRINTER_CLASS)) name == p->name */ return (p); else if (diff < 0) /* name < p->name */ return (NULL); return (NULL);}#if 0/* * 'FreePrinterUsers()' - Free allow/deny users. */voidFreePrinterUsers(printer_t *p) /* I - Printer */{ int i; /* Looping var */ if (!p || !p->num_users) return; for (i = 0; i < p->num_users; i ++) free((void *)p->users[i]); free(p->users); p->num_users = 0; p->users = NULL;}#endif/* * 'LoadAllPrinters()' - Load printers from the printers.conf file. */voidLoadAllPrinters(void){ cups_file_t *fp; /* printers.conf file */ int linenum; /* Current line number */ int len; /* Length of line */ char line[1024], /* Line from file */ name[256], /* Parameter name */ *nameptr, /* Pointer into name */ *value, /* Pointer to value */ *valueptr; /* Pointer into value */ printer_t *p; /* Current printer */ /* * Open the printers.conf file... */ snprintf(line, sizeof(line), "%s/printers.conf", ServerRoot); DEBUG_printf(("open(%s)\n",line)); if ((fp = cupsFileOpen(line, "r")) == NULL) { LogMessage(L_ERROR, "LoadAllPrinters: Unable to open %s - %s", line, strerror(errno)); return; } /* * Read printer configurations until we hit EOF... */ linenum = 0; p = NULL; while (cupsFileGets(fp, line, sizeof(line)) != NULL) { linenum ++; /* * Skip comment lines... */ if (line[0] == '#') continue; /* * Strip trailing whitespace, if any... */ len = strlen(line); while (len > 0 && isspace(line[len - 1] & 255)) { len --; line[len] = '\0'; } /* * Extract the name from the beginning of the line... */ for (value = line; isspace(*value & 255); value ++); for (nameptr = name; *value != '\0' && !isspace(*value & 255) && nameptr < (name + sizeof(name) - 1);) *nameptr++ = *value++; *nameptr = '\0'; while (isspace(*value & 255)) value ++; if (name[0] == '\0') continue; /* * Decode the directive... */ if (strcmp(name, "<Printer") == 0 || strcmp(name, "<DefaultPrinter") == 0) { /* * <Printer name> or <DefaultPrinter name> */ if (line[len - 1] == '>' && p == NULL) { /* * Add the printer and a base file type... */ line[len - 1] = '\0'; LogMessage(L_DEBUG, "LoadAllPrinters: Loading printer %s...", value); p = AddPrinter(value); p->accepting = 1; p->state = IPP_PRINTER_IDLE; /* * Set the default printer as needed... */ if (strcmp(name, "<DefaultPrinter") == 0) DefaultPrinter = p; } else { LogMessage(L_ERROR, "Syntax error on line %d of printers.conf.", linenum); return; } } else if (strcmp(name, "</Printer>") == 0) { if (p != NULL) { SetPrinterAttrs(p); AddPrinterHistory(p); p = NULL; } else { LogMessage(L_ERROR, "Syntax error on line %d of printers.conf.", linenum); return; } } else if (p == NULL) { LogMessage(L_ERROR, "Syntax error on line %d of printers.conf.", linenum); return; } else if (strcmp(name, "Info") == 0) SetString(&p->info, value); else if (strcmp(name, "Location") == 0) SetString(&p->location, value); else if (strcmp(name, "DeviceURI") == 0) SetString(&p->device_uri, value); else if (strcmp(name, "State") == 0) { /* * Set the initial queue state... */ if (strcasecmp(value, "idle") == 0) p->state = IPP_PRINTER_IDLE; else if (strcasecmp(value, "stopped") == 0) p->state = IPP_PRINTER_STOPPED; } else if (strcmp(name, "StateMessage") == 0) { /* * Set the initial queue state message... */ while (isspace(*value & 255)) value ++; strlcpy(p->state_message, value, sizeof(p->state_message)); } else if (strcmp(name, "Accepting") == 0) { /* * Set the initial accepting state... */ if (strcasecmp(value, "yes") == 0) p->accepting = 1; else p->accepting = 0; } else if (strcmp(name, "JobSheets") == 0) { /* * Set the initial job sheets... */ for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); if (*valueptr) *valueptr++ = '\0'; SetString(&p->job_sheets[0], value); while (isspace(*valueptr & 255)) valueptr ++; if (*valueptr) { for (value = valueptr; *valueptr && !isspace(*valueptr & 255); valueptr ++); if (*valueptr) *valueptr++ = '\0'; SetString(&p->job_sheets[1], value); } } else if (strcmp(name, "AllowUser") == 0) { p->deny_users = 0; AddPrinterUser(p, value); } else if (strcmp(name, "DenyUser") == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -