Blame example/mmc1.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2004, 2005, 2008-2012, 2017
Packit dd8086
   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
/* Sample program to show use of the MMC interface.
Packit dd8086
   An optional drive name can be supplied as an argument.
Packit dd8086
   This basically the libdio mmc_get_hwinfo() routine.
Packit dd8086
   See also corresponding C++ programs.
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_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/mmc.h>
Packit dd8086
#include <cdio/mmc_cmds.h>
Packit dd8086
Packit dd8086
/* Set how long to wait for MMC commands to complete */
Packit dd8086
#define DEFAULT_TIMEOUT_MS 10000
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[])
Packit dd8086
{
Packit dd8086
  CdIo_t *p_cdio;
Packit dd8086
  const char *psz_drive = NULL;
Packit dd8086
Packit dd8086
  if (argc > 1) psz_drive = argv[1];
Packit dd8086
  p_cdio = cdio_open (psz_drive, DRIVER_UNKNOWN);
Packit dd8086
Packit dd8086
  if (!p_cdio) {
Packit dd8086
    printf("-- Couldn't find CD\n");
Packit dd8086
    return 77;
Packit dd8086
  } else {
Packit dd8086
    int i_status;             /* Result of MMC command */
Packit dd8086
    mmc_cdb_t cdb = {{0, }};  /* Command Descriptor Buffer */
Packit dd8086
    char buf[36] = { 0, };    /* Place to hold returned data */
Packit dd8086
Packit dd8086
    CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_INQUIRY);
Packit dd8086
    cdb.field[4] = sizeof(buf);
Packit dd8086
Packit dd8086
    i_status = mmc_run_cmd(p_cdio, DEFAULT_TIMEOUT_MS, &cdb,
Packit dd8086
			   SCSI_MMC_DATA_READ, sizeof(buf), &buf;;
Packit dd8086
    if (i_status == 0) {
Packit dd8086
	char psz_vendor[CDIO_MMC_HW_VENDOR_LEN+1];
Packit dd8086
	char psz_model[CDIO_MMC_HW_MODEL_LEN+1];
Packit dd8086
	char psz_rev[CDIO_MMC_HW_REVISION_LEN+1];
Packit dd8086
Packit dd8086
	memcpy(psz_vendor, buf + 8, sizeof(psz_vendor)-1);
Packit dd8086
	psz_vendor[sizeof(psz_vendor)-1] = '\0';
Packit dd8086
	memcpy(psz_model,
Packit dd8086
	       buf + 8 + CDIO_MMC_HW_VENDOR_LEN,
Packit dd8086
	       sizeof(psz_model)-1);
Packit dd8086
	psz_model[sizeof(psz_model)-1] = '\0';
Packit dd8086
	memcpy(psz_rev,
Packit dd8086
	       buf + 8 + CDIO_MMC_HW_VENDOR_LEN +CDIO_MMC_HW_MODEL_LEN,
Packit dd8086
	       sizeof(psz_rev)-1);
Packit dd8086
	psz_rev[sizeof(psz_rev)-1] = '\0';
Packit dd8086
Packit dd8086
	printf("-- Vendor: %s\n-- Model: %s\n-- Revision: %s\n",
Packit dd8086
	       psz_vendor, psz_model, psz_rev);
Packit dd8086
    } else {
Packit dd8086
      printf("-- Couldn't get INQUIRY data (vendor, model, and revision).\n");
Packit dd8086
    }
Packit dd8086
Packit dd8086
    {
Packit dd8086
	bool b_erasable;
Packit dd8086
	cdio_mmc_feature_profile_t disctype;
Packit dd8086
Packit dd8086
	i_status = mmc_get_disc_erasable(p_cdio, &b_erasable);
Packit dd8086
	if (DRIVER_OP_SUCCESS == i_status)
Packit dd8086
	    printf("-- Disc is %serasable.\n", b_erasable ? "" : "not ");
Packit dd8086
	else
Packit dd8086
	    printf("-- Can't determine if disc is erasable.\n");
Packit dd8086
Packit dd8086
	i_status = mmc_get_disctype(p_cdio, 0, &disctype);
Packit dd8086
	if (DRIVER_OP_SUCCESS == i_status) {
Packit dd8086
	    printf("-- disc type: profile is %s (0x%X)\n",
Packit dd8086
		   mmc_feature_profile2str(disctype),
Packit dd8086
		   disctype);
Packit dd8086
	}
Packit dd8086
    }
Packit dd8086
Packit dd8086
  }
Packit dd8086
Packit dd8086
  cdio_destroy(p_cdio);
Packit dd8086
Packit dd8086
  return 0;
Packit dd8086
}