mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
blkid(1) (or actually, libblkid) seems to handle filesystem labels up to 127 characters. Considering that btrfs labels can be up to 128 characters, this means long labels are not read correctly (i.e. get truncated) by blkid. Furthermore, ntfs labels are actually unicode, and libblkid seems to not decode them correctly. Hence, if ntfsprogs is available invoke `ntfslabel` to get the label of ntfs filesystems. Related to RHBZ#1164708.
163 lines
3.6 KiB
C
163 lines
3.6 KiB
C
/* libguestfs - the guestfsd daemon
|
|
* Copyright (C) 2009-2015 Red Hat Inc.
|
|
*
|
|
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <inttypes.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include "daemon.h"
|
|
#include "actions.h"
|
|
#include "optgroups.h"
|
|
|
|
#define MAX_ARGS 64
|
|
|
|
GUESTFSD_EXT_CMD(str_ntfs3g_probe, ntfs-3g.probe);
|
|
GUESTFSD_EXT_CMD(str_ntfsresize, ntfsresize);
|
|
GUESTFSD_EXT_CMD(str_ntfsfix, ntfsfix);
|
|
GUESTFSD_EXT_CMD(str_ntfslabel, ntfslabel);
|
|
|
|
int
|
|
optgroup_ntfs3g_available (void)
|
|
{
|
|
return prog_exists (str_ntfs3g_probe);
|
|
}
|
|
|
|
int
|
|
optgroup_ntfsprogs_available (void)
|
|
{
|
|
return prog_exists (str_ntfsresize);
|
|
}
|
|
|
|
char *
|
|
ntfs_get_label (const char *device)
|
|
{
|
|
int r;
|
|
CLEANUP_FREE char *err = NULL;
|
|
char *out = NULL;
|
|
size_t len;
|
|
|
|
r = command (&out, &err, str_ntfslabel, device, NULL);
|
|
if (r == -1) {
|
|
reply_with_error ("%s", err);
|
|
free (out);
|
|
return NULL;
|
|
}
|
|
|
|
/* Trim trailing \n if present. */
|
|
len = strlen (out);
|
|
if (len > 0 && out[len-1] == '\n')
|
|
out[len-1] = '\0';
|
|
|
|
return out;
|
|
}
|
|
|
|
int
|
|
do_ntfs_3g_probe (int rw, const char *device)
|
|
{
|
|
CLEANUP_FREE char *err = NULL;
|
|
int r;
|
|
const char *rw_flag;
|
|
|
|
rw_flag = rw ? "-w" : "-r";
|
|
|
|
r = commandr (NULL, &err, str_ntfs3g_probe, rw_flag, device, NULL);
|
|
if (r == -1) {
|
|
reply_with_error ("%s: %s", device, err);
|
|
return -1;
|
|
}
|
|
|
|
return r;
|
|
}
|
|
|
|
/* Takes optional arguments, consult optargs_bitmask. */
|
|
int
|
|
do_ntfsresize (const char *device, int64_t size, int force)
|
|
{
|
|
CLEANUP_FREE char *err = NULL;
|
|
int r;
|
|
const char *argv[MAX_ARGS];
|
|
size_t i = 0;
|
|
char size_str[32];
|
|
|
|
ADD_ARG (argv, i, str_ntfsresize);
|
|
ADD_ARG (argv, i, "-P");
|
|
|
|
if (optargs_bitmask & GUESTFS_NTFSRESIZE_SIZE_BITMASK) {
|
|
if (size <= 0) {
|
|
reply_with_error ("size is zero or negative");
|
|
return -1;
|
|
}
|
|
|
|
snprintf (size_str, sizeof size_str, "%" PRIi64, size);
|
|
ADD_ARG (argv, i, "--size");
|
|
ADD_ARG (argv, i, size_str);
|
|
}
|
|
|
|
if (optargs_bitmask & GUESTFS_NTFSRESIZE_FORCE_BITMASK && force)
|
|
ADD_ARG (argv, i, "--force");
|
|
|
|
ADD_ARG (argv, i, device);
|
|
ADD_ARG (argv, i, NULL);
|
|
|
|
r = commandvf (NULL, &err, COMMAND_FLAG_FOLD_STDOUT_ON_STDERR, argv);
|
|
if (r == -1) {
|
|
reply_with_error ("%s: %s", device, err);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
do_ntfsresize_size (const char *device, int64_t size)
|
|
{
|
|
optargs_bitmask = GUESTFS_NTFSRESIZE_SIZE_BITMASK;
|
|
return do_ntfsresize (device, size, 0);
|
|
}
|
|
|
|
/* Takes optional arguments, consult optargs_bitmask. */
|
|
int
|
|
do_ntfsfix (const char *device, int clearbadsectors)
|
|
{
|
|
const char *argv[MAX_ARGS];
|
|
size_t i = 0;
|
|
int r;
|
|
CLEANUP_FREE char *err = NULL;
|
|
|
|
ADD_ARG (argv, i, str_ntfsfix);
|
|
|
|
if ((optargs_bitmask & GUESTFS_NTFSFIX_CLEARBADSECTORS_BITMASK) &&
|
|
clearbadsectors)
|
|
ADD_ARG (argv, i, "-b");
|
|
|
|
ADD_ARG (argv, i, device);
|
|
ADD_ARG (argv, i, NULL);
|
|
|
|
r = commandv (NULL, &err, argv);
|
|
if (r == -1) {
|
|
reply_with_error ("%s: %s", device, err);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|