VirtualBox

source: vbox/trunk/src/VBox/Additions/linux/sharedfolders/vbsfmount.c@ 93115

Last change on this file since 93115 was 93115, checked in by vboxsync, 2 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.1 KB
Line 
1/* $Id: vbsfmount.c 93115 2022-01-01 11:31:46Z vboxsync $ */
2/** @file
3 * vbsfmount - Commonly used code to mount shared folders on Linux-based
4 * systems. Currently used by mount.vboxsf and VBoxService.
5 */
6
7/*
8 * Copyright (C) 2010-2022 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19
20/*********************************************************************************************************************************
21* Header Files *
22*********************************************************************************************************************************/
23#ifndef _GNU_SOURCE
24# define _GNU_SOURCE
25#endif
26#include <assert.h>
27#include <ctype.h>
28#include <mntent.h>
29#include <stdio.h>
30#include <stdlib.h>
31#include <stdint.h>
32#include <string.h>
33#include <sys/mount.h>
34
35#include "vbsfmount.h"
36
37
38/** @todo Use defines for return values! */
39int vbsfmount_complete(const char *pszSharedFolder, const char *pszMountPoint,
40 unsigned long fFlags, const char *pszOpts)
41{
42 /*
43 * Combine pszOpts and fFlags.
44 */
45 int rc;
46 size_t const cchFlags = (fFlags & MS_NOSUID ? strlen(MNTOPT_NOSUID) + 1 : 0)
47 + (fFlags & MS_RDONLY ? strlen(MNTOPT_RO) : strlen(MNTOPT_RW));
48 size_t const cchOpts = pszOpts ? 1 + strlen(pszOpts) : 0;
49 char *pszBuf = (char *)malloc(cchFlags + cchOpts + 8);
50 if (pszBuf)
51 {
52 char *psz = pszBuf;
53 FILE *pMTab;
54
55 strcpy(psz, fFlags & MS_RDONLY ? MNTOPT_RO : MNTOPT_RW);
56 psz += strlen(psz);
57
58 if (fFlags & MS_NOSUID)
59 {
60 *psz++ = ',';
61 strcpy(psz, MNTOPT_NOSUID);
62 psz += strlen(psz);
63 }
64
65 if (cchOpts)
66 {
67 *psz++ = ',';
68 strcpy(psz, pszOpts);
69 }
70
71 assert(strlen(pszBuf) <= cchFlags + cchOpts);
72
73 /*
74 * Open the mtab and update it:
75 */
76 pMTab = setmntent(MOUNTED, "a+");
77 if (pMTab)
78 {
79 struct mntent Entry;
80 Entry.mnt_fsname = (char*)pszSharedFolder;
81 Entry.mnt_dir = (char *)pszMountPoint;
82 Entry.mnt_type = "vboxsf";
83 Entry.mnt_opts = pszBuf;
84 Entry.mnt_freq = 0;
85 Entry.mnt_passno = 0;
86
87 if (!addmntent(pMTab, &Entry))
88 rc = 0; /* success. */
89 else
90 rc = 3; /* Could not add an entry to the mount table. */
91
92 endmntent(pMTab);
93 }
94 else
95 rc = 2; /* Could not open mount table for update. */
96
97 free(pszBuf);
98 }
99 else
100 rc = 1; /* allocation error */
101 return rc;
102}
103
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use