diff --git a/lib/driver/abs_path.c b/lib/driver/abs_path.c index adbbe1d9..4588e930 100644 --- a/lib/driver/abs_path.c +++ b/lib/driver/abs_path.c @@ -6,6 +6,7 @@ # include "config.h" # define __CDIO_CONFIG_H__ 1 #endif +#include "cdio_private.h" #ifdef HAVE_STRING_H # include diff --git a/lib/driver/cdio_private.h b/lib/driver/cdio_private.h index e75d873e..e526c448 100644 --- a/lib/driver/cdio_private.h +++ b/lib/driver/cdio_private.h @@ -1,7 +1,6 @@ /* - $Id: cdio_private.h,v 1.37 2008/04/22 15:29:11 karl Exp $ - - Copyright (C) 2003, 2004, 2005, 2008, 2009 Rocky Bernstein + Copyright (C) 2003, 2004, 2005, 2008, 2009, 2011 + Rocky Bernstein This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,6 +35,9 @@ extern "C" { #endif /* __cplusplus */ + extern const char * cdio_dirname(const char *fname); + extern const char *cdio_abspath(const char *cwd, const char *fname); + /* Opaque type */ typedef struct _CdioDataSource CdioDataSource_t; diff --git a/lib/driver/image.h b/lib/driver/image.h index 91c1eb20..9f80777b 100644 --- a/lib/driver/image.h +++ b/lib/driver/image.h @@ -53,7 +53,7 @@ typedef struct { int num_indices; flag_t flags; /**< "[NO] COPY", "4CH", "[NO] PREMPAHSIS" */ char *isrc; /**< IRSC Code (5.22.4) exactly 12 bytes */ - char *filename; + char *filename; CdioDataSource_t *data_source; off_t offset; /**< byte offset into data_start of track beginning. In cdrdao for example, one diff --git a/lib/driver/image/bincue.c b/lib/driver/image/bincue.c index 86242617..a46f91b1 100644 --- a/lib/driver/image/bincue.c +++ b/lib/driver/image/bincue.c @@ -369,7 +369,9 @@ parse_cuefile (_img_private_t *cd, const char *psz_cue_name) /* FILE "" */ } else if (0 == strcmp ("FILE", psz_keyword)) { if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { - if (cd) cd->tocent[i + 1].filename = strdup (psz_field); + const char *dirname = cdio_dirname(psz_cue_name); + const char *filename = cdio_abspath (dirname, psz_field); + if (cd) cd->tocent[i + 1].filename = (char *) filename; } else { goto format_error; } diff --git a/lib/driver/image/cdrdao.c b/lib/driver/image/cdrdao.c index c341b5a9..7e6e871f 100644 --- a/lib/driver/image/cdrdao.c +++ b/lib/driver/image/cdrdao.c @@ -682,7 +682,9 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name) /* Handle "" */ if (cd) { - cd->tocent[i].filename = strdup (psz_field); + const char *dirname = cdio_dirname(psz_cue_name); + const char *filename = cdio_abspath (dirname, psz_field); + cd->tocent[i].filename = strdup (filename); /* To do: do something about reusing existing files. */ if (!(cd->tocent[i].data_source = cdio_stdio_new (psz_field))) { cdio_log (log_level, @@ -755,7 +757,9 @@ parse_tocfile (_img_private_t *cd, const char *psz_cue_name) if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { /* Handle */ if (cd) { - cd->tocent[i].filename = strdup (psz_field); + const char *dirname = cdio_dirname(psz_cue_name); + const char *filename = cdio_abspath (dirname, psz_field); + cd->tocent[i].filename = (char *) filename; /* To do: do something about reusing existing files. */ if (!(cd->tocent[i].data_source = cdio_stdio_new (psz_field))) { cdio_log (log_level, diff --git a/lib/driver/image_common.h b/lib/driver/image_common.h index c83a06e3..8362bc6c 100644 --- a/lib/driver/image_common.h +++ b/lib/driver/image_common.h @@ -1,6 +1,4 @@ /* - $Id: image_common.h,v 1.13 2008/04/22 15:29:12 karl Exp $ - Copyright (C) 2004, 2005, 2008 Rocky Bernstein This program is free software: you can redistribute it and/or modify