blob: e1e9c72bdf4fd319874e97c7bec94eaed507d02c [file] [log] [blame] [edit]
/*
* BRLTTY - A background process providing access to the console screen (when in
* text mode) for a blind person using a refreshable braille display.
*
* Copyright (C) 1995-2023 by The BRLTTY Developers.
*
* BRLTTY comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#include "prologue.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "log.h"
#include "parameters.h"
#include "mntfs.h"
#include "async_alarm.h"
#include "mntpt.h"
#if defined(USE_PKG_MNTPT_NONE)
#include "mntpt_none.h"
#elif defined(USE_PKG_MNTPT_MNTENT)
#include "mntpt_mntent.h"
#elif defined(USE_PKG_MNTPT_MNTTAB)
#include "mntpt_mnttab.h"
#else /* mount point package */
#error mount point package not selected
#include "mntpt_none.h"
#endif /* mount point package */
#include "mntpt_internal.h"
#if defined(MNTOPT_RW)
#define MOUNT_OPTION_RW MNTOPT_RW
#else /* MOUNT_OPTION_RW */
#define MOUNT_OPTION_RW "rw"
#endif /* MOUNT_OPTION_RW */
char *
findMountPoint (MountPointTester test) {
char *path = NULL;
FILE *table;
if ((table = openMountsTable(0))) {
MountEntry *entry;
while ((entry = readMountsTable(table))) {
if (test(entry->mountPath, entry->mountType)) {
if (!(path = strdup(entry->mountPath))) logMallocError();
break;
}
}
closeMountsTable(table);
}
return path;
}
static void updateMountsTable (MountEntry *entry);
ASYNC_ALARM_CALLBACK(retryMountsTableUpdate) {
MountEntry *entry = parameters->data;
updateMountsTable(entry);
}
static void
updateMountsTable (MountEntry *entry) {
int retry = 0;
{
FILE *table;
if ((table = openMountsTable(1))) {
addMountEntry(table, entry);
closeMountsTable(table);
} else if ((errno == EROFS) || (errno == EACCES)) {
retry = 1;
}
}
if (retry) {
asyncNewRelativeAlarm(NULL, MOUNT_TABLE_UPDATE_RETRY_INTERVAL, retryMountsTableUpdate, entry);
} else {
if (entry->mountPath) free(entry->mountPath);
if (entry->mountReference) free(entry->mountReference);
if (entry->mountType) free(entry->mountType);
if (entry->mountOptions) free(entry->mountOptions);
free(entry);
}
}
int
makeMountPoint (const char *path, const char *reference, const char *type) {
if (mountFileSystem(path, reference, type)) {
MountEntry *entry;
logMessage(LOG_NOTICE, "file system mounted: %s[%s] -> %s",
type, reference, path);
if ((entry = malloc(sizeof(*entry)))) {
memset(entry, 0, sizeof(*entry));
if ((entry->mountPath = strdup(path))) {
if ((entry->mountReference = strdup(reference))) {
if ((entry->mountType = strdup(type))) {
if ((entry->mountOptions = strdup(MOUNT_OPTION_RW))) {
updateMountsTable(entry);
return 1;
} else {
logMallocError();
}
free(entry->mountType);
} else {
logMallocError();
}
free(entry->mountReference);
} else {
logMallocError();
}
free(entry->mountPath);
} else {
logMallocError();
}
free(entry);
} else {
logMallocError();
}
} else {
logMessage(LOG_ERR, "file system mount error: %s[%s] -> %s: %s",
type, reference, path, strerror(errno));
}
return 0;
}