#!/usr/bin/python

from mdb import MDB

####################################
#
# TMPFS DUMP
#
# Shows all tmpfs directory entries (tdirent)
# based on t_hashtable
# 
# ----------------------------------
#
# (c) Sergey Klyaus, Tune-IT, 2012
# myaut@tune-it.ru
#
####################################

MDB_COMMAND = 'mdb -k'
HUMAN_FORMAT = False

def human_size(num):
    if not HUMAN_FORMAT:
        return str(num)
    
    for x in ['b', 'K', 'M', 'G']:
        if num < 1024:
            return "%.1f%s" % (num, x)
        num /= 1024

mdb_table_proc = MDB(MDB_COMMAND, interactive=False)
#mdb_table_proc.logging = 'table'
mdb_table_proc.send('t_hashtable::array | ::list struct tdirent td_link')

mdb_tdir_proc = MDB(MDB_COMMAND)
#mdb_tdir_proc.logging = 'tdir'

print '%12s %12s %s' % ("VP", "SIZE", "VPATH")

for tdirent in mdb_table_proc:
    mdb_tdir_proc.send(tdirent + '::print struct tdirent td_tmpnode')
    
    node = mdb_tdir_proc.readfield()
    
    if node != '0':
         mdb_tdir_proc.send(node + '::print struct tmpnode tn_vnode tn_attr.va_size')
         
         vnode = mdb_tdir_proc.readfield()
         size = mdb_tdir_proc.readfield()
         
         if '0x' in size:
             size = human_size(int(size, 16))
         
         if vnode != '0':
             mdb_tdir_proc.send(vnode + '::print vnode_t v_path', wrap_hack=True)
             
             vpath = mdb_tdir_proc.readvpath()
             
             print '%12s %12s %s' % (vnode, size, vpath)
        