00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <sys/types.h>
00018 #include <stdlib.h>
00019 #include <stdio.h>
00020 #include <string.h>
00021 #include <errno.h>
00022 #include <unistd.h>
00023
00024 #ifndef Xorriso_standalonE
00025
00026 #include <libburn/libburn.h>
00027
00028 #include <libisofs/libisofs.h>
00029
00030 #else
00031
00032 #include "../libisofs/libisofs.h"
00033 #include "../libburn/libburn.h"
00034
00035 #endif
00036
00037
00038 #include "libisoburn.h"
00039
00040 #include "isoburn.h"
00041
00042
00043
00044
00045
00046 int (*libisoburn_default_msgs_submit)
00047 (void *handle, int error_code, char msg_text[],
00048 int os_errno, char severity[], int flag)= NULL;
00049 void *libisoburn_default_msgs_submit_handle= NULL;
00050 int libisoburn_default_msgs_submit_flag= 0;
00051
00052
00053
00054
00055
00056 int isoburn_toc_entry_new(struct isoburn_toc_entry **objpt,
00057 struct isoburn_toc_entry *boss, int flag)
00058 {
00059 struct isoburn_toc_entry *o, *s;
00060
00061 *objpt= o= (struct isoburn_toc_entry *)
00062 malloc(sizeof(struct isoburn_toc_entry));
00063 if(o==NULL) {
00064 isoburn_msgs_submit(NULL, 0x00060000,
00065 "Cannot allocate memory for isoburn toc entry",
00066 0, "FATAL", 0);
00067 return(-1);
00068 }
00069 o->session= 0;
00070 o->track_no= 0;
00071 o->start_lba= -1;
00072 o->track_blocks= 0;
00073 o->volid= NULL;
00074 o->next= NULL;
00075 if(boss!=NULL) {
00076 for(s= boss; s->next!=NULL; s= s->next);
00077 s->next= o;
00078 }
00079 return(1);
00080 }
00081
00082
00083
00084
00085 int isoburn_toc_entry_destroy(struct isoburn_toc_entry **o, int flag)
00086 {
00087 if(*o==NULL)
00088 return(0);
00089 if(flag&1)
00090 isoburn_toc_entry_destroy(&((*o)->next), flag);
00091 if((*o)->volid != NULL)
00092 free((*o)->volid);
00093 free((char *) (*o));
00094 *o= NULL;
00095 return(1);
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 struct isoburn *isoburn_list_start= NULL;
00109
00110
00111 int isoburn_new(struct isoburn **objpt, int flag)
00112 {
00113 struct isoburn *o;
00114 int i, ret;
00115
00116 *objpt= o= (struct isoburn *) malloc(sizeof(struct isoburn));
00117 if(o==NULL) {
00118 isoburn_msgs_submit(NULL, 0x00060000,
00119 "Cannot allocate memory for isoburn control object",
00120 0, "FATAL", 0);
00121 return(-1);
00122 }
00123
00124 o->drive= NULL;
00125 o->emulation_mode= 0;
00126 o->fabricated_msc1= -1;
00127 o->fabricated_msc2= -1;
00128 o->zero_nwa= Libisoburn_overwriteable_starT;
00129 o->min_start_byte= o->zero_nwa * 2048;
00130 o->nwa= o->zero_nwa;
00131 o->truncate= 0;
00132 o->iso_source= NULL;
00133 o->fabricated_disc_status= BURN_DISC_UNREADY;
00134 o->toc= NULL;
00135 o->wrote_well= -1;
00136 for(i=0;i<Libisoburn_target_head_sizE;i++)
00137 o->target_iso_head[i]= 0;
00138 o->image= NULL;
00139 o->iso_data_source= NULL;
00140 o->read_pacifier= NULL;
00141 o->read_pacifier_handle= NULL;
00142 o->msgs_submit= NULL;
00143 o->msgs_submit_handle= NULL;
00144 o->msgs_submit_flag= 0;
00145 o->prev= NULL;
00146 o->next= NULL;
00147 ret= iso_image_new("ISOIMAGE", &o->image);
00148 if(ret<0) {
00149 isoburn_report_iso_error(ret, "Cannot create image", 0, "FATAL", 0);
00150 goto failed;
00151 }
00152 isoburn_link(o, isoburn_list_start, 1);
00153 return(1);
00154 failed:;
00155 isoburn_destroy(objpt, 0);
00156 return(-1);
00157 }
00158
00159
00160 int isoburn_destroy(struct isoburn **objpt, int flag)
00161 {
00162 struct isoburn *o;
00163
00164 o= *objpt;
00165 if(o==NULL)
00166 return(0);
00167
00168
00169
00170 if(o==isoburn_list_start)
00171 isoburn_list_start= o->next;
00172 if(o->prev!=NULL)
00173 o->prev->next= o->next;
00174 if(o->next!=NULL)
00175 o->next->prev= o->prev;
00176
00177
00178
00179 if(o->image!=NULL)
00180 iso_image_unref(o->image);
00181 if(o->toc!=NULL)
00182 isoburn_toc_entry_destroy(&(o->toc), 1);
00183 if(o->iso_source!=NULL)
00184 burn_source_free(o->iso_source);
00185 if(o->iso_data_source!=NULL)
00186 iso_data_source_unref(o->iso_data_source);
00187 free((char *) o);
00188 *objpt= NULL;
00189 return(1);
00190 }
00191
00192
00193 int isoburn_destroy_all(struct isoburn **objpt, int flag)
00194 {
00195 struct isoburn *o,*n;
00196
00197 o= *objpt;
00198 if(o==NULL)
00199 return(0);
00200 for(;o->prev!=NULL;o= o->prev);
00201 for(;o!=NULL;o= n) {
00202 n= o->next;
00203 isoburn_destroy(&o,0);
00204 }
00205 *objpt= NULL;
00206 return(1);
00207 }
00208
00209
00210 int isoburn_get_target_image(struct isoburn *o, IsoImage **pt, int flag)
00211 {
00212 *pt= o->image;
00213 return(1);
00214 }
00215
00216
00217 int isoburn_get_prev(struct isoburn *o, struct isoburn **pt, int flag)
00218 {
00219 *pt= o->prev;
00220 return(1);
00221 }
00222
00223
00224 int isoburn_get_next(struct isoburn *o, struct isoburn **pt, int flag)
00225 {
00226 *pt= o->next;
00227 return(1);
00228 }
00229
00230
00231 int isoburn_link(struct isoburn *o, struct isoburn *link, int flag)
00232
00233
00234
00235 {
00236
00237
00238
00239 if(isoburn_list_start==NULL ||
00240 (isoburn_list_start==link && (flag&1)))
00241 isoburn_list_start= o;
00242 if(o->prev!=NULL)
00243 o->prev->next= o->next;
00244 if(o->next!=NULL)
00245 o->next->prev= o->prev;
00246 o->prev= o->next= NULL;
00247 if(link==NULL)
00248 return(1);
00249 if(flag&1) {
00250 o->next= link;
00251 o->prev= link->prev;
00252 if(o->prev!=NULL)
00253 o->prev->next= o;
00254 link->prev= o;
00255 } else {
00256 o->prev= link;
00257 o->next= link->next;
00258 if(o->next!=NULL)
00259 o->next->prev= o;
00260 link->next= o;
00261 }
00262
00263
00264
00265 return(1);
00266 }
00267
00268
00269 int isoburn_count(struct isoburn *o, int flag)
00270
00271 {
00272 int counter= 0;
00273
00274 if(flag&2)
00275 for(;o->prev!=NULL;o= o->prev);
00276 for(;o!=NULL;o= o->next)
00277 counter++;
00278 return(counter);
00279 }
00280
00281
00282 int isoburn_by_idx(struct isoburn *o, int idx, struct isoburn **pt, int flag)
00283
00284
00285 {
00286 int i,abs_idx;
00287 struct isoburn *npt;
00288
00289 if(flag&2)
00290 for(;o->prev!=NULL;o= o->prev);
00291 abs_idx= (idx>0?idx:-idx);
00292 *pt= o;
00293 for(i= 0;(i<abs_idx || (flag&1)) && *pt!=NULL;i++) {
00294 if(idx>0)
00295 npt= o->next;
00296 else
00297 npt= o->prev;
00298 if(npt==NULL && (flag&1))
00299 break;
00300 *pt= npt;
00301 }
00302 return(*pt!=NULL);
00303 }
00304
00305
00306 int isoburn_find_by_drive(struct isoburn **pt, struct burn_drive *d, int flag)
00307 {
00308 struct isoburn *o;
00309
00310 *pt= NULL;
00311 for(o= isoburn_list_start;o!=NULL;o= o->next)
00312 if(o->drive==d) {
00313 *pt= o;
00314 return(1);
00315 }
00316 return(0);
00317 }
00318
00319
00320 int isoburn_msgs_submit(struct isoburn *o, int error_code, char msg_text[],
00321 int os_errno, char severity[], int flag)
00322 {
00323 int ret, use_drive_method= 0;
00324
00325 if(o!=NULL)
00326 if(o->msgs_submit!=NULL)
00327 use_drive_method= 1;
00328 if(use_drive_method) {
00329 ret= o->msgs_submit(o->msgs_submit_handle, error_code, msg_text, os_errno,
00330 severity, o->msgs_submit_flag);
00331 return(ret);
00332 }
00333 if(libisoburn_default_msgs_submit != NULL) {
00334 ret= libisoburn_default_msgs_submit(libisoburn_default_msgs_submit_handle,
00335 error_code, msg_text, os_errno, severity,
00336 libisoburn_default_msgs_submit_flag);
00337 return(ret);
00338 }
00339
00340 burn_msgs_submit(error_code, msg_text, os_errno, severity, NULL);
00341 return(1);
00342 }
00343
00344
00345
00346
00347
00348
00349 static
00350 int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
00351 struct burn_disc **disc,
00352 struct isoburn_imgen_opts *opts, int flag)
00353 {
00354 struct burn_source *wsrc;
00355 struct burn_session *session;
00356 struct burn_track *track;
00357 struct isoburn *in_o, *out_o;
00358 IsoWriteOpts *wopts= NULL;
00359 enum burn_disc_status state;
00360 int ret, fifo_chunks, lba, nwa, i, new_img, early_indev_release;
00361 uint32_t data_start= -1;
00362 size_t buffer_size= 0, buffer_free= 0;
00363 char msg[160];
00364
00365 new_img= flag&1;
00366 early_indev_release= flag&2;
00367
00368 ret= isoburn_find_emulator(&in_o, in_d, 0);
00369 if(ret<0 || in_o==NULL)
00370 {ret= -1; goto ex;}
00371 ret= isoburn_find_emulator(&out_o, out_d, 0);
00372 if(ret<0 || out_o==NULL)
00373 {ret= -1; goto ex;}
00374
00375 in_o->wrote_well= out_o->wrote_well= 0;
00376
00377 if(new_img && early_indev_release) {
00378 isoburn_msgs_submit(in_o, 0x00060000,
00379 "Programming error: Wrong session setup: new_img && early_indev_release",
00380 0, "FATAL", 0);
00381 {ret= -4; goto ex;}
00382 }
00383
00384 state = isoburn_disc_get_status(in_d);
00385 if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE &&
00386 state != BURN_DISC_FULL) {
00387 isoburn_msgs_submit(in_o, 0x00060000, "Unsuitable source media state",
00388 0, "FAILURE", 0);
00389 {ret= -2; goto ex;}
00390 }
00391 state = isoburn_disc_get_status(out_d);
00392 if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE) {
00393 isoburn_msgs_submit(out_o, 0x00060000, "Unsuitable target media state",
00394 0, "FAILURE", 0);
00395 {ret= -2; goto ex;}
00396 }
00397
00398 fifo_chunks= 32;
00399 if(opts->fifo_size >= 64*1024 && opts->fifo_size <= 1024.0 * 1024.0 * 1024.0){
00400 fifo_chunks= opts->fifo_size/2048;
00401 if(fifo_chunks*2048 < opts->fifo_size)
00402 fifo_chunks++;
00403 }
00404
00405 ret = iso_write_opts_new(&wopts, 0);
00406 if (ret < 0) {
00407 isoburn_report_iso_error(ret, "Cannot create iso_write_opts", 0, "FATAL",0);
00408 goto ex;
00409 }
00410 iso_write_opts_set_iso_level(wopts, opts->level);
00411 iso_write_opts_set_rockridge(wopts, opts->rockridge);
00412 iso_write_opts_set_joliet(wopts, opts->joliet);
00413 iso_write_opts_set_iso1999(wopts, opts->iso1999);
00414
00415
00416 #ifdef Libisofs_hardlink_prooF
00417
00418 iso_write_opts_set_hardlinks(wopts, opts->hardlinks);
00419 if(opts->hardlinks)
00420 iso_write_opts_set_rrip_1_10_px_ino(wopts, 1);
00421
00422 #endif
00423
00424 iso_write_opts_set_aaip(wopts, opts->aaip);
00425 iso_write_opts_set_omit_version_numbers(wopts, opts->omit_version_numbers);
00426 iso_write_opts_set_allow_deep_paths(wopts, opts->allow_deep_paths);
00427 iso_write_opts_set_allow_longer_paths(wopts, opts->allow_longer_paths);
00428 iso_write_opts_set_max_37_char_filenames(wopts, opts->max_37_char_filenames);
00429 iso_write_opts_set_no_force_dots(wopts, opts->no_force_dots);
00430 iso_write_opts_set_allow_lowercase(wopts, opts->allow_lowercase);
00431 iso_write_opts_set_allow_full_ascii(wopts, opts->allow_full_ascii);
00432 iso_write_opts_set_relaxed_vol_atts(wopts, 1);
00433 iso_write_opts_set_joliet_longer_paths(wopts, opts->joliet_longer_paths);
00434 iso_write_opts_set_always_gmt(wopts, opts->always_gmt);
00435 iso_write_opts_set_rrip_version_1_10(wopts, opts->rrip_version_1_10);
00436 iso_write_opts_set_dir_rec_mtime(wopts, opts->dir_rec_mtime);
00437 iso_write_opts_set_aaip_susp_1_10(wopts, opts->aaip_susp_1_10);
00438 iso_write_opts_set_sort_files(wopts, opts->sort_files);
00439 iso_write_opts_set_record_md5(wopts, opts->session_md5, opts->file_md5 & 3);
00440 if(opts->scdbackup_tag_name[0] && opts->scdbackup_tag_time[0])
00441 iso_write_opts_set_scdbackup_tag(wopts, opts->scdbackup_tag_name,
00442 opts->scdbackup_tag_time,
00443 opts->scdbackup_tag_written);
00444 iso_write_opts_set_replace_mode(wopts, opts->replace_dir_mode,
00445 opts->replace_file_mode, opts->replace_uid, opts->replace_gid);
00446 iso_write_opts_set_default_dir_mode(wopts, opts->dir_mode);
00447 iso_write_opts_set_default_file_mode(wopts, opts->file_mode);
00448 iso_write_opts_set_default_uid(wopts, opts->uid);
00449 iso_write_opts_set_default_gid(wopts, opts->gid);
00450 iso_write_opts_set_output_charset(wopts, opts->output_charset);
00451 iso_write_opts_set_fifo_size(wopts, fifo_chunks);
00452 ret = iso_write_opts_set_system_area(wopts, opts->system_area_data,
00453 opts->system_area_options, 0);
00454 if (ret < 0) {
00455 isoburn_report_iso_error(ret, "Cannot set content of System Area",
00456 0, "FAILURE", 0);
00457 {ret= -1; goto ex;}
00458 }
00459 iso_write_opts_set_pvd_times(wopts,
00460 opts->vol_creation_time, opts->vol_modification_time,
00461 opts->vol_expiration_time, opts->vol_effective_time,
00462 opts->vol_uuid);
00463
00464 ret = isoburn_disc_track_lba_nwa(out_d, NULL, 0, &lba, &nwa);
00465 opts->effective_lba= nwa;
00466 ret= isoburn_get_msc2(out_o, NULL, &nwa, 0);
00467 if (ret != 1) {
00468 isoburn_msgs_submit(out_o, 0x00060000,
00469 "Cannot determine next writeable address", 0, "FAILURE", 0);
00470 {ret= -3; goto ex;}
00471 }
00472 iso_write_opts_set_ms_block(wopts, nwa);
00473 iso_write_opts_set_appendable(wopts, !new_img);
00474 iso_write_opts_set_overwrite_buf(wopts,
00475 nwa>0 ? out_o->target_iso_head : NULL);
00476
00477 ret = iso_image_create_burn_source(in_o->image, wopts, &wsrc);
00478 if (ret < 0) {
00479 isoburn_report_iso_error(ret, "Cannot create burn source", 0, "FAILURE", 0);
00480 {ret= -1; goto ex;}
00481 }
00482 if (early_indev_release) {
00483 for(i= 0; i<300; i++) {
00484
00485
00486 if((i%30) == 0) {
00487 sprintf(msg, "Waiting for data in fifo since %d seconds", i/30);
00488 isoburn_msgs_submit(in_o, 0x00060000, msg, 0, "DEBUG", 0);
00489 }
00490
00491 usleep(100000);
00492 ret= iso_ring_buffer_get_status(wsrc, &buffer_size, &buffer_free);
00493 if(ret >0 && buffer_size != buffer_free)
00494 break;
00495 }
00496
00497
00498 sprintf(msg,
00499 "After %.1f seconds: %d bytes of output available (fifo state=%d)",
00500 ((double) i+1) / 10.0, (int) (buffer_size - buffer_free), ret);
00501 isoburn_msgs_submit(in_o, 0x00060000, msg, 0, "DEBUG", 0);
00502
00503 if(in_o->iso_data_source!=NULL)
00504 isoburn_data_source_shutdown(in_o->iso_data_source, 0);
00505 }
00506
00507 ret= iso_write_opts_get_data_start(wopts, &data_start, 0);
00508 opts->data_start_lba= -1;
00509 if(ret > 0 && data_start <= 0x7FFFFFFF)
00510 opts->data_start_lba= data_start;
00511
00512
00513
00514 out_o->iso_source= wsrc;
00515
00516 *disc = burn_disc_create();
00517 session = burn_session_create();
00518 burn_disc_add_session(*disc, session, BURN_POS_END);
00519 track = burn_track_create();
00520 burn_track_set_source(track, out_o->iso_source);
00521 burn_session_add_track(session, track, BURN_POS_END);
00522
00523
00524 burn_track_free(track);
00525 burn_session_free(session);
00526
00527 in_o->wrote_well= out_o->wrote_well= -1;
00528 ret= 1;
00529 ex:
00530 if(wopts!=NULL)
00531 {iso_write_opts_free(wopts); wopts= NULL;}
00532 return ret;
00533 }
00534
00535
00536 int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc,
00537 struct isoburn_imgen_opts *opts)
00538 {
00539 return isoburn_prepare_disc_aux(d, d, disc, opts, 0);
00540 }
00541
00542
00543 int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
00544 struct isoburn_imgen_opts *opts,
00545 struct burn_drive *out_drive)
00546 {
00547 int ret;
00548
00549 ret= isoburn_prepare_disc_aux(d, out_drive, disc, opts, 1);
00550 if (ret<=0)
00551 return ret;
00552 return 1;
00553 }
00554
00555
00556
00557 int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
00558 struct isoburn_imgen_opts *opts,
00559 struct burn_drive *out_drive, int nwa)
00560 {
00561 int ret;
00562 struct isoburn *o= NULL;
00563
00564 ret= isoburn_find_emulator(&o, out_drive, 0);
00565 if(ret<0 || o==NULL)
00566 return(-1);
00567 if(nwa >= 0)
00568 o->fabricated_msc2= nwa;
00569 if(o->nwa == o->zero_nwa)
00570 o->nwa= o->zero_nwa= 0;
00571 else
00572 o->zero_nwa= 0;
00573 ret= isoburn_prepare_disc_aux(d, out_drive, disc, opts, 2);
00574 if (ret<=0)
00575 return ret;
00576 return(1);
00577 }
00578
00579
00580
00581
00582
00583
00584 int isoburn_cancel_prepared_write(struct burn_drive *d,
00585 struct burn_drive *output_drive, int flag)
00586 {
00587 int ret;
00588 struct isoburn *o= NULL;
00589
00590 if(output_drive!=NULL) {
00591 ret= isoburn_find_emulator(&o, output_drive, 0);
00592 if(ret<0 || o==NULL)
00593 o= NULL;
00594 else if(o->iso_source==NULL)
00595 o= NULL;
00596 }
00597 if(o==NULL) {
00598 ret= isoburn_find_emulator(&o, d, 0);
00599 if(ret<0)
00600 return(-1);
00601 if(o==NULL)
00602 return(0);
00603 if(o->iso_source==NULL)
00604 return(0);
00605 }
00606 if(o->iso_source->read!=NULL)
00607 return(0);
00608 if(o->iso_source->version<1)
00609 return(0);
00610 o->iso_source->cancel(o->iso_source);
00611 burn_source_free(o->iso_source);
00612 o->iso_source= NULL;
00613 return(1);
00614 }
00615
00616
00617
00618 int isoburn_sync_after_write(struct burn_drive *d,
00619 struct burn_drive *output_drive, int flag)
00620 {
00621 return isoburn_cancel_prepared_write(d, output_drive, 1);
00622 }
00623
00624
00625 void isoburn_version(int *major, int *minor, int *micro)
00626 {
00627 *major= isoburn_header_version_major;
00628 *minor= isoburn_header_version_minor;
00629 *micro= isoburn_header_version_micro;
00630
00631
00632
00633
00634
00635
00636
00637
00638 }
00639
00640
00641 int isoburn_is_compatible(int major, int minor, int micro, int flag)
00642 {
00643 int own_major, own_minor, own_micro;
00644
00645 isoburn_version(&own_major, &own_minor, &own_micro);
00646 return(own_major > major ||
00647 (own_major == major && (own_minor > minor ||
00648 (own_minor == minor && own_micro >= micro))));
00649 }
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 int isoburn_ropt_new(struct isoburn_read_opts **new_o, int flag)
00660 {
00661 struct isoburn_read_opts *o;
00662
00663 o= (*new_o)= calloc(1, sizeof(struct isoburn_read_opts));
00664 if(o==NULL) {
00665 isoburn_msgs_submit(NULL, 0x00060000,
00666 "Cannot allocate memory for read options", 0, "FATAL", 0);
00667 return(-1);
00668 }
00669 o->norock= 0;
00670 o->nojoliet= 0;
00671 o->noiso1999= 1;
00672 o->noaaip= 1;
00673 o->noacl= 1;
00674 o->noea= 1;
00675 o->noino= 1;
00676 o->nomd5= 1;
00677 o->preferjoliet= 0;
00678 o->uid= geteuid();
00679 o->gid= getegid();
00680 o->mode= 0444;
00681 o->dirmode= 0555;
00682 o->input_charset= NULL;
00683 o->hasRR= 0;
00684 o->hasJoliet= 0;
00685 o->hasIso1999= 0;
00686 o->hasElTorito= 0;
00687 o->size= 0;
00688 o->pretend_blank= 1;
00689 return(1);
00690 }
00691
00692
00693 int isoburn_ropt_destroy(struct isoburn_read_opts **o, int flag)
00694 {
00695 if(*o==NULL)
00696 return(0);
00697 free(*o);
00698 *o= NULL;
00699 return(1);
00700 }
00701
00702
00703 int isoburn_ropt_set_extensions(struct isoburn_read_opts *o, int ext)
00704 {
00705 o->norock= !!(ext&1);
00706 o->nojoliet= !!(ext&2);
00707 o->noiso1999= !!(ext&4);
00708 o->preferjoliet= !!(ext&8);
00709 o->pretend_blank= !!(ext&16);
00710 o->noaaip= !!(ext & 32);
00711 o->noacl= !!(ext & 64);
00712 o->noea= !!(ext & 128);
00713 o->noino= !!(ext & 256);
00714 o->nomd5= !!(ext & 512);
00715 return(1);
00716 }
00717
00718
00719 int isoburn_ropt_get_extensions(struct isoburn_read_opts *o, int *ext)
00720 {
00721 *ext= (!!o->norock) | ((!!o->nojoliet)<<1) | ((!!o->noiso1999)<<2) |
00722 ((!!o->preferjoliet)<<3) | ((!!o->pretend_blank)<<4) |
00723 ((!!o->noaaip) << 5) | ((!!o->noacl) << 6) | ((!!o->noea) << 7) |
00724 ((!!o->noino) << 8) | ((!!o->nomd5) << 9);
00725 return(1);
00726 }
00727
00728
00729 int isoburn_ropt_set_default_perms(struct isoburn_read_opts *o,
00730 uid_t uid, gid_t gid, mode_t mode)
00731 {
00732 mode_t dirmode;
00733
00734 o->uid= uid;
00735 o->gid= gid;
00736 o->mode= mode;
00737 dirmode= mode;
00738 if(dirmode & S_IRUSR)
00739 dirmode|= S_IXUSR;
00740 if(dirmode & S_IRGRP)
00741 dirmode|= S_IXGRP;
00742 if(dirmode & S_IROTH)
00743 dirmode|= S_IXOTH;
00744 o->dirmode= dirmode;
00745 return(1);
00746 }
00747
00748
00749 int isoburn_ropt_get_default_perms(struct isoburn_read_opts *o,
00750 uid_t *uid, gid_t *gid, mode_t *mode)
00751 {
00752 *uid= o->uid;
00753 *gid= o->gid;
00754 *mode= o->mode;
00755 return(1);
00756 }
00757
00758
00759 int isoburn_ropt_set_default_dirperms(struct isoburn_read_opts *o,
00760 mode_t mode)
00761 {
00762 o->dirmode= mode;
00763 return(1);
00764 }
00765
00766
00767 int isoburn_ropt_get_default_dirperms(struct isoburn_read_opts *o,
00768 mode_t *mode)
00769 {
00770 *mode= o->dirmode;
00771 return(1);
00772 }
00773
00774
00775 int isoburn_ropt_set_input_charset(struct isoburn_read_opts *o,
00776 char *input_charset)
00777 {
00778 o->input_charset= input_charset;
00779 return(1);
00780 }
00781
00782
00783 int isoburn_ropt_get_input_charset(struct isoburn_read_opts *o,
00784 char **input_charset)
00785 {
00786 *input_charset= o->input_charset;
00787 return(1);
00788 }
00789
00790
00791 int isoburn_ropt_set_auto_incharset(struct isoburn_read_opts *o, int mode)
00792 {
00793 o->auto_input_charset= mode & 1;
00794 return(1);
00795 }
00796
00797
00798 int isoburn_ropt_get_auto_incharset(struct isoburn_read_opts *o, int *mode)
00799 {
00800 *mode= o->auto_input_charset;
00801 return(1);
00802 }
00803
00804
00805 int isoburn_ropt_get_size_what(struct isoburn_read_opts *o,
00806 uint32_t *size, int *has_what)
00807 {
00808 *size= o->size;
00809 *has_what= (!!o->hasRR) | ((!!o->hasJoliet)<<1) |
00810 ((!!o->hasIso1999)<<2) | ((!!o->hasElTorito)<<3);
00811 return(1);
00812 }
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822 int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
00823 {
00824 struct isoburn_imgen_opts *o;
00825
00826 o= (*new_o)= calloc(1, sizeof(struct isoburn_imgen_opts));
00827 if(o==NULL) {
00828 isoburn_msgs_submit(NULL, 0x00060000,
00829 "Cannot allocate memory for image generation options",
00830 0, "FATAL", 0);
00831 return(-1);
00832 }
00833 o->level= 2;
00834 o->rockridge= 1;
00835 o->joliet= 0;
00836 o->iso1999= 0;
00837 o->hardlinks= 0;
00838 o->aaip = 0;
00839 o->omit_version_numbers= 0;
00840 o->allow_deep_paths= 1;
00841 o->allow_longer_paths= 0;
00842 o->max_37_char_filenames= 0;
00843 o->no_force_dots= 0;
00844 o->allow_lowercase= 0;
00845 o->allow_full_ascii= 0;
00846 o->joliet_longer_paths= 0;
00847 o->always_gmt= 0;
00848 o->rrip_version_1_10= 0;
00849 o->dir_rec_mtime= 0;
00850 o->aaip_susp_1_10= 0;
00851 o->sort_files= 0;
00852 o->replace_dir_mode= 0;
00853 o->replace_file_mode= 0;
00854 o->replace_uid= 0;
00855 o->replace_gid= 0;
00856 o->dir_mode= 0555;
00857 o->file_mode= 0444;
00858 o->uid= 0;
00859 o->gid= 0;
00860 o->output_charset= NULL;
00861 o->fifo_size= 4*1024*1024;
00862 o->effective_lba= -1;
00863 o->data_start_lba= -1;
00864 o->system_area_data= NULL;
00865 o->system_area_options= 0;
00866 o->vol_creation_time= 0;
00867 o->vol_modification_time= 0;
00868 o->vol_expiration_time= 0;
00869 o->vol_effective_time= 0;
00870 return(1);
00871 }
00872
00873
00874 int isoburn_igopt_destroy(struct isoburn_imgen_opts **o, int flag)
00875 {
00876 if(*o==NULL)
00877 return(0);
00878 free(*o);
00879 *o= NULL;
00880 return(1);
00881 }
00882
00883
00884 int isoburn_igopt_set_level(struct isoburn_imgen_opts *o, int level)
00885 {
00886 o->level= level;
00887 return(1);
00888 }
00889
00890
00891 int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level)
00892 {
00893 *level= o->level;
00894 return(1);
00895 }
00896
00897
00898 int isoburn_igopt_set_extensions(struct isoburn_imgen_opts *o, int ext)
00899 {
00900 o->rockridge= !!(ext&1);
00901 o->joliet= !!(ext&2);
00902 o->iso1999= !!(ext&4);
00903 o->hardlinks= !!(ext & 8);
00904 o->aaip= !!(ext & 32);
00905 o->session_md5= !!(ext & 64);
00906 o->file_md5= (ext & (128 | 256)) >> 7;
00907 return(1);
00908 }
00909
00910
00911 int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext)
00912 {
00913 *ext= (!!o->rockridge) | ((!!o->joliet)<<1) | ((!!o->iso1999)<<2) |
00914 ((!!o->hardlinks) << 3) | ((!!o->aaip) << 5) |
00915 ((!!o->session_md5) << 6) | ((o->file_md5 & 3) << 7);
00916 return(1);
00917 }
00918
00919
00920 int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax)
00921 {
00922 o->omit_version_numbers= (!!(relax&1)) |
00923 (2 * !!(relax & isoburn_igopt_only_iso_versions));
00924 o->allow_deep_paths= !!(relax&2);
00925 o->allow_longer_paths= !!(relax&4);
00926 o->max_37_char_filenames= !!(relax&8);
00927 o->no_force_dots= (!!(relax&16)) |
00928 (2 * !!(relax & isoburn_igopt_no_j_force_dots));
00929 o->allow_lowercase= !!(relax&32);
00930 o->allow_full_ascii= !!(relax&64);
00931 o->joliet_longer_paths= !!(relax&128);
00932 o->always_gmt= !!(relax & isoburn_igopt_always_gmt);
00933 o->rrip_version_1_10= !!(relax & isoburn_igopt_rrip_version_1_10);
00934 o->dir_rec_mtime= !!(relax & isoburn_igopt_dir_rec_mtime);
00935 o->aaip_susp_1_10= !!(relax & isoburn_igopt_aaip_susp_1_10);
00936 return(1);
00937 }
00938
00939
00940 int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax)
00941 {
00942 *relax= (!!o->omit_version_numbers) | ((!!o->allow_deep_paths)<<1) |
00943 ((!!o->allow_longer_paths)<<2) | ((!!o->max_37_char_filenames)<<3) |
00944 ((!!o->no_force_dots)<<4) | ((!!o->allow_lowercase)<<5) |
00945 ((!!o->allow_full_ascii)<<6) | ((!!o->joliet_longer_paths)<<7) |
00946 ((!!o->always_gmt)<<8) | ((!!o->rrip_version_1_10)<<9) |
00947 ((!!o->dir_rec_mtime)<<10) | ((!!o->aaip_susp_1_10)<<11);
00948 return(1);
00949 }
00950
00951
00952 int isoburn_igopt_set_sort_files(struct isoburn_imgen_opts *o, int value)
00953 {
00954 o->sort_files= !!(value&1);
00955 return(1);
00956 }
00957
00958
00959 int isoburn_igopt_get_sort_files(struct isoburn_imgen_opts *o, int *value)
00960 {
00961 *value= !!o->sort_files;
00962 return(1);
00963 }
00964
00965
00966 int isoburn_igopt_set_over_mode(struct isoburn_imgen_opts *o,
00967 int replace_dir_mode, int replace_file_mode,
00968 mode_t dir_mode, mode_t file_mode)
00969 {
00970 o->replace_dir_mode= replace_dir_mode%3;
00971 o->replace_file_mode= replace_file_mode%3;
00972 o->dir_mode= dir_mode;
00973 o->file_mode= file_mode;
00974 return(1);
00975 }
00976
00977
00978 int isoburn_igopt_get_over_mode(struct isoburn_imgen_opts *o,
00979 int *replace_dir_mode, int *replace_file_mode,
00980 mode_t *dir_mode, mode_t *file_mode)
00981 {
00982 *replace_dir_mode= o->replace_dir_mode%3;
00983 *replace_file_mode= o->replace_file_mode%3;
00984 *dir_mode= o->dir_mode;
00985 *file_mode= o->file_mode;
00986 return(1);
00987 }
00988
00989
00990 int isoburn_igopt_set_over_ugid(struct isoburn_imgen_opts *o,
00991 int replace_uid, int replace_gid,
00992 uid_t uid, gid_t gid)
00993 {
00994 o->replace_uid= replace_uid%3;
00995 o->replace_gid= replace_gid%3;
00996 o->uid= uid;
00997 o->gid= gid;
00998 return(1);
00999 }
01000
01001 int isoburn_igopt_get_over_ugid(struct isoburn_imgen_opts *o,
01002 int *replace_uid, int *replace_gid,
01003 uid_t *uid, gid_t *gid)
01004 {
01005 *replace_uid= o->replace_uid%3;
01006 *replace_gid= o->replace_gid%3;
01007 *uid= o->uid;
01008 *gid= o->gid;
01009 return(1);
01010 }
01011
01012
01013 int isoburn_igopt_set_out_charset(struct isoburn_imgen_opts *o,
01014 char *output_charset)
01015 {
01016 o->output_charset= output_charset;
01017 return(1);
01018 }
01019
01020
01021 int isoburn_igopt_get_out_charset(struct isoburn_imgen_opts *o,
01022 char **output_charset)
01023 {
01024 *output_charset= o->output_charset;
01025 return(1);
01026 }
01027
01028
01029 int isoburn_igopt_set_fifo_size(struct isoburn_imgen_opts *o, int fifo_size)
01030 {
01031 o->fifo_size= fifo_size;
01032 return(1);
01033 }
01034
01035
01036 int isoburn_igopt_get_fifo_size(struct isoburn_imgen_opts *o, int *fifo_size)
01037 {
01038 *fifo_size= o->fifo_size;
01039 return(1);
01040 }
01041
01042
01043 int isoburn_igopt_get_effective_lba(struct isoburn_imgen_opts *o, int *lba)
01044 {
01045 *lba= o->effective_lba;
01046 return(1);
01047 }
01048
01049
01050 int isoburn_igopt_get_data_start(struct isoburn_imgen_opts *o, int *lba)
01051 {
01052 *lba= o->data_start_lba;
01053 return(1);
01054 }
01055
01056
01057 int isoburn_igopt_set_scdbackup_tag(struct isoburn_imgen_opts *o, char *name,
01058 char *timestamp, char *tag_written)
01059 {
01060 strncpy(o->scdbackup_tag_name, name, 80);
01061 o->scdbackup_tag_name[80]= 0;
01062 strncpy(o->scdbackup_tag_time, timestamp, 18);
01063 o->scdbackup_tag_time[18]= 0;
01064 o->scdbackup_tag_written = tag_written;
01065 if(tag_written != NULL)
01066 tag_written[0]= 0;
01067 return(1);
01068 }
01069
01070
01071 int isoburn_igopt_get_scdbackup_tag(struct isoburn_imgen_opts *o,
01072 char name[81], char timestamp[19],
01073 char **tag_written)
01074 {
01075 strncpy(name, o->scdbackup_tag_name, 80);
01076 name[80]= 0;
01077 strncpy(timestamp, o->scdbackup_tag_time, 18);
01078 timestamp[18]= 0;
01079 *tag_written= o->scdbackup_tag_written;
01080 return(1);
01081 }
01082
01083
01084 int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *opts,
01085 char data[32768], int options)
01086 {
01087 if (data == NULL) {
01088 if (opts->system_area_data != NULL)
01089 free(opts->system_area_data);
01090 opts->system_area_data = NULL;
01091 } else {
01092 if (opts->system_area_data == NULL) {
01093 opts->system_area_data = calloc(32768, 1);
01094 if (opts->system_area_data == NULL)
01095 return(-1);
01096 }
01097 memcpy(opts->system_area_data, data, 32768);
01098 }
01099 opts->system_area_options = options & 3;
01100 return(1);
01101 }
01102
01103
01104 int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *opts,
01105 char data[32768], int *options)
01106 {
01107 *options= opts->system_area_options;
01108 if(opts->system_area_data == NULL)
01109 return(0);
01110 memcpy(data, opts->system_area_data, 32768);
01111 return(1);
01112 }
01113
01114
01115 int isoburn_igopt_set_pvd_times(struct isoburn_imgen_opts *opts,
01116 time_t vol_creation_time, time_t vol_modification_time,
01117 time_t vol_expiration_time, time_t vol_effective_time,
01118 char *vol_uuid)
01119 {
01120 opts->vol_creation_time = vol_creation_time;
01121 opts->vol_modification_time = vol_modification_time;
01122 opts->vol_expiration_time = vol_expiration_time;
01123 opts->vol_effective_time = vol_effective_time;
01124 strncpy(opts->vol_uuid, vol_uuid, 16);
01125 opts->vol_uuid[16] = 0;
01126 return(1);
01127 }
01128
01129
01130 int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
01131 time_t *vol_creation_time, time_t *vol_modification_time,
01132 time_t *vol_expiration_time, time_t *vol_effective_time,
01133 char vol_uuid[17])
01134 {
01135 *vol_creation_time = opts->vol_creation_time;
01136 *vol_modification_time = opts->vol_modification_time;
01137 *vol_expiration_time = opts->vol_expiration_time;
01138 *vol_effective_time = opts->vol_effective_time;
01139 strcpy(vol_uuid, opts->vol_uuid);
01140 return(1);
01141 }
01142
01143