proc make_dev {} {

	global base devf DB

#	This is the tough one.

	set sqlcmd "create table #spdevinfo ( \
        name varchar(30),  \
        physname varchar(127),  \
        phys_enabled bit ,  \
        mirror_name varchar(127) null,  \
        mir_enabled bit ,  \
        vdevno tinyint null,  \
        size int null,  \
        controller_type int ,  \
        controller_desc char(30) null,  \
        status varchar(30) null,  \
        device_type varchar(4) null,  \
        skip bit  ,  \
        serial_write bit ,  \
        read_mirrored bit ,  \
        contiguous bit ,   \
        mirroring_enabled bit  )"

	doSQL 1

#	OK, now we're going to stuff that table with data from the systables

	set sqlcmd "insert into #spdevinfo(name, physname, phys_enabled, mirror_name, \
        mir_enabled, controller_type, skip, serial_write, read_mirrored, \
        contiguous,  mirroring_enabled) ( select name, phyname,0, \
        mirrorname, 0, cntrltype, 0,0,0,0,0 from master.dbo.sysdevices )"
	set sqt "spdevinfo sysdevices"

	doSQL 1

#	Got the basic data, now assign some strings based on numeric codes

	set sqlcmd "update #spdevinfo set controller_desc = 'special' from \
	master.dbo.sysdevices d, #spdevinfo where d.cntrltype = 0 and \
	#spdevinfo.name = d.name"

	doSQL 1

	set sqlcmd "update #spdevinfo  set controller_desc = 'disk' from \
	master.dbo.sysdevices d, #spdevinfo where d.cntrltype = 2 and \
	#spdevinfo.name = d.name"

	doSQL 1

	set sqlcmd "update #spdevinfo set controller_desc = 'tape' from \
	master.dbo.sysdevices d, #spdevinfo where d.cntrltype >= 3 and \
	d.cntrltype <= 8 and #spdevinfo.name = d.name"

	doSQL 1

# 	Just in case you have a tape device, figure out its size

	set sqlcmd "if exists (select * from master.dbo.sysdevices d, #spdevinfo \
	where d.cntrltype >= 3 and d.cntrltype <= 8 and d.high > 0 and \
	#spdevinfo.name = d.name) begin \
	update #spdevinfo \
	set size = convert(int, round((d.high * convert(float, 32768)) / 1048576, 0)) \
	from master.dbo.sysdevices d, #spdevinfo where d.cntrltype >= 3 and \
	d.cntrltype <= 8 and d.high > 0 and #spdevinfo.name = d.name \
	end "
	
	doSQL 1

	set sqlcmd "update #spdevinfo set status = 'UNKNOWN' from \
	master.dbo.sysdevices d, #spdevinfo where d.cntrltype > 8 and \
	#spdevinfo.name = d.name"

	doSQL 1

#	more translations of cryptic internal codes... this is a big chunk!
#**  Check to see if the mirror is enabled. 0x200 (512) bit in status. 

	set sqt "spdevinfo spt_values sysdevices"

	set sqlcmd "if exists (select * from master.dbo.sysdevices d, \
	master.dbo.spt_values v, #spdevinfo where v.type = 'V' and v.number > -1 and \
	d.status >= 32 and #spdevinfo.name = d.name) begin \
        	if exists (select * from master.dbo.sysdevices d, #spdevinfo where \
		d.status & 512 = 512 and #spdevinfo.name = d.name) begin \
                	update #spdevinfo set mirroring_enabled = 1 \
                	from master.dbo.sysdevices d, #spdevinfo where \
                	d.status & 512 = 512 and #spdevinfo.name = d.name \
        	end \
        	if exists (select * from master.dbo.sysdevices d, #spdevinfo where \
                d.status & 512 != 512 and d.status >= 32 and \
		#spdevinfo.name = d.name) begin \
                	update #spdevinfo set mirroring_enabled = 0  \
                	from master.dbo.sysdevices d, #spdevinfo \
                	where d.status & 512 != 512 and d.status >= 32 and \
                	#spdevinfo.name = d.name \
                end \
        	update #spdevinfo set status = v.name from master.dbo.sysdevices d, \
                master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
                v.number > -1 and d.status >= 32  and #spdevinfo.name = d.name \

	end        
	else if exists (select * from master.dbo.sysdevices d, #spdevinfo where \
	#spdevinfo.name = d.name and d.mirrorname != null) begin 
        	if exists (select * from master.dbo.sysdevices d, \
		master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
		v.number > -1 and d.status & v.number = 256 and \
		#spdevinfo.name = d.name) begin \
                	update #spdevinfo set phys_enabled = 0, mir_enabled = 1 from  \
			master.dbo.sysdevices d, master.dbo.spt_values v, \
                	#spdevinfo where v.type = 'V' and v.number > -1 and \
                	d.status & v.number = 256 and #spdevinfo.name = d.name \
        	end else if exists (select * from master.dbo.sysdevices d,  \
                master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
                v.number > -1 and d.status & v.number = 64 and \
                #spdevinfo.name = d.name) begin 
        		update #spdevinfo set phys_enabled = 1, mir_enabled = 0 from \
			master.dbo.sysdevices d, master.dbo.sysdevices e, \
			master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
                	v.number > -1 and d.status & v.number = 64 and \
                	#spdevinfo.name = d.name and e.status & 256   != 256 and \
                	#spdevinfo.name = e.name \
        	end \
	end"

	doSQL 1	

	set sqlcmd "if exists (select * from master.dbo.sysdevices d, \
	master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
	v.number > -1 and d.status  & v.number = 32 and \
	#spdevinfo.name = d.name) begin 
        	update #spdevinfo set serial_write = 1 from master.dbo.sysdevices d, \
		master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
		v.number > -1 and d.status & v.number = 32  and \
		#spdevinfo.name = d.name \
	end"

	doSQL 1

	set sqlcmd "if exists (select * from master.dbo.sysdevices d, \
	master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
	v.number > -1 and d.status & v .number = 128 and \
	#spdevinfo.name = d.name) begin \
        	update #spdevinfo set read_mirrored =  1 from master.dbo.sysdevices d, \
        	master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
		v.number > -1 and d.status & v.number = 128 and \
		#spdevinfo.name = d.name \
	end"

	doSQL 1

	foreach i [list 1 2 4 8 16 ] {
	set sqlcmd "if exists (select * from master.dbo.sysdevices d, \
	master.dbo.spt_values v, #spdevinfo where v.type = 'V' and v.number > -1 and \
        d.status & v.number = $i and #spdevinfo.name = d.name) begin \
        	update #spdevinfo set status = v.name from master.dbo.sysdevices d, \
                master.dbo.spt_values v, #spdevinfo where v.type = 'V' and \
                v.number > -1 and d.status & v.number = $i and #spdevinfo.name = d.name \
	end "
	doSQL 1

	if {$i == 2} {
#		I'm puzzled by the v.number = 1 here, shouldn't it be 2?
		set sqlcmd "update #spdevinfo  set size = d.high - d.low from \
		master.dbo.sysdevices d, #spdevinfo, master.dbo.spt_values v where \
		d.status & 2 = 2 and #spdevinfo.name = d.name and v.number = 1 \
		and v.type = 'E' "
		doSQL 1
	}
	}

	set sqlcmd "update #spdevinfo set vdevno = \
	convert(tinyint, substring(convert(binary(4), d.low), v.low, 1)) from \
        master.dbo.sysdevices d, #spdevinfo, master.dbo.spt_values v where  \
        d.name = #spdevinfo.name and v.type = 'E' and v.number = 3 "

	doSQL 1

	puts $devf "/*  Physical Device Inventory (for reference)	*/"

	set sqlcmd "select * from #spdevinfo order by vdevno"
	doSQL 1
	set cols [sybCols 1]
#	puts stderr $cols

	while {1} {
		set line [sybNext 1]
		if {$line == ""} {break}
		eval lassign \$line $cols
		if {$base == "master"} {
		puts $devf "/* Device: $name  on $physname   pages: $size   */"
		if {[string first dump $name] < 0 && $name != "master"} {
			puts $devf "\ndisk init\n\tname=\"$name\",\n\tphysname=\"$physname\",\n\tvdevno = $vdevno,\n\tsize = $size\ngo\n"
		}
		}
		keylset Devices($name) phys $physname devno $vdevno size $size
	}

	set sqlcmd "select name = b.name, b.dbid, owner_name = suser_name(suid), \
	myid = user_id(), b.status, device   = d.name ,  usage = y.number , \
	segsize = (x.low * u.size) / (1024*1024) , pagesize = x.low from \
        master.dbo.sysdatabases b ,master.dbo.sysusages u , master.dbo.sysdevices d , \
        master.dbo.spt_values  x ,master.dbo.spt_values  y where    \
        b.dbid   = u.dbid and d.low   <= u.size + u.vstart and  \
        d.high  >= u.size + u.vstart - 1 and d.status & 2 = 2 and  \
        x.type   = 'E' and x.number = 1 and y.type   = 'S' and  \
        u.segmap & 7 = y.number order by b.dbid "

	set sqt "sysdatabases sysusages sysdevices spt_values"
	doSQL 1
	set cols [sybCols 1]
#	puts stderr $cols

	while {1} {
		set line [sybNext 1]
		if {$line == ""} {break}
		eval lassign \$line $cols
		foreach k $cols {
			keylset DB($dbid) $k [set $k]
		}
	}

	foreach di [lsort -integer [array names DB]] {
		set dn [keylget DB($di) name]
		set dv [keylget DB($di) device]
		set ds [keylget DB($di) segsize]
#		puts stderr "DB $dn"
#		foreach k $cols {
#			puts stderr "\t$k = [keylget DB($di) $k]"
#		}
		if {$base == "master"} {
		if {$di > 3} {
		puts $devf "\n/**  create database $dn, $ds MB on device $dv   **/"
		puts $devf "create database $dn on $dv = $ds\ngo"
		}
		}
		if {[info exists sum($dv)]} {
			set sum($dv) [expr $sum($dv) + $ds]
		} else {
			set sum($dv) $ds
		}
		lappend dbs($dv) $dn
	}

	puts $devf "\n/** DISK ALLOCATION:			**/"
	foreach d [lsort [array names sum]] {
		set dsize [keylget Devices($d) size]
		set dmb [expr $dsize / 512]
		set dphys [keylget Devices($d) phys]
		set remains [expr $dmb - $sum($d)]
		puts $devf [format "/** Device %-12.12s (%07d pages) %04d MB, used %04d MB***/"  $d $dsize $dmb $sum($d)]
		puts $devf "/**        used by [join $dbs($d) ,] **/"
	}

#	We will use this DB information next in make-db phase
#	how the heck do we get the log device info?
	

	return dev

}
