# File printer spooler, for use with spool implement Spooler; include "sys.m"; sys: Sys; Dir, pctl, NEWPGRP, DMDIR, open, OREAD, FD, OWRITE, ORCLOSE, FORKFD, ORDWR, FORKNS, NEWFD, MREPL, MBEFORE, MAFTER, MCREATE, pipe, mount, tokenize, fprint, sprint, create, pwrite, read, QTDIR, QTFILE, fildes, Qid: import sys; include "error.m"; err: Error; checkload, stderr, panic, kill, error: import err; include "string.m"; str: String; splitstrr: import str; include "os.m"; os: Os; include "spooler.m"; printer := "default"; init(args: list of string) { sys = load Sys Sys->PATH; err = load Error Error->PATH; err->init(); os = checkload(load Os Os->PATH, Os->PATH); str = checkload(load String String->PATH, String->PATH); os->init(); if (len args == 1) printer = hd args; } status(): string { (out, e) := os->run("lpq"); if (e != nil) return e; (nlines, lines) := tokenize(out, "\n"); if (nlines < 1) return "eof"; sts := hd lines; lines = tl lines; (nil, sts) = splitstrr(sts, " is "); if (lines == nil || hd lines == "no entries") return sts + "\n" + "0 jobs\n"; else return sts + "\n" + string (len lines -1) + " jobs\n"; } Sfile.start(path: string, endc: chan of string): (ref Sfile, string) { #run "lp" get job id and store in sfile. cmd := "lp " + os->filename(path); (out, e) := os->run(cmd); sval: string; if (out != nil){ # "request id is xxxxx-nb " (nwords, words) := tokenize(out, " "); if (nwords >=4) sval = hd tl tl tl words; } # BUG: must watch that the job did finish, and send # any diagnostic and termination through endc. # This requires fixing a BUG in spool.b if (endc != nil) endc <-= nil; return (ref Sfile(nil, sval), e); } Sfile.stop(f: self ref Sfile) { if (f.sval != nil){ cmd := "lprm " + f.sval; os->run(cmd); } } Sfile.status(nil: self ref Sfile): string { # BUG request job status return "started"; }