Support for setting default modes for files and dirs.

This commit is contained in:
Vreixo Formoso 2007-12-27 18:10:14 +01:00
parent 941e2022e8
commit a8636eaa60
6 changed files with 97 additions and 54 deletions

View File

@ -31,7 +31,15 @@ int main(int argc, char **argv)
1, /* rockridge */ 1, /* rockridge */
0, /* omit_version_numbers */ 0, /* omit_version_numbers */
0, /* allow_deep_paths */ 0, /* allow_deep_paths */
0 /* sort files */ 0, /* sort files */
0, /* replace_dir_mode */
0, /* replace_file_mode */
0, /* replace_uid */
0, /* replace_gid */
0, /* dir_mode */
0, /* file_mode */
0, /* uid */
0 /* gid */
}; };
if (argc < 2) { if (argc < 2) {

View File

@ -735,6 +735,16 @@ int ecma119_image_new(IsoImage *src, Ecma119WriteOpts *opts,
target->omit_version_numbers = opts->omit_version_numbers; target->omit_version_numbers = opts->omit_version_numbers;
target->allow_deep_paths = opts->allow_deep_paths; target->allow_deep_paths = opts->allow_deep_paths;
target->sort_files = opts->sort_files; target->sort_files = opts->sort_files;
target->replace_uid = opts->replace_uid ? 1 : 0;
target->replace_gid = opts->replace_gid ? 1 : 0;
target->replace_dir_mode = opts->replace_dir_mode ? 1 : 0;
target->replace_file_mode = opts->replace_file_mode ? 1 : 0;
target->uid = opts->replace_uid == 2 ? opts->uid : 0;
target->gid = opts->replace_gid == 2 ? opts->gid : 0;
target->dir_mode = opts->replace_dir_mode == 2 ? opts->dir_mode : 0555;
target->file_mode = opts->replace_file_mode == 2 ? opts->file_mode : 0444;
target->now = time(NULL); target->now = time(NULL);
target->ms_block = 0; target->ms_block = 0;

View File

@ -35,23 +35,22 @@ struct ecma119_image {
/* relaxed constraints */ /* relaxed constraints */
unsigned int omit_version_numbers:1; unsigned int omit_version_numbers:1;
unsigned int allow_deep_paths:1; unsigned int allow_deep_paths:1;
// int relaxed_constraints; /**< see ecma119_relaxed_constraints_flag */ // int relaxed_constraints; /**< see ecma119_relaxed_constraints_flag */
//
// int replace_mode; /**< Replace ownership and modes of files /*
// * * Mode replace. If one of these flags is set, the correspodent values are
// * 0. filesystem values * replaced with values below.
// * 1. useful values */
// * bits 1-4 bitmask: unsigned int replace_uid:1;
// * 2 - replace dir unsigned int replace_gid:1;
// * 3 - replace file unsigned int replace_file_mode:1;
// * 4 - replace gid unsigned int replace_dir_mode:1;
// * 5 - replace uid
// */ uid_t uid;
// mode_t dir_mode; gid_t gid;
// mode_t file_mode; mode_t file_mode;
// gid_t gid; mode_t dir_mode;
// uid_t uid;
int sort_files; /**< if sort files or not. Sorting is based of int sort_files; /**< if sort files or not. Sorting is based of
* the weight of each file */ * the weight of each file */

View File

@ -79,41 +79,30 @@ typedef struct {
* its size. In those cases, we only copy 1 block of data. * its size. In those cases, we only copy 1 block of data.
*/ */
/**< If files should be sorted based on their weight. */
unsigned int sort_files:1; unsigned int sort_files:1;
/**< If files should be sorted based on their weight. */
// unsigned int default_mode:1; /**
// /**< * The following options set the default values for files and directory
// * The default values for files and directory permissions, * permissions, gid and uid. All these take one of three values: 0, 1 or 2.
// * gid and uid. This option can be overwritten when set * If 0, the corresponding attribute will be kept as setted in the IsoNode.
// * one of the following. * Unless you have changed it, it corresponds to the value on disc, so it
// * 0 to use useful values, 1 to use node modes (this are * is suitable for backup purposes. If set to 1, the corresponding attrib.
// * the same as filesystem ones if not changed after added * will be changed by a default suitable value. Finally, if you set it to
// * to tree). * 2, the attrib. will be changed with the value specified in the options
// */ * below. Note that for mode attributes, only the permissions are set, the
// unsigned int replace_dir_mode:1; * file type remains unchanged.
// /**< */
// * When 1, permissions for all dirs will be replaced by the unsigned int replace_dir_mode:2;
// * specified in dir_mode field. unsigned int replace_file_mode:2;
// */ unsigned int replace_uid:2;
// unsigned int replace_file_mode:1; unsigned int replace_gid:2;
// /**<
// * When 1, permissions for all files will be replaced by the mode_t dir_mode; /** Mode to use on dirs when replace_dir_mode == 2. */
// * specified in file_mode field. mode_t file_mode; /** Mode to use on files when replace_file_mode == 2. */
// */ gid_t gid; /** gid to use when replace_gid == 2. */
// unsigned int replace_uid:1; uid_t uid; /** uid to use when replace_uid == 2. */
// /**<
// * When 1, uid of all nodes (both files and dirs) will be
// * replaced by the specified in uid field.
// */
// unsigned int replace_gid:1;
// /**<
// * When 1, gid of all nodes (both files and dirs) will be
// * replaced by the specified in gid field.
// */
// mode_t dir_mode; /**< Mode to use on dirs when replace_dir_mode is set. */
// mode_t file_mode; /**< Mode to use on files when replace_file_mode is set. */
// gid_t gid; /**< gid to use when replace_gid is set. */
// uid_t uid; /**< uid to use when replace_uid is set. */
// char *input_charset; /**< NULL to use default charset */ // char *input_charset; /**< NULL to use default charset */
// char *ouput_charset; /**< NULL to use default charset */ // char *ouput_charset; /**< NULL to use default charset */
// uint32_t ms_block; // uint32_t ms_block;

View File

@ -43,6 +43,41 @@ int susp_append_ce(Ecma119Image *t, struct susp_info *susp, uint8_t *data)
return ISO_SUCCESS; return ISO_SUCCESS;
} }
static
uid_t px_get_uid(Ecma119Image *t, Ecma119Node *n)
{
if (t->replace_uid) {
return t->uid;
} else {
return n->node->uid;
}
}
static
uid_t px_get_gid(Ecma119Image *t, Ecma119Node *n)
{
if (t->replace_gid) {
return t->gid;
} else {
return n->node->gid;
}
}
static
mode_t px_get_mode(Ecma119Image *t, Ecma119Node *n)
{
if ((n->type == ECMA119_DIR || n->type == ECMA119_PLACEHOLDER)) {
if (t->replace_dir_mode) {
return (n->node->mode & S_IFMT) | t->dir_mode;
}
} else {
if (t->replace_file_mode) {
return (n->node->mode & S_IFMT) | t->file_mode;
}
}
return n->node->mode;
}
/** /**
* Add a PX System Use Entry. The PX System Use Entry is used to add POSIX * Add a PX System Use Entry. The PX System Use Entry is used to add POSIX
* file attributes, such as access permissions or user and group id, to a * file attributes, such as access permissions or user and group id, to a
@ -60,10 +95,10 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
PX[1] = 'X'; PX[1] = 'X';
PX[2] = 44; PX[2] = 44;
PX[3] = 1; PX[3] = 1;
iso_bb(&PX[4], n->node->mode, 4); iso_bb(&PX[4], px_get_mode(t, n), 4);
iso_bb(&PX[12], n->nlink, 4); iso_bb(&PX[12], n->nlink, 4);
iso_bb(&PX[20], n->node->uid, 4); iso_bb(&PX[20], px_get_uid(t, n), 4);
iso_bb(&PX[28], n->node->gid, 4); iso_bb(&PX[28], px_get_gid(t, n), 4);
iso_bb(&PX[36], n->ino, 4); iso_bb(&PX[36], n->ino, 4);
return susp_append(t, susp, PX); return susp_append(t, susp, PX);

View File

@ -204,6 +204,8 @@ void test_rrip_get_susp_fields_file()
Ecma119Image t; Ecma119Image t;
uint8_t *entry; uint8_t *entry;
memset(&t, 0, sizeof(Ecma119Image));
file = malloc(sizeof(IsoFile)); file = malloc(sizeof(IsoFile));
CU_ASSERT_PTR_NOT_NULL_FATAL(file); CU_ASSERT_PTR_NOT_NULL_FATAL(file);
file->msblock = 0; file->msblock = 0;