iso9660_fs.c: remove some bugs in freeing here.

isolsn.c: Add a sample program for showing the path for given LSN.
This commit is contained in:
rocky
2007-08-12 00:56:09 +00:00
parent de2c6a18ae
commit 2a01d008fc
5 changed files with 133 additions and 80 deletions

View File

@@ -1,4 +1,4 @@
# $Id: Makefile.am,v 1.39 2006/10/21 10:55:18 gmerlin Exp $ # $Id: Makefile.am,v 1.40 2007/08/12 00:56:09 rocky Exp $
# #
# Copyright (C) 2003, 2004, 2005, 2006 # Copyright (C) 2003, 2004, 2005, 2006
# Rocky Bernstein <rocky@cpan.org> # Rocky Bernstein <rocky@cpan.org>
@@ -28,7 +28,7 @@ if BUILD_CD_PARANOIA
paranoia_progs = paranoia paranoia2 paranoia_progs = paranoia paranoia2
endif endif
noinst_PROGRAMS = audio cdchange cdtext device drives eject \ noinst_PROGRAMS = audio cdchange cdtext device drives eject \
isofile isofile2 isofuzzy isolist \ isofile isofile2 isofuzzy isolist isolsn \
mmc1 mmc2 mmc2a mmc3 $(paranoia_progs) tracks \ mmc1 mmc2 mmc2a mmc3 $(paranoia_progs) tracks \
sample3 sample4 udf1 udffile cdio-eject sample3 sample4 udf1 udffile cdio-eject
@@ -64,6 +64,7 @@ isofile_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
isofile2_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV) isofile2_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
isofuzzy_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV) isofuzzy_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
isolist_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV) isolist_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
isolsn_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
mmc1_DEPENDENCIES = $(LIBCDIO_DEPS) mmc1_DEPENDENCIES = $(LIBCDIO_DEPS)
mmc1_LDADD = $(LIBCDIO_LIBS) mmc1_LDADD = $(LIBCDIO_LIBS)

View File

@@ -1,4 +1,4 @@
$Id: README,v 1.27 2006/10/21 11:38:16 rocky Exp $ $Id: README,v 1.28 2007/08/12 00:56:10 rocky Exp $
This directory contains some simple examples of the use of the libcdio This directory contains some simple examples of the use of the libcdio
library. library.
@@ -44,6 +44,9 @@ isolist.c: A program to show using libiso9660 to list files in a
directory of an ISO-9660 image and give basic iso9660 directory of an ISO-9660 image and give basic iso9660
information. information.
isolsn.c: A program to show using libiso9660 to get the file
path for a given LSN.
mmc1.c: A program to show issuing a simple MMC command (INQUIRY). mmc1.c: A program to show issuing a simple MMC command (INQUIRY).
mmc2.c: A more involved MMC command to list features from mmc2.c: A more involved MMC command to list features from

View File

@@ -1,7 +1,7 @@
/* /*
$Id: isolist.c,v 1.1 2006/04/15 15:45:25 rocky Exp $ $Id: isolist.c,v 1.2 2007/08/12 00:56:10 rocky Exp $
Copyright (C) 2004, 2005, 2006 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004, 2005, 2006, 2007 Rocky Bernstein <rocky@gnu.org>
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

99
example/isolsn.c Normal file
View File

@@ -0,0 +1,99 @@
/*
$Id: isolsn.c,v 1.1 2007/08/12 00:56:10 rocky Exp $
Copyright (C) 2004, 2005, 2006, 2007 Rocky Bernstein <rocky@gnu.org>
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Simple program to show using libiso9660 to get a file path
for a given LSN of an ISO-9660 image.
If a single argument is given, it is used as the LSN to search for.
Otherwise we use a built-in default value.
If a second argument is given, it is ISO 9660 image to use in the
listing. Otherwise a compiled-in default ISO 9660 image name (that
comes with the libcdio distribution) will be used.
*/
/* Set up a CD-DA image to test on which is in the libcdio distribution. */
#define ISO9660_IMAGE_PATH "../test/"
#define ISO9660_IMAGE ISO9660_IMAGE_PATH "copying.iso"
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <sys/types.h>
#include <cdio/cdio.h>
#include <cdio/iso9660.h>
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#define print_vd_info(title, fn) \
if (fn(p_iso, &psz_str)) { \
printf(title ": %s\n", psz_str); \
} \
free(psz_str); \
psz_str = NULL;
int
main(int argc, const char *argv[])
{
char const *psz_fname;
iso9660_t *p_iso;
lsn_t lsn = 24;
char *psz_path = NULL;
if (argc > 1)
lsn = strtol(argv[1], (char **)NULL, 10);
if (argc > 2)
psz_fname = argv[2];
else
psz_fname = ISO9660_IMAGE;
p_iso = iso9660_open (psz_fname);
if (NULL == p_iso) {
fprintf(stderr, "Sorry, couldn't open %s as an ISO-9660 image\n",
psz_fname);
return 1;
}
iso9660_ifs_find_lsn_with_path (p_iso, lsn, &psz_path);
if (psz_path != NULL) {
printf("File at LSN %u is %s\n", lsn, psz_path);
free(psz_path);
}
iso9660_close(p_iso);
return 0;
}

