예제 #1
0
/**
 * 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));
}
예제 #2
0
파일: vlp.c 프로젝트: 0x24bin/winexe-1
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;
}
예제 #3
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, &reg, &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;
}