// createJobURI creates a uri string for the job-uri attribute, used to get the // state of a CUPS job. func createJobURI(jobID C.int) (*C.char, error) { length := C.size_t(urlMaxLength) uri := (*C.char)(C.malloc(length)) if uri == nil { return nil, errors.New("Failed to malloc; out of memory?") } resource := C.CString(fmt.Sprintf(jobURIFormat, uint32(jobID))) defer C.free(unsafe.Pointer(resource)) C.httpAssembleURI(C.HTTP_URI_CODING_ALL, uri, C.int(length), C.IPP, nil, C.cupsServer(), C.ippPort(), resource) return uri, nil }
func newCUPSCore(maxConnections uint, connectTimeout time.Duration) (*cupsCore, error) { host := C.cupsServer() port := C.ippPort() encryption := C.cupsEncryption() timeout := C.int(connectTimeout / time.Millisecond) var e string switch encryption { case C.HTTP_ENCRYPTION_ALWAYS: e = "encrypting ALWAYS" case C.HTTP_ENCRYPTION_IF_REQUESTED: e = "encrypting IF REQUESTED" case C.HTTP_ENCRYPTION_NEVER: e = "encrypting NEVER" case C.HTTP_ENCRYPTION_REQUIRED: e = "encryption REQUIRED" default: encryption = C.HTTP_ENCRYPTION_REQUIRED e = "encrypting REQUIRED" } var hostIsLocal bool if h := C.GoString(host); strings.HasPrefix(h, "/") || h == "localhost" { hostIsLocal = true } cs := lib.NewSemaphore(maxConnections) cp := make(chan *C.http_t) cc := &cupsCore{host, port, encryption, timeout, cs, cp, hostIsLocal} log.Infof("Connecting to CUPS server at %s:%d %s", C.GoString(host), int(port), e) // This connection isn't used, just checks that a connection is possible // before returning from the constructor. http, err := cc.connect() if err != nil { return nil, err } cc.disconnect(http) log.Info("Connected to CUPS server successfully") return cc, nil }