const char * iso9660_get_xa_attr_str (uint16_t xa_attr) { char *result = _getbuf(); xa_attr = uint16_from_be (xa_attr); result[ 0] = (xa_attr & XA_ATTR_DIRECTORY) ? 'd' : '-'; result[ 1] = (xa_attr & XA_ATTR_CDDA) ? 'a' : '-'; result[ 2] = (xa_attr & XA_ATTR_INTERLEAVED) ? 'i' : '-'; result[ 3] = (xa_attr & XA_ATTR_MODE2FORM2) ? '2' : '-'; result[ 4] = (xa_attr & XA_ATTR_MODE2FORM1) ? '1' : '-'; result[ 5] = (xa_attr & XA_PERM_XUSR) ? 'x' : '-'; result[ 6] = (xa_attr & XA_PERM_RUSR) ? 'r' : '-'; result[ 7] = (xa_attr & XA_PERM_XGRP) ? 'x' : '-'; result[ 8] = (xa_attr & XA_PERM_RGRP) ? 'r' : '-'; /* Hack alert: wonder if this should be ROTH and XOTH? */ result[ 9] = (xa_attr & XA_PERM_XSYS) ? 'x' : '-'; result[10] = (xa_attr & XA_PERM_RSYS) ? 'r' : '-'; result[11] = '\0'; return result; }
static void print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[], cdio_fs_anal_t fs, bool b_mode2) { CdioList_t *entlist; CdioList_t *dirlist = _cdio_list_new (); CdioListNode_t *entnode; uint8_t i_joliet_level; i_joliet_level = (opts.no_joliet) ? 0 : cdio_get_joliet_level(p_cdio); entlist = iso9660_fs_readdir (p_cdio, pathname, b_mode2); sprintf (temp_msg, "%s:\n", pathname); report(stdout, temp_msg); if (NULL == entlist) { report( stderr, "Error getting above directory information\n" ); return; } /* Iterate over files in this directory */ _CDIO_LIST_FOREACH (entnode, entlist) { iso9660_stat_t *statbuf = _cdio_list_node_data (entnode); char *iso_name = statbuf->filename; char _fullname[4096] = { 0, }; char translated_name[MAX_ISONAME+1]; #define DATESTR_SIZE 30 char date_str[DATESTR_SIZE]; iso9660_name_translate_ext(iso_name, translated_name, i_joliet_level); snprintf (_fullname, sizeof (_fullname), "%s%s", pathname, iso_name); strncat (_fullname, "/", sizeof (_fullname)); if (statbuf->type == _STAT_DIR && strcmp (iso_name, ".") && strcmp (iso_name, "..")) _cdio_list_append (dirlist, strdup (_fullname)); if (fs & CDIO_FS_ANAL_XA) { sprintf (temp_msg, " %c %s %d %d [fn %.2d] [LSN %6lu] ", (statbuf->type == _STAT_DIR) ? 'd' : '-', iso9660_get_xa_attr_str (statbuf->xa.attributes), uint16_from_be (statbuf->xa.user_id), uint16_from_be (statbuf->xa.group_id), statbuf->xa.filenum, (long unsigned int) statbuf->lsn); report(stdout, temp_msg); if (uint16_from_be(statbuf->xa.attributes) & XA_ATTR_MODE2FORM2) { sprintf (temp_msg, "%9u (%9u)", (unsigned int) statbuf->secsize * M2F2_SECTOR_SIZE, (unsigned int) statbuf->size); report(stdout, temp_msg); } else { printf ("%9u", (unsigned int) statbuf->size); } } strftime(date_str, DATESTR_SIZE, "%b %d %Y %H:%M ", &statbuf->tm); sprintf (temp_msg, " %s %s\n", date_str, translated_name); report(stdout, temp_msg); }