mirror of
git://git.gnupg.org/gnupg.git
synced 2024-11-01 20:18:44 +01:00
a9e0905342
* agent/cache.c: Fix typos. * agent/call-pinentry.c: Likewise. * agent/call-scd.c: Likewise. * agent/command-ssh.c: Likewise. * agent/command.c: Likewise. * agent/divert-scd.c: Likewise. * agent/findkey.c: Likewise. * agent/gpg-agent.c: Likewise. * agent/w32main.c: Likewise. * common/argparse.c: Likewise. * common/audit.c: Likewise. * common/audit.h: Likewise. * common/convert.c: Likewise. * common/dotlock.c: Likewise. * common/exechelp-posix.c: Likewise. * common/exechelp-w32.c: Likewise. * common/exechelp-w32ce.c: Likewise. * common/exechelp.h: Likewise. * common/helpfile.c: Likewise. * common/i18n.h: Likewise. * common/iobuf.c: Likewise. * common/iobuf.h: Likewise. * common/localename.c: Likewise. * common/logging.c: Likewise. * common/openpgp-oid.c: Likewise. * common/session-env.c: Likewise. * common/sexputil.c: Likewise. * common/sysutils.c: Likewise. * common/t-sexputil.c: Likewise. * common/ttyio.c: Likewise. * common/util.h: Likewise. * dirmngr/cdblib.c: Likewise. * dirmngr/certcache.c: Likewise. * dirmngr/crlcache.c: Likewise. * dirmngr/dirmngr-client.c: Likewise. * dirmngr/dirmngr.c: Likewise. * dirmngr/dirmngr_ldap.c: Likewise. * dirmngr/dns-stuff.c: Likewise. * dirmngr/http.c: Likewise. * dirmngr/ks-engine-hkp.c: Likewise. * dirmngr/ks-engine-ldap.c: Likewise. * dirmngr/ldap-wrapper.c: Likewise. * dirmngr/ldap.c: Likewise. * dirmngr/misc.c: Likewise. * dirmngr/ocsp.c: Likewise. * dirmngr/validate.c: Likewise. * g10/encrypt.c: Likewise. * g10/getkey.c: Likewise. * g10/gpg.c: Likewise. * g10/gpgv.c: Likewise. * g10/import.c: Likewise. * g10/keydb.c: Likewise. * g10/keydb.h: Likewise. * g10/keygen.c: Likewise. * g10/keyid.c: Likewise. * g10/keylist.c: Likewise. * g10/keyring.c: Likewise. * g10/mainproc.c: Likewise. * g10/misc.c: Likewise. * g10/options.h: Likewise. * g10/packet.h: Likewise. * g10/parse-packet.c: Likewise. * g10/pkclist.c: Likewise. * g10/pkglue.c: Likewise. * g10/plaintext.c: Likewise. * g10/server.c: Likewise. * g10/sig-check.c: Likewise. * g10/sqlite.c: Likewise. * g10/tdbio.c: Likewise. * g10/test-stubs.c: Likewise. * g10/tofu.c: Likewise. * g10/trust.c: Likewise. * g10/trustdb.c: Likewise. * g13/create.c: Likewise. * g13/mountinfo.c: Likewise. * kbx/keybox-blob.c: Likewise. * kbx/keybox-file.c: Likewise. * kbx/keybox-init.c: Likewise. * kbx/keybox-search-desc.h: Likewise. * kbx/keybox-search.c: Likewise. * kbx/keybox-update.c: Likewise. * scd/apdu.c: Likewise. * scd/app-openpgp.c: Likewise. * scd/app-p15.c: Likewise. * scd/app.c: Likewise. * scd/ccid-driver.c: Likewise. * scd/command.c: Likewise. * scd/iso7816.c: Likewise. * sm/base64.c: Likewise. * sm/call-agent.c: Likewise. * sm/call-dirmngr.c: Likewise. * sm/certchain.c: Likewise. * sm/gpgsm.c: Likewise. * sm/import.c: Likewise. * sm/keydb.c: Likewise. * sm/minip12.c: Likewise. * sm/qualified.c: Likewise. * sm/server.c: Likewise. * tools/gpg-check-pattern.c: Likewise. * tools/gpgconf-comp.c: Likewise. * tools/gpgkey2ssh.c: Likewise. * tools/gpgparsemail.c: Likewise. * tools/gpgtar.c: Likewise. * tools/rfc822parse.c: Likewise. * tools/symcryptrun.c: Likewise. Signed-off-by: Justus Winter <justus@g10code.com>
199 lines
5.3 KiB
C
199 lines
5.3 KiB
C
/* mountinfo.c - Track infos about mounts
|
||
* Copyright (C) 2009 Free Software Foundation, Inc.
|
||
*
|
||
* This file is part of GnuPG.
|
||
*
|
||
* GnuPG 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 3 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* GnuPG 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, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#include <config.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <errno.h>
|
||
#include <unistd.h>
|
||
#include <sys/stat.h>
|
||
#include <assert.h>
|
||
|
||
#include "g13.h"
|
||
#include "i18n.h"
|
||
#include "mountinfo.h"
|
||
|
||
#include "keyblob.h"
|
||
#include "utils.h"
|
||
|
||
|
||
|
||
/* The object to keep track of mount information. */
|
||
struct mounttable_s
|
||
{
|
||
int in_use; /* The slot is in use. */
|
||
char *container; /* Name of the container. */
|
||
char *mountpoint; /* Name of the mounttype. */
|
||
int conttype; /* Type of the container. */
|
||
unsigned int rid; /* Identifier of the runner task. */
|
||
struct {
|
||
unsigned int remove:1; /* True if the mountpoint shall be removed
|
||
on umount. */
|
||
} flags;
|
||
};
|
||
|
||
|
||
/* The allocated table of mounts and its size. */
|
||
static mtab_t mounttable;
|
||
size_t mounttable_size;
|
||
|
||
|
||
|
||
/* Add CONTAINER,MOUNTPOINT,CONTTYPE,RID to the mounttable. */
|
||
gpg_error_t
|
||
mountinfo_add_mount (const char *container, const char *mountpoint,
|
||
int conttype, unsigned int rid, int remove_flag)
|
||
{
|
||
size_t idx;
|
||
mtab_t m;
|
||
|
||
for (idx=0; idx < mounttable_size; idx++)
|
||
if (!mounttable[idx].in_use)
|
||
break;
|
||
if (!(idx < mounttable_size))
|
||
{
|
||
size_t nslots = mounttable_size;
|
||
|
||
mounttable_size += 10;
|
||
m = xtrycalloc (mounttable_size, sizeof *mounttable);
|
||
if (!m)
|
||
return gpg_error_from_syserror ();
|
||
if (mounttable)
|
||
{
|
||
for (idx=0; idx < nslots; idx++)
|
||
m[idx] = mounttable[idx];
|
||
xfree (mounttable);
|
||
}
|
||
mounttable = m;
|
||
m = mounttable + nslots;
|
||
assert (!m->in_use);
|
||
}
|
||
else
|
||
m = mounttable + idx;
|
||
|
||
m->container = xtrystrdup (container);
|
||
if (!m->container)
|
||
return gpg_error_from_syserror ();
|
||
m->mountpoint = xtrystrdup (mountpoint);
|
||
if (!m->mountpoint)
|
||
{
|
||
xfree (m->container);
|
||
m->container = NULL;
|
||
return gpg_error_from_syserror ();
|
||
}
|
||
m->conttype = conttype;
|
||
m->rid = rid;
|
||
m->flags.remove = !!remove_flag;
|
||
m->in_use = 1;
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
/* Remove a mount info. Either the CONTAINER, the MOUNTPOINT or the
|
||
RID must be given. The first argument given is used. */
|
||
gpg_error_t
|
||
mountinfo_del_mount (const char *container, const char *mountpoint,
|
||
unsigned int rid)
|
||
{
|
||
gpg_error_t err;
|
||
size_t idx;
|
||
mtab_t m;
|
||
|
||
/* If a container or mountpint is givem search the RID via the
|
||
standard find function. */
|
||
if (container || mountpoint)
|
||
{
|
||
err = mountinfo_find_mount (container, mountpoint, &rid);
|
||
if (err)
|
||
return err;
|
||
}
|
||
|
||
/* Find via RID and delete. */
|
||
for (idx=0, m = mounttable; idx < mounttable_size; idx++, m++)
|
||
if (m->in_use && m->rid == rid)
|
||
{
|
||
if (m->flags.remove && m->mountpoint)
|
||
{
|
||
/* FIXME: This does not always work because the umount may
|
||
not have completed yet. We should add the mountpoints
|
||
to an idle queue and retry a remove. */
|
||
if (rmdir (m->mountpoint))
|
||
log_error ("error removing mount point '%s': %s\n",
|
||
m->mountpoint,
|
||
gpg_strerror (gpg_error_from_syserror ()));
|
||
}
|
||
m->in_use = 0;
|
||
xfree (m->container);
|
||
m->container = NULL;
|
||
xfree (m->mountpoint);
|
||
m->mountpoint = NULL;
|
||
return 0;
|
||
}
|
||
return gpg_error (GPG_ERR_NOT_FOUND);
|
||
}
|
||
|
||
|
||
/* Find a mount and return its rid at R_RID. If CONTAINER is given,
|
||
the search is done by the container name, if it is not given the
|
||
search is done by MOUNTPOINT. */
|
||
gpg_error_t
|
||
mountinfo_find_mount (const char *container, const char *mountpoint,
|
||
unsigned int *r_rid)
|
||
{
|
||
size_t idx;
|
||
mtab_t m;
|
||
|
||
if (container)
|
||
{
|
||
for (idx=0, m = mounttable; idx < mounttable_size; idx++, m++)
|
||
if (m->in_use && !strcmp (m->container, container))
|
||
break;
|
||
}
|
||
else if (mountpoint)
|
||
{
|
||
for (idx=0, m = mounttable; idx < mounttable_size; idx++, m++)
|
||
if (m->in_use && !strcmp (m->mountpoint, mountpoint))
|
||
break;
|
||
}
|
||
else
|
||
idx = mounttable_size;
|
||
if (!(idx < mounttable_size))
|
||
return gpg_error (GPG_ERR_NOT_FOUND);
|
||
|
||
*r_rid = m->rid;
|
||
return 0;
|
||
}
|
||
|
||
|
||
/* Dump all info to the log stream. */
|
||
void
|
||
mountinfo_dump_all (void)
|
||
{
|
||
size_t idx;
|
||
mtab_t m;
|
||
|
||
for (idx=0, m = mounttable; idx < mounttable_size; idx++, m++)
|
||
if (m->in_use)
|
||
log_info ("mtab[%d] %s on %s type %d rid %u%s\n",
|
||
(int)idx, m->container, m->mountpoint, m->conttype, m->rid,
|
||
m->flags.remove?" [remove]":"");
|
||
}
|