diff options
Diffstat (limited to 'lib/libncp/ncpl_queue.c')
-rw-r--r-- | lib/libncp/ncpl_queue.c | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/lib/libncp/ncpl_queue.c b/lib/libncp/ncpl_queue.c new file mode 100644 index 0000000..beb34c7 --- /dev/null +++ b/lib/libncp/ncpl_queue.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 1999, Boris Popov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Boris Popov. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + * + * NetWare queue interface + * + */ +#include <sys/types.h> +#include <errno.h> +#include <stdio.h> +#include <netncp/ncp_lib.h> + +int +ncp_create_queue_job_and_file(int connid, u_int32_t queue_id, + struct queue_job *job) +{ + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 121); + ncp_add_dword_hl(conn, queue_id); + ncp_add_mem(conn, &(job->j), sizeof(job->j)); + + if ((error = ncp_request(connid, 23, conn)) != 0) + return error; + memcpy(&(job->j), ncp_reply_data(conn, 0), 78); + ConvertToNWfromDWORD(job->j.JobFileHandle, &job->file_handle); + return 0; +} + +int +ncp_close_file_and_start_job(int connid, u_int32_t queue_id, struct queue_job *job) +{ + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 127); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job->j.JobNumber); + error = ncp_request(connid, 23, conn); + return error; +} + +int +ncp_attach_to_queue(int connid, u_int32_t queue_id) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 111); + ncp_add_dword_hl(conn, queue_id); + error = ncp_request(connid, 23, conn); + return error; +} + +int +ncp_detach_from_queue(int connid, u_int32_t queue_id) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 112); + ncp_add_dword_hl(conn, queue_id); + error= ncp_request(connid, 23, conn); + return error; +} + +int +ncp_service_queue_job(int connid, u_int32_t queue_id, u_int16_t job_type, + struct queue_job *job) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 124); + ncp_add_dword_hl(conn, queue_id); + ncp_add_word_hl(conn, job_type); + if ((error = ncp_request(connid, 23, conn)) != 0) { + return error; + } + memcpy(&(job->j), ncp_reply_data(conn, 0), 78); + ConvertToNWfromDWORD(job->j.JobFileHandle, &job->file_handle); + return error; +} + +int +ncp_finish_servicing_job(int connid, u_int32_t queue_id, u_int32_t job_number, + u_int32_t charge_info) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 131); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job_number); + ncp_add_dword_hl(conn, charge_info); + + error = ncp_request(connid, 23, conn); + return error; +} + +int +ncp_abort_servicing_job(int connid, u_int32_t queue_id, u_int32_t job_number) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 132); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job_number); + error = ncp_request(connid, 23, conn); + return error; +} + +int +ncp_get_queue_length(int connid, u_int32_t queue_id, u_int32_t *queue_length) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn, 125); + ncp_add_dword_hl(conn, queue_id); + + if ((error = ncp_request(connid, 23, conn)) != 0) + return error; + if (conn->rpsize < 12) { + ncp_printf("ncp_reply_size %d < 12\n", conn->rpsize); + return EINVAL; + } + if (ncp_reply_dword_hl(conn,0) != queue_id) { + printf("Ouch! Server didn't reply with same queue id in ncp_get_queue_length!\n"); + return EINVAL; + } + *queue_length = ncp_reply_dword_lh(conn,8); + return error; +} + +int +ncp_get_queue_job_ids(int connid, u_int32_t queue_id, u_int32_t queue_section, + u_int32_t *length1, u_int32_t *length2, u_int32_t ids[]) +{ + int error; + DECLARE_RQ; + + ncp_init_request_s(conn,129); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, queue_section); + + if ((error = ncp_request(connid, 23, conn)) != 0) + return error; + if (conn->rpsize < 8) { + ncp_printf("ncp_reply_size %d < 8\n", conn->rpsize); + return EINVAL; + } + *length2 = ncp_reply_dword_lh(conn,4); + if (conn->rpsize < 8 + 4*(*length2)) { + ncp_printf("ncp_reply_size %d < %d\n", conn->rpsize, 8+4*(*length2)); + return EINVAL; + } + if (ids) { + int count = min(*length1, *length2)*sizeof(u_int32_t); + int pos; + + for (pos=0; pos<count; pos+=sizeof(u_int32_t)) { + *ids++ = ncp_reply_dword_lh(conn, 8+pos); + } + } + *length1 = ncp_reply_dword_lh(conn,0); + return error; +} + +int +ncp_get_queue_job_info(int connid, u_int32_t queue_id, u_int32_t job_id, + struct nw_queue_job_entry *jobdata) { + int error; + DECLARE_RQ; + + ncp_init_request_s(conn,122); + ncp_add_dword_hl(conn, queue_id); + ncp_add_dword_lh(conn, job_id); + + if ((error = ncp_request(connid, 23, conn)) != 0) + return error; + + if (conn->rpsize < sizeof(struct nw_queue_job_entry)) { + ncp_printf("ncp_reply_size %d < %d\n", conn->rpsize,sizeof(struct nw_queue_job_entry)); + return EINVAL; + } + memcpy(jobdata,ncp_reply_data(conn,0), sizeof(struct nw_queue_job_entry)); + return error; +} |