/** * This function opens the file system stored on \p geom, if it * can find one. * It is often called in the following manner: * \code * fs = ped_file_system_open (&part.geom) * \endcode * * \throws PED_EXCEPTION_ERROR if file system could not be detected * \throws PED_EXCEPTION_ERROR if the file system is bigger than its volume * \throws PED_EXCEPTION_NO_FEATURE if opening of a file system stored on * \p geom is not implemented * * \return a PedFileSystem on success, \c NULL on failure. */ PedFileSystem * ped_file_system_open (PedGeometry* geom) { PED_ASSERT (geom != NULL); if (!ped_device_open (geom->dev)) goto error; PedFileSystemType *type = ped_file_system_probe (geom); if (!type) { ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, _("Could not detect file system.")); goto error_close_dev; } open_fn_t open_f = open_fn (type->name); if (open_f == NULL) { ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, _("resizing %s file systems is not supported"), type->name); goto error_close_dev; } PedGeometry *probed_geom = ped_file_system_probe_specific (type, geom); if (!probed_geom) goto error_close_dev; if (!ped_geometry_test_inside (geom, probed_geom)) { if (ped_exception_throw ( PED_EXCEPTION_ERROR, PED_EXCEPTION_IGNORE_CANCEL, _("The file system is bigger than its volume!")) != PED_EXCEPTION_IGNORE) goto error_destroy_probed_geom; } PedFileSystem *fs = (*open_f) (probed_geom); if (!fs) goto error_destroy_probed_geom; ped_geometry_destroy (probed_geom); fs->type = type; return fs; error_destroy_probed_geom: ped_geometry_destroy (probed_geom); error_close_dev: ped_device_close (geom->dev); error: return NULL; }
PyObject *py_ped_file_system_probe_specific(PyObject *s, PyObject *args) { PyObject *in_geom = NULL, *in_fstype = NULL; PedFileSystemType *fstype = NULL; PedGeometry *out_geom = NULL, *geom = NULL; _ped_Geometry *ret = NULL; if (!PyArg_ParseTuple(args, "O!O!", &_ped_FileSystemType_Type_obj, &in_fstype, &_ped_Geometry_Type_obj, &in_geom)) { return NULL; } fstype = _ped_FileSystemType2PedFileSystemType(in_fstype); if (!fstype) { return NULL; } out_geom = _ped_Geometry2PedGeometry(in_geom); if (!out_geom) { return NULL; } geom = ped_file_system_probe_specific(fstype, out_geom); if (geom) { ret = PedGeometry2_ped_Geometry(geom); } else { /* libparted swallows exceptions here (I think) and just returns * NULL if the match is not made. Reset exception flag and return * None. */ if (partedExnRaised) { partedExnRaised = 0; } Py_INCREF(Py_None); return Py_None; } return (PyObject *) ret; }