int main (int argc, const char *argv[]) { int c; int i; int i_bad = 0; char dst[100]; char *dst_p; int achars[] = {'!', '"', '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', '?', '<', '=', '>'}; /********************************************* * Test ACHAR and DCHAR *********************************************/ for (c='A'; c<='Z'; c++ ) { if (!iso9660_is_dchar(c)) { printf("Failed iso9660_is_dchar test on %c\n", c); i_bad++; } if (!iso9660_is_achar(c)) { printf("Failed iso9660_is_achar test on %c\n", c); i_bad++; } } if (i_bad) return i_bad; for (c='0'; c<='9'; c++ ) { if (!iso9660_is_dchar(c)) { printf("Failed iso9660_is_dchar test on %c\n", c); i_bad++; } if (!iso9660_is_achar(c)) { printf("Failed iso9660_is_achar test on %c\n", c); i_bad++; } } if (i_bad) return i_bad; for (i=0; i<=13; i++ ) { c=achars[i]; if (iso9660_is_dchar(c)) { printf("Should not pass iso9660_is_dchar test on %c\n", c); i_bad++; } if (!iso9660_is_achar(c)) { printf("Failed iso9660_is_achar test on symbol %c\n", c); i_bad++; } } if (i_bad) return i_bad; /********************************************* * Test iso9660_strncpy_pad *********************************************/ dst_p = iso9660_strncpy_pad(dst, "1_3", 5, ISO9660_DCHARS); if ( 0 != strncmp(dst, "1_3 ", 5) ) { printf("Failed iso9660_strncpy_pad DCHARS\n"); return 31; } dst_p = iso9660_strncpy_pad(dst, "ABC!123", 2, ISO9660_ACHARS); if ( 0 != strncmp(dst, "AB", 2) ) { printf("Failed iso9660_strncpy_pad ACHARS truncation\n"); return 32; } /********************************************* * Test iso9660_dirname_valid_p *********************************************/ if ( iso9660_dirname_valid_p("/NOGOOD") ) { printf("/NOGOOD should fail iso9660_dirname_valid_p\n"); return 33; } if ( iso9660_dirname_valid_p("LONGDIRECTORY/NOGOOD") ) { printf("LONGDIRECTORY/NOGOOD should fail iso9660_dirname_valid_p\n"); return 34; } if ( !iso9660_dirname_valid_p("OKAY/DIR") ) { printf("OKAY/DIR should pass iso9660_dirname_valid_p\n"); return 35; } if ( iso9660_dirname_valid_p("OKAY/FILE.EXT") ) { printf("OKAY/FILENAME.EXT should fail iso9660_dirname_valid_p\n"); return 36; } /********************************************* * Test iso9660_pathname_valid_p *********************************************/ if ( !iso9660_pathname_valid_p("OKAY/FILE.EXT") ) { printf("OKAY/FILE.EXT should pass iso9660_dirname_valid_p\n"); return 37; } if ( iso9660_pathname_valid_p("OKAY/FILENAMETOOLONG.EXT") ) { printf("OKAY/FILENAMETOOLONG.EXT should fail iso9660_dirname_valid_p\n"); return 38; } if ( iso9660_pathname_valid_p("OKAY/FILE.LONGEXT") ) { printf("OKAY/FILE.LONGEXT should fail iso9660_dirname_valid_p\n"); return 39; } dst_p = iso9660_pathname_isofy ("this/file.ext", 1); if ( 0 != strncmp(dst_p, "this/file.ext;1", 16) ) { printf("Failed iso9660_pathname_isofy\n"); free(dst_p); return 40; } free(dst_p); /********************************************* * Test get/set date *********************************************/ { struct tm *p_tm, tm; iso9660_dtime_t dtime; time_t now = time(NULL); memset(&dtime, 0, sizeof(dtime)); p_tm = localtime(&now); iso9660_set_dtime(p_tm, &dtime); iso9660_get_dtime(&dtime, true, &tm); p_tm = gmtime(&now); iso9660_set_dtime_with_timezone(p_tm, 0, &dtime); if (!iso9660_get_dtime(&dtime, false, &tm)) { printf("Error returned by iso9660_get_dtime_with_timezone\n"); return 41; } if ( !time_compare(p_tm, &tm) ) { printf("GMT time retrieved with iso9660_get_dtime_with_timezone() not same as that\n"); printf("set with iso9660_set_dtime().\n"); return 42; } #ifdef HAVE_TM_GMTOFF if ( !time_compare(p_tm, &tm) ) { return 43; } p_tm = gmtime(&now); iso9660_set_dtime(p_tm, &dtime); if (!iso9660_get_dtime(&dtime, false, &tm)) { printf("Error returned by iso9660_get_dtime\n"); return 44; } if ( !time_compare(p_tm, &tm) ) { printf("GMT time retrieved with iso9660_get_dtime() not same as that\n"); printf("set with iso9660_set_dtime().\n"); return 45; } { iso9660_ltime_t ltime; p_tm = localtime(&now); iso9660_set_ltime(p_tm, <ime); if (!iso9660_get_ltime(<ime, &tm)) { printf("Problem running iso9660_get_ltime\n"); return 46; } if ( ! time_compare(p_tm, &tm) ) { printf("local time retrieved with iso9660_get_ltime() not\n"); printf("same as that set with iso9660_set_ltime().\n"); return 47; } p_tm = gmtime(&now); iso9660_set_ltime(p_tm, <ime); iso9660_get_ltime(<ime, &tm); if ( ! time_compare(p_tm, &tm) ) { printf("GMT time retrieved with iso9660_get_ltime() not\n"); printf("same as that set with iso9660_set_ltime().\n"); return 48; } } #endif } return 0; }
void iso9660_set_pvd(void *pd, const char volume_id[], const char publisher_id[], const char preparer_id[], const char application_id[], uint32_t iso_size, const void *root_dir, uint32_t path_table_l_extent, uint32_t path_table_m_extent, uint32_t path_table_size, const time_t *pvd_time ) { iso9660_pvd_t ipd; struct tm temp_tm; cdio_assert (sizeof(iso9660_pvd_t) == ISO_BLOCKSIZE); cdio_assert (pd != NULL); cdio_assert (volume_id != NULL); cdio_assert (application_id != NULL); memset(&ipd,0,sizeof(ipd)); /* paranoia? */ /* magic stuff ... thatis CD XA marker... */ strncpy(((char*)&ipd)+ISO_XA_MARKER_OFFSET, ISO_XA_MARKER_STRING, sizeof(ISO_XA_MARKER_STRING)); ipd.type = to_711(ISO_VD_PRIMARY); iso9660_strncpy_pad (ipd.id, ISO_STANDARD_ID, 5, ISO9660_DCHARS); ipd.version = to_711(ISO_VERSION); iso9660_strncpy_pad (ipd.system_id, SYSTEM_ID, 32, ISO9660_ACHARS); iso9660_strncpy_pad (ipd.volume_id, volume_id, 32, ISO9660_DCHARS); ipd.volume_space_size = to_733(iso_size); ipd.volume_set_size = to_723(1); ipd.volume_sequence_number = to_723(1); ipd.logical_block_size = to_723(ISO_BLOCKSIZE); ipd.path_table_size = to_733(path_table_size); ipd.type_l_path_table = to_731(path_table_l_extent); ipd.type_m_path_table = to_732(path_table_m_extent); /* root_directory_record doesn't contain the 1-byte filename, so we add one for that. */ cdio_assert (sizeof(ipd.root_directory_record) == 33); memcpy(&(ipd.root_directory_record), root_dir, sizeof(ipd.root_directory_record)); ipd.root_directory_filename='\0'; ipd.root_directory_record.length = sizeof(ipd.root_directory_record)+1; iso9660_strncpy_pad (ipd.volume_set_id, VOLUME_SET_ID, ISO_MAX_VOLUMESET_ID, ISO9660_DCHARS); iso9660_strncpy_pad (ipd.publisher_id, publisher_id, ISO_MAX_PUBLISHER_ID, ISO9660_ACHARS); iso9660_strncpy_pad (ipd.preparer_id, preparer_id, ISO_MAX_PREPARER_ID, ISO9660_ACHARS); iso9660_strncpy_pad (ipd.application_id, application_id, ISO_MAX_APPLICATION_ID, ISO9660_ACHARS); iso9660_strncpy_pad (ipd.copyright_file_id , "", 37, ISO9660_DCHARS); iso9660_strncpy_pad (ipd.abstract_file_id , "", 37, ISO9660_DCHARS); iso9660_strncpy_pad (ipd.bibliographic_file_id, "", 37, ISO9660_DCHARS); gmtime_r(pvd_time, &temp_tm); iso9660_set_ltime (&temp_tm, &(ipd.creation_date)); gmtime_r(pvd_time, &temp_tm); iso9660_set_ltime (&temp_tm, &(ipd.modification_date)); iso9660_set_ltime (NULL, &(ipd.expiration_date)); iso9660_set_ltime (NULL, &(ipd.effective_date)); ipd.file_structure_version = to_711(1); /* we leave ipd.application_data = 0 */ memcpy(pd, &ipd, sizeof(ipd)); /* copy stuff to arg ptr */ }