From 6bf538ff40810389812bdc36b7cd8fa4156c1ab9 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 17 Sep 2009 16:41:54 +0200 Subject: [PATCH] Expanded new API call iso_write_opts_set_scdbackup_tag --- libisofs/ecma119.c | 9 ++++++++- libisofs/ecma119.h | 10 +++++++++- libisofs/libisofs.h | 10 ++++++++-- libisofs/md5.c | 11 +++++++---- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index b4ba6cc..d56cc81 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -1135,6 +1135,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img) target->md5_file_checksums = opts->md5_file_checksums; target->md5_session_checksum = opts->md5_session_checksum; strcpy(target->scdbackup_tag_parm, opts->scdbackup_tag_parm); + target->scdbackup_tag_written = opts->scdbackup_tag_written; target->checksum_idx_counter = 0; target->checksum_ctx = NULL; target->checksum_counter = 0; @@ -1630,6 +1631,7 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile) if (wopts == NULL) { return ISO_OUT_OF_MEM; } + wopts->scdbackup_tag_written = NULL; switch (profile) { case 0: @@ -1870,7 +1872,8 @@ int iso_write_opts_set_record_md5(IsoWriteOpts *opts, int session, int files) } int iso_write_opts_set_scdbackup_tag(IsoWriteOpts *opts, - char *name, char *timestamp) + char *name, char *timestamp, + char *tag_written) { #ifdef Libisofs_with_checksumS @@ -1897,6 +1900,10 @@ int iso_write_opts_set_scdbackup_tag(IsoWriteOpts *opts, sprintf(opts->scdbackup_tag_parm, "%s %s", eff_name, eff_time); + opts->scdbackup_tag_written = tag_written; + if (tag_written != NULL) + tag_written[0] = 0; + #endif /* Libisofs_with_checksumS */ return ISO_SUCCESS; diff --git a/libisofs/ecma119.h b/libisofs/ecma119.h index d982d6c..5e731eb 100644 --- a/libisofs/ecma119.h +++ b/libisofs/ecma119.h @@ -290,6 +290,13 @@ struct iso_write_opts { * position. */ char scdbackup_tag_parm[100]; + + /* If not NULL: A pointer to an application provided array with + at least 512 characters. The effectively written scdbackup tag + will be copied to this memory location. + */ + char *scdbackup_tag_written; + }; typedef struct ecma119_image Ecma119Image; @@ -473,7 +480,8 @@ struct ecma119_image is submitted with ecma119_image_new() ? */ - char scdbackup_tag_parm[96]; + char scdbackup_tag_parm[100]; + char *scdbackup_tag_written; #endif /* Libisofs_with_checksumS */ diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index 9c42a2b..59bfb9c 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -1459,19 +1459,25 @@ int iso_write_opts_set_record_md5(IsoWriteOpts *opts, int session, int files); * @param timestamp * A string of 13 characters YYMMDD.hhmmss (e.g. A90831.190324). * A9 = 2009, B0 = 2010, B1 = 2011, ... C0 = 2020, ... + * @param tag_written + * Either NULL or the address of an array with at least 512 characters. + * In the latter case the eventually produced scdbackup tag will be + * copied to this array when the image gets written. This call sets + * scdbackup_tag_written[0] = 0 to mark its preliminary invalidity. * @return * 1 indicates success, <0 is error * * @since 0.6.24 */ int iso_write_opts_set_scdbackup_tag(IsoWriteOpts *opts, - char *name, char *timestamp); + char *name, char *timestamp, + char *tag_written); /** * Whether to set default values for files and directory permissions, gid and * uid. All these take one of three values: 0, 1 or 2. * - * If 0, the corresponding attribute will be kept as setted in the IsoNode. + * If 0, the corresponding attribute will be kept as set in the IsoNode. * Unless you have changed it, it corresponds to the value on disc, so it * is suitable for backup purposes. If set to 1, the corresponding attrib. * will be changed by a default suitable value. Finally, if you set it to diff --git a/libisofs/md5.c b/libisofs/md5.c index 3cf41d1..4037309 100644 --- a/libisofs/md5.c +++ b/libisofs/md5.c @@ -707,7 +707,7 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag) void *ctx = NULL; off_t pos = 0, line_start; int record_len, block_len, res, i; - char postext[20], md5[16], record[160]; + char postext[40], md5[16], record[160]; line_start = strlen(tag_block); iso_md5_compute(t->checksum_ctx, tag_block, line_start); @@ -721,14 +721,14 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag) sprintf(postext, "%u%9.9u", (unsigned int) (pos / 1000000000), (unsigned int) (pos % 1000000000)); else - sprintf(postext, "%u", (unsigned int) pos), - + sprintf(postext, "%u", (unsigned int) pos); sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext); record_len = strlen(record); for (i = 0; i < 16; i++) sprintf(record + record_len + 2 * i, "%2.2x", ((unsigned char *) md5)[i]); - record_len+= 32; + record_len += 32; + res = iso_md5_start(&ctx); if (res < 0) goto ex; @@ -744,6 +744,9 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag) block_len+= 32; tag_block[block_len++]= '\n'; + if (t->scdbackup_tag_written != NULL) + strncpy(t->scdbackup_tag_written, tag_block + line_start, + block_len - line_start); res = ISO_SUCCESS; ex:; if (ctx != NULL)