View File

@@ -1,5 +1,5 @@
/* /*
$Id: iso9660_fs.c,v 1.39 2007/08/11 16:26:14 rocky Exp $ $Id: iso9660_fs.c,v 1.40 2007/08/12 00:56:10 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004, 2005, 2006, 2007 Rocky Bernstein <rocky@gnu.org> Copyright (C) 2003, 2004, 2005, 2006, 2007 Rocky Bernstein <rocky@gnu.org>
@@ -50,7 +50,7 @@
#include <stdio.h> #include <stdio.h>
static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.39 2007/08/11 16:26:14 rocky Exp $"; static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.40 2007/08/12 00:56:10 rocky Exp $";
/* Implementation of iso9660_t type */ /* Implementation of iso9660_t type */
struct _iso9660_s { struct _iso9660_s {
@@ -1374,73 +1374,15 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
} }
} }
static iso9660_stat_t * typedef CdioList_t * (iso9660_readdir_t)
find_fs_lsn_recurse (CdIo_t *p_cdio, const char psz_path[], lsn_t lsn, (void *p_image, const char * psz_path);
/*out*/ char **ppsz_full_filename)
{
CdioList_t *entlist = iso9660_fs_readdir (p_cdio, psz_path, true);
CdioList_t *dirlist = _cdio_list_new ();
CdioListNode_t *entnode;
cdio_assert (entlist != NULL);
/* iterate over each entry in the directory */
_CDIO_LIST_FOREACH (entnode, entlist)
{
iso9660_stat_t *statbuf = _cdio_list_node_data (entnode);
const char *psz_filename = (char *) statbuf->filename;
const unsigned int len = strlen(psz_path) + strlen(psz_filename)+2;
if (*ppsz_full_filename != NULL) free(*ppsz_full_filename);
*ppsz_full_filename = calloc(1, len);
snprintf (*ppsz_full_filename, len, "%s%s/", psz_path, psz_filename);
if (statbuf->type == _STAT_DIR
&& strcmp ((char *) statbuf->filename, ".")
&& strcmp ((char *) statbuf->filename, ".."))
_cdio_list_append (dirlist, strdup(*ppsz_full_filename));
if (statbuf->lsn == lsn) {
unsigned int len=sizeof(iso9660_stat_t)+strlen(statbuf->filename)+1;
iso9660_stat_t *ret_stat = calloc(1, len);
memcpy(ret_stat, statbuf, len);
_cdio_list_free (entlist, true);
_cdio_list_free (dirlist, true);
return ret_stat;
}
}
_cdio_list_free (entlist, true);
/* now recurse/descend over directories encountered */
_CDIO_LIST_FOREACH (entnode, dirlist)
{
char *psz_path_prefix = _cdio_list_node_data (entnode);
iso9660_stat_t *ret_stat;
free(ppsz_full_filename);
ret_stat = find_fs_lsn_recurse (p_cdio, psz_path_prefix, lsn,
ppsz_full_filename);
if (NULL != ret_stat) {
_cdio_list_free (dirlist, true);
return ret_stat;
}
}
free(ppsz_full_filename);
*ppsz_full_filename = NULL;
_cdio_list_free (dirlist, true);
return NULL;
}
static iso9660_stat_t * static iso9660_stat_t *
find_ifs_lsn_recurse (iso9660_t *p_iso, const char psz_path[], lsn_t lsn, find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
/*out*/ char **ppsz_full_filename) const char psz_path[], lsn_t lsn,
/*out*/ char **ppsz_full_filename)
{ {
CdioList_t *entlist = iso9660_ifs_readdir (p_iso, psz_path); CdioList_t *entlist = iso9660_readdir (p_image, psz_path);
CdioList_t *dirlist = _cdio_list_new (); CdioList_t *dirlist = _cdio_list_new ();
CdioListNode_t *entnode; CdioListNode_t *entnode;
@@ -1483,9 +1425,11 @@ find_ifs_lsn_recurse (iso9660_t *p_iso, const char psz_path[], lsn_t lsn,
{ {
char *psz_path_prefix = _cdio_list_node_data (entnode); char *psz_path_prefix = _cdio_list_node_data (entnode);
iso9660_stat_t *ret_stat; iso9660_stat_t *ret_stat;
free(ppsz_full_filename); free(*ppsz_full_filename);
ret_stat = find_ifs_lsn_recurse (p_iso, psz_path_prefix, lsn, *ppsz_full_filename = NULL;
ppsz_full_filename); ret_stat = find_lsn_recurse (p_image, iso9660_readdir,
psz_path_prefix, lsn,
ppsz_full_filename);
if (NULL != ret_stat) { if (NULL != ret_stat) {
_cdio_list_free (dirlist, true); _cdio_list_free (dirlist, true);
@@ -1493,8 +1437,10 @@ find_ifs_lsn_recurse (iso9660_t *p_iso, const char psz_path[], lsn_t lsn,
} }
} }
free(ppsz_full_filename); if (*ppsz_full_filename != NULL) {
*ppsz_full_filename = NULL; free(*ppsz_full_filename);
*ppsz_full_filename = NULL;
}
_cdio_list_free (dirlist, true); _cdio_list_free (dirlist, true);
return NULL; return NULL;
} }
@@ -1509,7 +1455,8 @@ iso9660_stat_t *
iso9660_fs_find_lsn(CdIo_t *p_cdio, lsn_t i_lsn) iso9660_fs_find_lsn(CdIo_t *p_cdio, lsn_t i_lsn)
{ {
char *psz_full_filename = NULL; char *psz_full_filename = NULL;
return find_fs_lsn_recurse (p_cdio, "/", i_lsn, &psz_full_filename); return find_lsn_recurse (p_cdio, (iso9660_readdir_t *) iso9660_fs_readdir,
"/", i_lsn, &psz_full_filename);
} }
/*! /*!
@@ -1522,7 +1469,8 @@ iso9660_stat_t *
iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn, iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
/*out*/ char **ppsz_full_filename) /*out*/ char **ppsz_full_filename)
{ {
return find_fs_lsn_recurse (p_cdio, "/", i_lsn, ppsz_full_filename); return find_lsn_recurse (p_cdio, (iso9660_readdir_t *) iso9660_fs_readdir,
"/", i_lsn, ppsz_full_filename);
} }
/*! /*!
@@ -1535,7 +1483,8 @@ iso9660_stat_t *
iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn) iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn)
{ {
char *psz_full_filename = NULL; char *psz_full_filename = NULL;
return find_ifs_lsn_recurse (p_iso, "/", i_lsn, &psz_full_filename); return find_lsn_recurse (p_iso, (iso9660_readdir_t *) iso9660_ifs_readdir,
"/", i_lsn, &psz_full_filename);
} }
/*! /*!
@@ -1548,7 +1497,8 @@ iso9660_stat_t *
iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso, lsn_t i_lsn, iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso, lsn_t i_lsn,
/*out*/ char **ppsz_full_filename) /*out*/ char **ppsz_full_filename)
{ {
return find_ifs_lsn_recurse (p_iso, "/", i_lsn, ppsz_full_filename); return find_lsn_recurse (p_iso, (iso9660_readdir_t *) iso9660_ifs_readdir,
"/", i_lsn, ppsz_full_filename);
} }
/*! /*!