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