152153Sbp/* 252153Sbp * Copyright (c) 1999, Boris Popov 352153Sbp * All rights reserved. 452153Sbp * 552153Sbp * Redistribution and use in source and binary forms, with or without 652153Sbp * modification, are permitted provided that the following conditions 752153Sbp * are met: 852153Sbp * 1. Redistributions of source code must retain the above copyright 952153Sbp * notice, this list of conditions and the following disclaimer. 1052153Sbp * 2. Redistributions in binary form must reproduce the above copyright 1152153Sbp * notice, this list of conditions and the following disclaimer in the 1252153Sbp * documentation and/or other materials provided with the distribution. 13165920Simp * 3. Neither the name of the author nor the names of any co-contributors 1452153Sbp * may be used to endorse or promote products derived from this software 1552153Sbp * without specific prior written permission. 1652153Sbp * 1752153Sbp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1852153Sbp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1952153Sbp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2052153Sbp * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2152153Sbp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2252153Sbp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2352153Sbp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2452153Sbp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2552153Sbp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2652153Sbp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2752153Sbp * SUCH DAMAGE. 2852153Sbp * 2952153Sbp * NetWare queue interface 3052153Sbp */ 3184213Sdillon 3284213Sdillon#include <sys/cdefs.h> 3384213Sdillon__FBSDID("$FreeBSD$"); 3484213Sdillon 3552153Sbp#include <sys/types.h> 3652153Sbp#include <errno.h> 3752153Sbp#include <stdio.h> 38162486Skan#include <string.h> 3952153Sbp#include <netncp/ncp_lib.h> 4052153Sbp 4152153Sbpint 4252704Sbpncp_create_queue_job_and_file(NWCONN_HANDLE connid, u_int32_t queue_id, 4352704Sbp struct queue_job *job) 4452153Sbp{ 4552153Sbp int error; 4652153Sbp DECLARE_RQ; 4752153Sbp 4852153Sbp ncp_init_request_s(conn, 121); 4952153Sbp ncp_add_dword_hl(conn, queue_id); 5052153Sbp ncp_add_mem(conn, &(job->j), sizeof(job->j)); 5152153Sbp 5252153Sbp if ((error = ncp_request(connid, 23, conn)) != 0) 5352153Sbp return error; 5452153Sbp memcpy(&(job->j), ncp_reply_data(conn, 0), 78); 5552153Sbp ConvertToNWfromDWORD(job->j.JobFileHandle, &job->file_handle); 5652153Sbp return 0; 5752153Sbp} 5852153Sbp 5952153Sbpint 6052704Sbpncp_close_file_and_start_job(NWCONN_HANDLE connid, u_int32_t queue_id, 6152704Sbp struct queue_job *job) 6252153Sbp{ 6352153Sbp int error; 6452153Sbp DECLARE_RQ; 6552153Sbp 6652153Sbp ncp_init_request_s(conn, 127); 6752153Sbp ncp_add_dword_hl(conn, queue_id); 6852153Sbp ncp_add_dword_lh(conn, job->j.JobNumber); 6952153Sbp error = ncp_request(connid, 23, conn); 7052153Sbp return error; 7152153Sbp} 7252153Sbp 7352153Sbpint 7452704Sbpncp_attach_to_queue(NWCONN_HANDLE connid, u_int32_t queue_id) { 7552153Sbp int error; 7652153Sbp DECLARE_RQ; 7752153Sbp 7852153Sbp ncp_init_request_s(conn, 111); 7952153Sbp ncp_add_dword_hl(conn, queue_id); 8052153Sbp error = ncp_request(connid, 23, conn); 8152153Sbp return error; 8252153Sbp} 8352153Sbp 8452153Sbpint 8552704Sbpncp_detach_from_queue(NWCONN_HANDLE connid, u_int32_t queue_id) { 8652153Sbp int error; 8752153Sbp DECLARE_RQ; 8852153Sbp 8952153Sbp ncp_init_request_s(conn, 112); 9052153Sbp ncp_add_dword_hl(conn, queue_id); 9152153Sbp error= ncp_request(connid, 23, conn); 9252153Sbp return error; 9352153Sbp} 9452153Sbp 9552153Sbpint 9652704Sbpncp_service_queue_job(NWCONN_HANDLE connid, u_int32_t queue_id, 9752704Sbp u_int16_t job_type, struct queue_job *job) 9852704Sbp{ 9952153Sbp int error; 10052153Sbp DECLARE_RQ; 10152153Sbp 10252153Sbp ncp_init_request_s(conn, 124); 10352153Sbp ncp_add_dword_hl(conn, queue_id); 10452153Sbp ncp_add_word_hl(conn, job_type); 10552153Sbp if ((error = ncp_request(connid, 23, conn)) != 0) { 10652153Sbp return error; 10752153Sbp } 10852153Sbp memcpy(&(job->j), ncp_reply_data(conn, 0), 78); 10952153Sbp ConvertToNWfromDWORD(job->j.JobFileHandle, &job->file_handle); 11052153Sbp return error; 11152153Sbp} 11252153Sbp 11352153Sbpint 11452704Sbpncp_finish_servicing_job(NWCONN_HANDLE connid, u_int32_t queue_id, 11552704Sbp u_int32_t job_number, u_int32_t charge_info) 11652704Sbp{ 11752153Sbp int error; 11852153Sbp DECLARE_RQ; 11952153Sbp 12052153Sbp ncp_init_request_s(conn, 131); 12152153Sbp ncp_add_dword_hl(conn, queue_id); 12252153Sbp ncp_add_dword_lh(conn, job_number); 12352153Sbp ncp_add_dword_hl(conn, charge_info); 12452153Sbp 12552153Sbp error = ncp_request(connid, 23, conn); 12652153Sbp return error; 12752153Sbp} 12852153Sbp 12952153Sbpint 13052704Sbpncp_abort_servicing_job(NWCONN_HANDLE connid, u_int32_t queue_id, 13152704Sbp u_int32_t job_number) 13252704Sbp{ 13352153Sbp int error; 13452153Sbp DECLARE_RQ; 13552153Sbp 13652153Sbp ncp_init_request_s(conn, 132); 13752153Sbp ncp_add_dword_hl(conn, queue_id); 13852153Sbp ncp_add_dword_lh(conn, job_number); 13952153Sbp error = ncp_request(connid, 23, conn); 14052153Sbp return error; 14152153Sbp} 14252153Sbp 14352153Sbpint 14452704Sbpncp_get_queue_length(NWCONN_HANDLE connid, u_int32_t queue_id, 14552704Sbp u_int32_t *queue_length) 14652704Sbp{ 14752153Sbp int error; 14852153Sbp DECLARE_RQ; 14952153Sbp 15052153Sbp ncp_init_request_s(conn, 125); 15152153Sbp ncp_add_dword_hl(conn, queue_id); 15252153Sbp 15352153Sbp if ((error = ncp_request(connid, 23, conn)) != 0) 15452153Sbp return error; 15552153Sbp if (conn->rpsize < 12) { 15652153Sbp ncp_printf("ncp_reply_size %d < 12\n", conn->rpsize); 15752153Sbp return EINVAL; 15852153Sbp } 15952153Sbp if (ncp_reply_dword_hl(conn,0) != queue_id) { 16052153Sbp printf("Ouch! Server didn't reply with same queue id in ncp_get_queue_length!\n"); 16152153Sbp return EINVAL; 16252153Sbp } 16352153Sbp *queue_length = ncp_reply_dword_lh(conn,8); 16452153Sbp return error; 16552153Sbp} 16652153Sbp 16752153Sbpint 16852704Sbpncp_get_queue_job_ids(NWCONN_HANDLE connid, u_int32_t queue_id, 16952704Sbp u_int32_t queue_section, u_int32_t *length1, u_int32_t *length2, 17052704Sbp u_int32_t ids[]) 17152153Sbp{ 17252153Sbp int error; 17352153Sbp DECLARE_RQ; 17452153Sbp 17552153Sbp ncp_init_request_s(conn,129); 17652153Sbp ncp_add_dword_hl(conn, queue_id); 17752153Sbp ncp_add_dword_lh(conn, queue_section); 17852153Sbp 17952153Sbp if ((error = ncp_request(connid, 23, conn)) != 0) 18052153Sbp return error; 18152153Sbp if (conn->rpsize < 8) { 18252153Sbp ncp_printf("ncp_reply_size %d < 8\n", conn->rpsize); 18352153Sbp return EINVAL; 18452153Sbp } 18552153Sbp *length2 = ncp_reply_dword_lh(conn,4); 18652153Sbp if (conn->rpsize < 8 + 4*(*length2)) { 18752153Sbp ncp_printf("ncp_reply_size %d < %d\n", conn->rpsize, 8+4*(*length2)); 18852153Sbp return EINVAL; 18952153Sbp } 19052153Sbp if (ids) { 19152153Sbp int count = min(*length1, *length2)*sizeof(u_int32_t); 19252153Sbp int pos; 19352153Sbp 19452153Sbp for (pos=0; pos<count; pos+=sizeof(u_int32_t)) { 19552153Sbp *ids++ = ncp_reply_dword_lh(conn, 8+pos); 19652153Sbp } 19752153Sbp } 19852153Sbp *length1 = ncp_reply_dword_lh(conn,0); 19952153Sbp return error; 20052153Sbp} 20152153Sbp 20252153Sbpint 20352704Sbpncp_get_queue_job_info(NWCONN_HANDLE connid, u_int32_t queue_id, 20452704Sbp u_int32_t job_id, struct nw_queue_job_entry *jobdata) 20552704Sbp{ 20652153Sbp int error; 20752153Sbp DECLARE_RQ; 20852153Sbp 20952153Sbp ncp_init_request_s(conn,122); 21052153Sbp ncp_add_dword_hl(conn, queue_id); 21152153Sbp ncp_add_dword_lh(conn, job_id); 21252153Sbp 21352153Sbp if ((error = ncp_request(connid, 23, conn)) != 0) 21452153Sbp return error; 21552153Sbp 21652153Sbp if (conn->rpsize < sizeof(struct nw_queue_job_entry)) { 21752153Sbp ncp_printf("ncp_reply_size %d < %d\n", conn->rpsize,sizeof(struct nw_queue_job_entry)); 21852153Sbp return EINVAL; 21952153Sbp } 22052153Sbp memcpy(jobdata,ncp_reply_data(conn,0), sizeof(struct nw_queue_job_entry)); 22152153Sbp return error; 22252153Sbp} 223