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