|
On Tue, 8 May 2001, Haase, Justin C. wrote:
> I think an example program would be great. We have directories many, many
> layers deep. Damn Websphere anyway! =) We're talking 12, 13 layers.
> Thanks in advance for your help.
>
> You could write a program that goes through all the objects in the IFS
> and adds up their sizes, etc. The trick is going to be figuring out
> how to store the pathname, since it can potentially be hundreds of bytes
> long... :) I don't know if that's a concern for you or not, though...
>
> Do you need an example of how to do this? (in RPG IV?)
>
In comparison to the STRQSH method that Buck suggests, my way will
seem very complicated... :) But, at least you won't have to try to
figure out how to parse the filenames from the output file.
Basically, I'm writing my own "ls" command :)
It may be worth your while to modify the code so that it skips
'/qsys.lib/' since you're probably already getting that information
elsewhere.
Here it is:
D**********************************************************************
D* File Information Structure (stat)
D*
D* struct stat {
D* mode_t st_mode; /* File mode */
D* ino_t st_ino; /* File serial number */
D* nlink_t st_nlink; /* Number of links */
D* uid_t st_uid; /* User ID of the owner of file */
D* gid_t st_gid; /* Group ID of the group of file */
D* off_t st_size; /* For regular files, the file
D* * size in bytes */
D* time_t st_atime; /* Time of last access */
D* time_t st_mtime; /* Time of last data modification */
D* time_t st_ctime; /* Time of last file status change */
D* dev_t st_dev; /* ID of device containing file */
D* size_t st_blksize; /* Size of a block of the file */
D* unsigned long st_allocsize; /* Allocation size of the file */
D* qp0l_objtype_t st_objtype; /* AS/400 object type */
D* unsigned short st_codepage; /* Object data codepage */
D* char st_reserved1[66]; /* Reserved */
D* };
D*
D p_statds S *
D statds DS BASED(p_statds)
D st_mode 10U 0
D st_ino 10U 0
D st_nlink 5U 0
D st_pad 2A
D st_uid 10U 0
D st_gid 10U 0
D st_size 10I 0
D st_atime 10I 0
D st_mtime 10I 0
D st_ctime 10I 0
D st_dev 10U 0
D st_blksize 10U 0
D st_alctize 10U 0
D st_objtype 12A
D st_codepag 5U 0
D st_resv11 62A
D st_ino_gen_id 10U 0
D**********************************************************************
D*
D* Directory Entry Structure (dirent)
D*
D* struct dirent {
D* char d_reserved1[16]; /* Reserved */
D* unsigned int d_reserved2; /* Reserved */
D* ino_t d_fileno; /* The file number of the file */
D* unsigned int d_reclen; /* Length of this directory entry
D* * in bytes */
D* int d_reserved3; /* Reserved */
D* char d_reserved4[8]; /* Reserved */
D* qlg_nls_t d_nlsinfo; /* National Language Information
D* * about d_name */
D* unsigned int d_namelen; /* Length of the name, in bytes
D* * excluding NULL terminator */
D* char d_name[_QP0L_DIR_NAME]; /* Name...null terminated */
D*
D* };
D*
D p_dirent s *
D dirent ds based(p_dirent)
D d_reserv1 16A
D d_reserv2 10U 0
D d_fileno 10U 0
D d_reclen 10U 0
D d_reserv3 10I 0
D d_reserv4 8A
D d_nlsinfo 12A
D nls_ccsid 10I 0 OVERLAY(d_nlsinfo:1)
D nls_cntry 2A OVERLAY(d_nlsinfo:5)
D nls_lang 3A OVERLAY(d_nlsinfo:7)
D nls_reserv 3A OVERLAY(d_nlsinfo:10)
D d_namelen 10U 0
D d_name 640A
D*--------------------------------------------------------------------
D* Open a Directory
D*
D* DIR *opendir(const char *dirname)
D*--------------------------------------------------------------------
D opendir PR * EXTPROC('opendir')
D dirname * VALUE options(*string)
D*--------------------------------------------------------------------
D* Read Directory Entry
D*
D* struct dirent *readdir(DIR *dirp)
D*--------------------------------------------------------------------
D readdir PR * EXTPROC('readdir')
D dirp * VALUE
D*--------------------------------------------------------------------
D* Close a directory
D*
D* int closedir(DIR *dirp)
D*--------------------------------------------------------------------
D closedir PR 10I 0 EXTPROC('closedir')
D dirhandle * VALUE
D*--------------------------------------------------------------------
D* Get File or Link Information
D*
D* int lstat(const char *path, struct stat *buf)
D*--------------------------------------------------------------------
D lstat PR 10I 0 ExtProc('lstat')
D path * Value options(*string)
D buf * Value
D getdirsize PR 20U 0
D directory 640A const
D AddRecord PR
D ifs_object 640A const
D size 20U 0 value
D S_ISDIR PR 1N
D mode 10U 0 value
D size S 10I 0
D totalsize S 20U 0
c eval size = %size(statds)
c alloc size p_statds
C* This gives us a starting point:
c eval totalsize = getdirsize('/')
c dealloc p_statds
c eval *inlr = *on
P*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P* This (recursively) totals up the size of each object in
P* a directory.
P*
P* This calls AddRecord() for each non-directory object it finds.
P*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P getdirsize B
D getdirsize PI 20U 0
D directory 640A const
D file_size S 20U 0
D total S 20U 0
D dh S *
D rpg_name S 640A
D last_pos S 10U 0
D dir S 640A
c eval dh = opendir(%trim(directory))
c if dh = *NULL
c return 0
c endif
c ' ' checkr directory last_pos
c if %subst(directory:last_pos:1) <> '/'
c eval dir = %trim(directory) + '/'
c else
c eval dir = %trim(directory)
c endif
c eval total = 0
c eval p_dirent = readdir(dh)
c dow p_dirent <> *NULL
c eval rpg_name = %str(%addr(d_name))
c if rpg_name <> '.' and rpg_name<>'..'
c eval rpg_name = %trim(dir) + rpg_name
c if lstat(%trim(rpg_name): p_statds) = 0
c if S_ISDIR(st_mode)
c eval file_size = getdirsize(rpg_name)
c else
c eval file_size = st_size
c callp AddRecord(rpg_name: file_size)
c endif
c eval total = total + file_size
c endif
c endif
c eval p_dirent = readdir(dh)
c enddo
c callp closedir(dh)
c return total
P E
P*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P* This (recursively) totals up the size of each object in
P* a directory.
P*
P* This calls AddRecord() for each non-directory object it finds.
P*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P AddRecord B
D AddRecord PI
D ifs_object 640A const
D size 20U 0 value
C* Here is where you'd write records to your file
C* with something like this:
C* eval filename = ifs_object
c* eval filesize = size
c* write my_file
P E
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* This tests a file mode to see if a file is a directory.
* (sorry, this is horribly ugly in RPG)
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P S_ISDIR B
D S_ISDIR PI 1N
D mode 10U 0 value
D DS
D dirmode 1 4U 0
D byte1 1 1A
D byte2 2 2A
D byte3 3 3A
D byte4 4 4A
c eval dirmode = mode
c bitoff x'FF' byte1
c bitoff x'FE' byte2
c bitoff x'0F' byte3
c bitoff x'FF' byte4
c if dirmode = 16384
c return *On
c else
c return *Off
c endif
P E
+---
| This is the Midrange System Mailing List!
| To submit a new message, send your mail to MIDRANGE-L@midrange.com.
| To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com.
| To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.