	.TITLE	SS_spoolqueue Spool Queue system service
	.IDENT	/V1.0/
 
;++
; FUNCTIONAL DESCRIPTION:
; 
;	 This module declares a system service to extract the spool queue name
;	 from a spooled device.
; 
; AUTHOR:   Chris  , CREATION-DATE: 20-JUL-1992
; 
; MODIFIED BY: 
; 
;--
;

	.link		"sys$system:sys.stb"/selective_search
	.library	"sys$share:lib"

	$devdef
	$plvdef
	$prdef
	$shrdef
	$ssdef
	$ucbdef
	$vcbdef

	.external	sch$iolockr, sch$iounlock, ioc$searchdev, ctl$gl_pcb

	.dsabl	GLOBAL

.if defined plv$l_kernel
; VAX
	.macro	xfr	name, cod=<<jmp	name+2>>
	.psect	$$$transfer_vector,page,pic,nowrt,exe
	.align	quad
	.transfer	name
	.mask	name
	.irp	lin, \cod
		lin
	.endr
	.endm

	.macro	kss	name,narg=0
	xfr	name	<<chmk	#<kbase+kcount>>,<ret>>
	kcount = kcount + 1

	.psect	knarg,byte,pic,nowrt,exe
	.byte	narg

	.psect	kernel_disp1,byte,pic,nowrt,exe
	.signed_word	2+name-kcase_base
	.endm

kcount = 0

	.psect	knarg,byte,pic,nowrt,exe
knarg:

	kss	getdvi_queue,2

kbase = -1024

	.psect	user_services,page,vec,pic,nowrt,exe

	.long	plv$c_typ_cmod, 0		; vector type change mode dispatcher
	.long	kdisp-., 0			; k,e dispatchers
	.long	0, 0, 0, 0			; user rundown, resv, rms, check

	.psect	kernel_disp0,byte,pic,nowrt,exe

knotme:	rsb

kdisp:	movab	w^-kbase(r0), r1		; normalize code
	blss	knotme
	cmpl	r1, #kcount
	bgequ	knotme

; call is for us

	movzbl	knarg[r1], r1
	moval	@#4[r1], r1
	ifnord	r1, (ap), kaccvio
	cmpb	(ap), knarg-kbase[r0]
	blssu	kinsfarg
	casew	r0, #kbase, #<kcount-1>
kcase_base:
	.psect	kernel_disp2,byte,pic,nowrt,exe
	.external	bug$_ivssrvrqst
	bug_check	ivssrvrqst, FATAL

kaccvio1:
	brw	kaccvio
	.psect	kernel_disp0,byte,pic,nowrt,exe

.if_false
; Alpha
	.psect	kernel_disp,long,pic,nowrt,noexe
kcount = 0
ktable:
	.macro	kss	name,narg=0
	kcount = kcount + 1
	.address	name
	.endm

	kss	getdvi_queue,2

	.psect	user_services,page,vec,pic,nowrt,exe

	.long	plv$c_typ_cmod, 0		; vector type change mode dispatcher
	.long	kcount, 0			; k, e routine count
	.address ktable, 0, 0			; k, e routine list, rundown
	.long	0, 0, 0, 0			; resv; rms; k, e flags

	.psect	kernel_routines,long,pic,nowrt,exe
.endc

kinsfarg:
	movzwl	#ss$_insfarg, r0
	ret

kaccvio:
	movzwl	#ss$_accvio, r0
	ret

	.entry	getdvi_queue, ^m<r2,r3,r4,r5>
.if not_defined plv$l_kernel
;	.call_entry label=getdvi_queue, preserve=<r2,r3,r4,r5>, max_args=3
	cmpb	(ap), #2
	blssu	kinsfarg
.endc
; Args: device, queue, queuelen

	clrl	-(sp)
	moval	(sp), (sp)

	ifnord	#8, @4(ap), kaccvio
	movl	4(ap), r1
	movzwl	(r1), r0
	ifnord	r0, @4(r1), kaccvio

	ifnord	#8, @8(ap), kaccvio
	movl	8(ap), r1
	movzwl	(r1), r0
	ifnowrt	r0, @4(r1), kaccvio

	cmpb	(ap), #3
	blssu	1$
	movl	12(ap), r0
	beql	1$
	ifnowrt	#2, (r0), kaccvio
	movl	12(ap), (sp)

; Lock the I/O database for read (required by ioc$searchdev)

1$:	jsb	g^sch$iolockr
; returns mutex addr, not status
; IPL = astdel (to prevent process deletion)
; Fatal bug to exit Kernel mode while holding any mutex

; Search for the device (with logical name translation)

	movl	4(ap), r1
	jsb	g^ioc$searchdev
	blbc	r0, 8$
; R1 = UCB, R2 = DDB, R3 trash
; We've found it - is it spooled ?

	movzwl	#shr$_noqueue, r0
	bbc	#dev$v_spl, ucb$l_devchar(r1), 8$

; Copy the queue name out of the VCB

	movl	ucb$l_vcb(r1), r2
	movzbl	vcb$b_qnamecnt(r2), r0
	movl	8(ap), r1
	movw	r0, @(sp)+
	movc5	r0, vcb$t_qname(r2), #^a" ", (r1), @4(r1)
	movl	#1, r0

; All done - unlock the I/O DB, drop IPL, and return status

8$:	pushl	r0
	movl	g^ctl$gl_pcb, r4
	jsb	g^sch$iounlock
	setipl	#0, environ=UNIPROCESSOR
	popl	r0
	ret

	.END
