Blame example/udf1.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2005, 2008, 2014 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/* Simple program to show using libudf to list files in a directory of
Packit dd8086
   an UDF image.
Packit dd8086
 */
Packit dd8086
Packit dd8086
/* This is the UDF image. */
Packit dd8086
#define UDF_IMAGE_PATH "../"
Packit dd8086
#define UDF_IMAGE "../test/data/udf102.iso"
Packit dd8086
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
#include "config.h"
Packit dd8086
#define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDIO_H
Packit dd8086
#include <stdio.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
#include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_UNISTD_H
Packit dd8086
#include <unistd.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/udf.h>
Packit dd8086
Packit dd8086
#define udf_PATH_DELIMITERS "/\\"
Packit dd8086
Packit dd8086
static void
Packit dd8086
print_file_info(const udf_dirent_t *p_udf_dirent, const char* psz_dirname)
Packit dd8086
{
Packit dd8086
  time_t mod_time = udf_get_modification_time(p_udf_dirent);
Packit dd8086
  char psz_mode[11]="invalid";
Packit dd8086
  const char *psz_fname= psz_dirname
Packit dd8086
    ? psz_dirname : udf_get_filename(p_udf_dirent);
Packit dd8086
Packit dd8086
  /* Print directory attributes*/
Packit dd8086
  printf("%s ", udf_mode_string(udf_get_posix_filemode(p_udf_dirent),
Packit dd8086
				psz_mode));
Packit dd8086
  printf("%4d ", udf_get_link_count(p_udf_dirent));
Packit dd8086
  printf("%lu ", (long unsigned int) udf_get_file_length(p_udf_dirent));
Packit dd8086
  printf("%s %s",  *psz_fname ? psz_fname : "/", ctime(&mod_time));
Packit dd8086
}
Packit dd8086
Packit dd8086
static void
Packit dd8086
list_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const char *psz_path)
Packit dd8086
{
Packit dd8086
  if (!p_udf_dirent) return;
Packit dd8086
Packit dd8086
  print_file_info(p_udf_dirent, psz_path);
Packit dd8086
Packit dd8086
  while (udf_readdir(p_udf_dirent)) {
Packit dd8086
Packit dd8086
    if (udf_is_dir(p_udf_dirent)) {
Packit dd8086
Packit dd8086
      udf_dirent_t *p_udf_dirent2 = udf_opendir(p_udf_dirent);
Packit dd8086
      if (p_udf_dirent2) {
Packit dd8086
	const char *psz_dirname = udf_get_filename(p_udf_dirent);
Packit dd8086
	const unsigned int i_newlen=2 + strlen(psz_path) + strlen(psz_dirname);
Packit dd8086
	char *psz_newpath = calloc(1, sizeof(char)*i_newlen);
Packit dd8086
Packit dd8086
	snprintf(psz_newpath, i_newlen, "%s%s/", psz_path, psz_dirname);
Packit dd8086
	list_files(p_udf, p_udf_dirent2, psz_newpath);
Packit dd8086
	free(psz_newpath);
Packit dd8086
      }
Packit dd8086
    } else {
Packit dd8086
      print_file_info(p_udf_dirent, NULL);
Packit dd8086
    }
Packit dd8086
  }
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[])
Packit dd8086
{
Packit dd8086
  udf_t *p_udf;
Packit dd8086
  char const *psz_udf_image;
Packit dd8086
Packit dd8086
  if (argc > 1)
Packit dd8086
    psz_udf_image = argv[1];
Packit dd8086
  else
Packit dd8086
    psz_udf_image = UDF_IMAGE;
Packit dd8086
Packit dd8086
  p_udf = udf_open (psz_udf_image);
Packit dd8086
Packit dd8086
  if (NULL == p_udf) {
Packit dd8086
    fprintf(stderr, "Sorry, couldn't open %s as something using UDF\n",
Packit dd8086
	    psz_udf_image);
Packit dd8086
    return 1;
Packit dd8086
  } else {
Packit dd8086
    udf_dirent_t *p_udf_root = udf_get_root(p_udf, true, 0);
Packit dd8086
    if (NULL == p_udf_root) {
Packit dd8086
      fprintf(stderr, "Sorry, couldn't find / in %s\n",
Packit dd8086
	      psz_udf_image);
Packit dd8086
      return 1;
Packit dd8086
    }
Packit dd8086
Packit dd8086
    {
Packit dd8086
      char vol_id[UDF_VOLID_SIZE] = "";
Packit dd8086
      char volset_id[UDF_VOLSET_ID_SIZE+1] = "";
Packit dd8086
Packit dd8086
      if (0 < udf_get_volume_id(p_udf, vol_id, sizeof(vol_id)) )
Packit dd8086
	printf("volume id: %s\n", vol_id);
Packit dd8086
Packit dd8086
      if (0 < udf_get_volume_id(p_udf, volset_id, sizeof(volset_id)) ) {
Packit dd8086
	volset_id[UDF_VOLSET_ID_SIZE]='\0';
Packit dd8086
	printf("volume set id: %s\n", volset_id);
Packit dd8086
      }
Packit dd8086
Packit dd8086
      printf("partition number: %d\n", udf_get_part_number(p_udf));
Packit dd8086
Packit dd8086
Packit dd8086
    }
Packit dd8086
Packit dd8086
    list_files(p_udf, p_udf_root, "");
Packit dd8086
  }
Packit dd8086
Packit dd8086
  udf_close(p_udf);
Packit dd8086
  return 0;
Packit dd8086
}