/** * Called for each printer found in /etc/printcap. */ static void handle_printer(struct printer *pp) { struct device_entry *dev_entry; struct printer_entry *printer_entry; char dev_only[128]; struct stat sb; if (pp->remote_host != NULL) { HRDBG("skipped %s -- remote", pp->printer); return; } if (strncmp(pp->lp, _PATH_DEV, strlen(_PATH_DEV)) != 0) { HRDBG("skipped %s [device %s] -- remote", pp->printer, pp->lp); return; } memset(dev_only, '\0', sizeof(dev_only)); snprintf(dev_only, sizeof(dev_only), "%s", pp->lp + strlen(_PATH_DEV)); HRDBG("printer %s has device %s", pp->printer, dev_only); if (stat(pp->lp, &sb) < 0) { if (errno == ENOENT) { HRDBG("skipped %s -- device %s missing", pp->printer, pp->lp); return; } } if ((dev_entry = device_find_by_name(dev_only)) == NULL) { HRDBG("%s not in hrDeviceTable", pp->lp); return; } HRDBG("%s found in hrDeviceTable", pp->lp); dev_entry->type = &OIDX_hrDevicePrinter_c; dev_entry->flags |= HR_DEVICE_IMMUTABLE; /* Then check hrPrinterTable for this device */ if ((printer_entry = printer_find_by_index(dev_entry->index)) == NULL && (printer_entry = printer_entry_create(dev_entry)) == NULL) return; printer_entry->flags |= HR_PRINTER_FOUND; printer_entry->status = get_printer_status(pp); memset(printer_entry->detectedErrorState, 0, sizeof(printer_entry->detectedErrorState)); }
static int lpq_command(int argc, char **argv) { char *printer; struct vlp_job *job_list = NULL; int i, num_jobs, job_count = 0; if (argc != 2) { printf("Usage: lpq <printername>\n"); return 1; } printer = argv[1]; /* Display printer status */ switch (get_printer_status(printer)) { case LPSTAT_OK: printf("enabled\n"); break; case LPSTAT_STOPPED: printf("disabled\n"); break; case LPSTAT_ERROR: default: printf("error\n"); break; } /* Print queued documents */ get_job_list(printer, &job_list, &num_jobs); for (i = 0; i < num_jobs; i++) { if (job_list[i].deleted) continue; printf("%d\t%d\t%d\t%ld\t%s\t%s\n", job_list[i].jobid, job_list[i].size, (i == 0 && job_list[i].status == LPQ_QUEUED) ? LPQ_SPOOLING : job_list[i].status, (long int)job_list[i].submit_time, job_list[i].owner, job_list[i].jobname); job_count++; } free(job_list); return 0; }
int status_to_viewer(struct bjst_rback *rback) { int error; char *buf; int reg = 0; lmsm_socket sm_data; int retry; int r_bytes; buf = (char *)malloc(MAX_STATBUF); if(buf == NULL) return 0; /* no RAM */ memset(buf, 0, MAX_STATBUF); r_bytes = 0; reg = 0; /* printer status get */ for(retry = 3; retry > 0; retry --){ error = get_printer_status(rback->dev_handle, buf, ®, &r_bytes); if(!error || error == EAGAIN) break; } switch(error){ case 0: /* read SUCCESS */ if(reg & PARPORT_NFAULT) sm_data.prn_data.stat.printer_fault = LM_PRN_NORMAL; else sm_data.prn_data.stat.printer_fault = LM_PRN_FAULT; break; case EAGAIN: /* no read data */ sm_data.prn_data.stat.printer_fault = LM_PRN_NORMAL; break; default: /* read error */ sm_data.prn_data.stat.printer_fault = LM_PRN_POWOFF; /* Power off */ #ifdef DEBUG write_log("Power off detect\n"); #endif break; } #ifdef DEBUG if(r_bytes != 0){ fprintf(log_path, "STATUS=%s\n", buf+2); fflush(log_path); } #endif { /* status return to stderr(used by CUPS system) */ output_dev odev; struct { char header[5]; bscc2sts_tbl sts; }info_sts; int lib_stat, __attribute__ ((unused)) result2; if(r_bytes != 0){ odev.status = 0; switch(device_type){ case DEVICE_TYPE_LP: odev.dev = 0; break; case DEVICE_TYPE_USB: odev.dev = 1; break; case DEVICE_TYPE_1394: odev.dev = 2; break; default: odev.dev = 0; break; } strncpy( &info_sts.header[0], "INFO:" ,strlen("INFO:")); /* Printer Status Convert */ lib_stat = bscc2sts(PACKAGE_PRINTER_MODEL, buf, &odev, &info_sts.sts); if(rback->rback_handle > 0 && lib_stat == OK ) result2 = write(rback->rback_handle, (void *)&info_sts, (size_t)sizeof(info_sts)); #ifdef DEBUG else { fprintf(log_path,"Status Convert Error rback_handle:%d lib_stat:%d\n",rback->rback_handle,lib_stat); fflush(log_path); } #endif } } rback->fault = sm_data.prn_data.stat.printer_fault; /* save fault status */ if(rback->st_buf != NULL) memcpy(rback->st_buf, buf, MAX_STATBUF); free(buf); return r_bytes; }