/* Functions to manage the superblock of the filesystem. These functions are * are called at the beginning and at the end of the server. */ #include "inc.h" #include #include #include #include /* This function is called when the filesystem is umounted. It releases the * super block. */ int release_v_pri(v_pri) register struct iso9660_vd_pri *v_pri; { /* Release the root dir record */ release_dir_record(v_pri->dir_rec_root); v_pri->count = 0; return OK; } /* This function fullfill the super block data structure using the information * contained in the stream buf. Such stream is physically read from the device * . */ int create_v_pri(v_pri,buf,address) register struct iso9660_vd_pri *v_pri; register char* buf; register unsigned long address; { struct dir_record *dir; v_pri->vd_type = buf[0]; memcpy(v_pri->standard_id,buf + 1,sizeof(v_pri->standard_id)); v_pri->vd_version = buf[6]; memcpy(v_pri->system_id,buf + 8,sizeof(v_pri->system_id)); memcpy(v_pri->volume_id,buf + 40,sizeof(v_pri->volume_id)); memcpy(&v_pri->volume_space_size_l,buf + 80, sizeof(v_pri->volume_space_size_l)); memcpy(&v_pri->volume_space_size_m,buf + 84, sizeof(v_pri->volume_space_size_m)); memcpy(&v_pri->volume_set_size,buf + 120,sizeof(v_pri->volume_set_size)); memcpy(&v_pri->volume_sequence_number,buf + 124, sizeof(v_pri->volume_sequence_number)); memcpy(&v_pri->logical_block_size_l,buf + 128, sizeof(v_pri->logical_block_size_l)); memcpy(&v_pri->logical_block_size_m,buf + 130, sizeof(v_pri->logical_block_size_m)); memcpy(&v_pri->path_table_size_l,buf + 132, sizeof(v_pri->path_table_size_l)); memcpy(&v_pri->path_table_size_m,buf + 136, sizeof(v_pri->path_table_size_m)); memcpy(&v_pri->loc_l_occ_path_table,buf + 140, sizeof(v_pri->loc_l_occ_path_table)); memcpy(&v_pri->loc_opt_l_occ_path_table,buf + 144, sizeof(v_pri->loc_opt_l_occ_path_table)); memcpy(&v_pri->loc_m_occ_path_table, buf + 148, sizeof(v_pri->loc_m_occ_path_table)); memcpy(&v_pri->loc_opt_m_occ_path_table,buf + 152, sizeof(v_pri->loc_opt_m_occ_path_table)); dir = get_free_dir_record(); if (dir == NULL) return EINVAL; create_dir_record(dir,buf + 156,(u32_t)(address + 156)); v_pri->dir_rec_root = dir; dir->d_ino_nr = ROOT_INO_NR; memcpy(v_pri->volume_set_id,buf + 190,sizeof(v_pri->volume_set_id)); memcpy(v_pri->publisher_id,buf + 318,sizeof(v_pri->publisher_id)); memcpy(v_pri->data_preparer_id,buf + 446,sizeof(v_pri->data_preparer_id)); memcpy(v_pri->application_id,buf + 574,sizeof(v_pri->application_id)); memcpy(v_pri->copyright_file_id,buf + 702,sizeof(v_pri->copyright_file_id)); memcpy(v_pri->abstract_file_id,buf + 739,sizeof(v_pri->abstract_file_id)); memcpy(v_pri->bibl_file_id,buf + 776,sizeof(v_pri->bibl_file_id)); memcpy(v_pri->volume_cre_date,buf + 813,sizeof(v_pri->volume_cre_date)); memcpy(v_pri->volume_mod_date,buf + 830,sizeof(v_pri->volume_mod_date)); memcpy(v_pri->volume_exp_date,buf + 847,sizeof(v_pri->volume_exp_date)); memcpy(v_pri->volume_eff_date,buf + 864,sizeof(v_pri->volume_eff_date)); v_pri->file_struct_ver = buf[881]; return OK; } /* This function reads from a ISO9660 filesystem (in the device dev) the * super block and saves it in v_pri. */ int read_vds( register struct iso9660_vd_pri *v_pri, register dev_t dev ) { u64_t offset; int vol_ok = FALSE; int r; static char sbbuf[ISO9660_MIN_BLOCK_SIZE]; int i = 0; offset = ((u64_t)(ISO9660_SUPER_BLOCK_POSITION)); while (!vol_ok && i++