Expanded new API call iso_write_opts_set_scdbackup_tag

This commit is contained in:
Thomas Schmitt 2009-09-17 16:41:54 +02:00
parent c992687200
commit 6bf538ff40
4 changed files with 32 additions and 8 deletions

View File

@ -1135,6 +1135,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
target->md5_file_checksums = opts->md5_file_checksums; target->md5_file_checksums = opts->md5_file_checksums;
target->md5_session_checksum = opts->md5_session_checksum; target->md5_session_checksum = opts->md5_session_checksum;
strcpy(target->scdbackup_tag_parm, opts->scdbackup_tag_parm); strcpy(target->scdbackup_tag_parm, opts->scdbackup_tag_parm);
target->scdbackup_tag_written = opts->scdbackup_tag_written;
target->checksum_idx_counter = 0; target->checksum_idx_counter = 0;
target->checksum_ctx = NULL; target->checksum_ctx = NULL;
target->checksum_counter = 0; target->checksum_counter = 0;
@ -1630,6 +1631,7 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile)
if (wopts == NULL) { if (wopts == NULL) {
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
} }
wopts->scdbackup_tag_written = NULL;
switch (profile) { switch (profile) {
case 0: 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, int iso_write_opts_set_scdbackup_tag(IsoWriteOpts *opts,
char *name, char *timestamp) char *name, char *timestamp,
char *tag_written)
{ {
#ifdef Libisofs_with_checksumS #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); 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 */ #endif /* Libisofs_with_checksumS */
return ISO_SUCCESS; return ISO_SUCCESS;

View File

@ -290,6 +290,13 @@ struct iso_write_opts {
* position. * position.
*/ */
char scdbackup_tag_parm[100]; 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; typedef struct ecma119_image Ecma119Image;
@ -473,7 +480,8 @@ struct ecma119_image
is submitted with ecma119_image_new() ? is submitted with ecma119_image_new() ?
*/ */
char scdbackup_tag_parm[96]; char scdbackup_tag_parm[100];
char *scdbackup_tag_written;
#endif /* Libisofs_with_checksumS */ #endif /* Libisofs_with_checksumS */

View File

@ -1459,19 +1459,25 @@ int iso_write_opts_set_record_md5(IsoWriteOpts *opts, int session, int files);
* @param timestamp * @param timestamp
* A string of 13 characters YYMMDD.hhmmss (e.g. A90831.190324). * A string of 13 characters YYMMDD.hhmmss (e.g. A90831.190324).
* A9 = 2009, B0 = 2010, B1 = 2011, ... C0 = 2020, ... * 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 * @return
* 1 indicates success, <0 is error * 1 indicates success, <0 is error
* *
* @since 0.6.24 * @since 0.6.24
*/ */
int iso_write_opts_set_scdbackup_tag(IsoWriteOpts *opts, 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 * Whether to set default values for files and directory permissions, gid and
* uid. All these take one of three values: 0, 1 or 2. * 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 * 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. * 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 * will be changed by a default suitable value. Finally, if you set it to

View File

@ -707,7 +707,7 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
void *ctx = NULL; void *ctx = NULL;
off_t pos = 0, line_start; off_t pos = 0, line_start;
int record_len, block_len, res, i; 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); line_start = strlen(tag_block);
iso_md5_compute(t->checksum_ctx, tag_block, line_start); 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), sprintf(postext, "%u%9.9u", (unsigned int) (pos / 1000000000),
(unsigned int) (pos % 1000000000)); (unsigned int) (pos % 1000000000));
else else
sprintf(postext, "%u", (unsigned int) pos), sprintf(postext, "%u", (unsigned int) pos);
sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext); sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext);
record_len = strlen(record); record_len = strlen(record);
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
sprintf(record + record_len + 2 * i, sprintf(record + record_len + 2 * i,
"%2.2x", ((unsigned char *) md5)[i]); "%2.2x", ((unsigned char *) md5)[i]);
record_len+= 32; record_len += 32;
res = iso_md5_start(&ctx); res = iso_md5_start(&ctx);
if (res < 0) if (res < 0)
goto ex; goto ex;
@ -744,6 +744,9 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
block_len+= 32; block_len+= 32;
tag_block[block_len++]= '\n'; 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; res = ISO_SUCCESS;
ex:; ex:;
if (ctx != NULL) if (ctx != NULL)