homework: allow specifying explicit additional mount options when using CIFS backend
This is useful since certain shares can only be mounted with additional mount flags. For example the SMB share in modern AVM Fritz!Boxes requires "noserverino" to be set to work from Linux.
This commit is contained in:
+13
-7
@@ -2161,6 +2161,8 @@ static int help(int argc, char *argv[], void *userdata) {
|
||||
" --cifs-domain=DOMAIN CIFS (Windows) domain\n"
|
||||
" --cifs-user-name=USER CIFS (Windows) user name\n"
|
||||
" --cifs-service=SERVICE CIFS (Windows) service to mount as home area\n"
|
||||
" --cifs-extra-mount-options=OPTIONS\n"
|
||||
" CIFS (Windows) extra mount options\n"
|
||||
"\n%4$sLogin Behaviour User Record Properties:%5$s\n"
|
||||
" --stop-delay=SECS How long to leave user services running after\n"
|
||||
" logout\n"
|
||||
@@ -2217,6 +2219,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
ARG_CIFS_DOMAIN,
|
||||
ARG_CIFS_USER_NAME,
|
||||
ARG_CIFS_SERVICE,
|
||||
ARG_CIFS_EXTRA_MOUNT_OPTIONS,
|
||||
ARG_TASKS_MAX,
|
||||
ARG_MEMORY_HIGH,
|
||||
ARG_MEMORY_MAX,
|
||||
@@ -2309,6 +2312,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
{ "cifs-user-name", required_argument, NULL, ARG_CIFS_USER_NAME },
|
||||
{ "cifs-domain", required_argument, NULL, ARG_CIFS_DOMAIN },
|
||||
{ "cifs-service", required_argument, NULL, ARG_CIFS_SERVICE },
|
||||
{ "cifs-extra-mount-options", required_argument, NULL, ARG_CIFS_EXTRA_MOUNT_OPTIONS },
|
||||
{ "rate-limit-interval", required_argument, NULL, ARG_RATE_LIMIT_INTERVAL },
|
||||
{ "rate-limit-burst", required_argument, NULL, ARG_RATE_LIMIT_BURST },
|
||||
{ "stop-delay", required_argument, NULL, ARG_STOP_DELAY },
|
||||
@@ -2447,15 +2451,17 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
case ARG_LOCATION:
|
||||
case ARG_ICON_NAME:
|
||||
case ARG_CIFS_USER_NAME:
|
||||
case ARG_CIFS_DOMAIN: {
|
||||
case ARG_CIFS_DOMAIN:
|
||||
case ARG_CIFS_EXTRA_MOUNT_OPTIONS: {
|
||||
|
||||
const char *field =
|
||||
c == ARG_EMAIL_ADDRESS ? "emailAddress" :
|
||||
c == ARG_LOCATION ? "location" :
|
||||
c == ARG_ICON_NAME ? "iconName" :
|
||||
c == ARG_CIFS_USER_NAME ? "cifsUserName" :
|
||||
c == ARG_CIFS_DOMAIN ? "cifsDomain" :
|
||||
NULL;
|
||||
c == ARG_EMAIL_ADDRESS ? "emailAddress" :
|
||||
c == ARG_LOCATION ? "location" :
|
||||
c == ARG_ICON_NAME ? "iconName" :
|
||||
c == ARG_CIFS_USER_NAME ? "cifsUserName" :
|
||||
c == ARG_CIFS_DOMAIN ? "cifsDomain" :
|
||||
c == ARG_CIFS_EXTRA_MOUNT_OPTIONS ? "cifsExtraMountOptions" :
|
||||
NULL;
|
||||
|
||||
assert(field);
|
||||
|
||||
|
||||
@@ -83,6 +83,10 @@ int home_setup_cifs(
|
||||
p, h->uid, user_record_gid(h), user_record_access_mode(h), user_record_access_mode(h)) < 0)
|
||||
return log_oom();
|
||||
|
||||
if (h->cifs_extra_mount_options)
|
||||
if (!strextend_with_separator(&options, ",", h->cifs_extra_mount_options))
|
||||
return log_oom();
|
||||
|
||||
r = safe_fork("(mount)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR, &mount_pid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -271,6 +271,7 @@ static UserRecord* user_record_free(UserRecord *h) {
|
||||
free(h->cifs_service);
|
||||
free(h->cifs_user_name);
|
||||
free(h->cifs_domain);
|
||||
free(h->cifs_extra_mount_options);
|
||||
|
||||
free(h->image_path);
|
||||
free(h->image_path_auto);
|
||||
@@ -1267,6 +1268,7 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp
|
||||
{ "cifsDomain", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_domain), JSON_SAFE },
|
||||
{ "cifsUserName", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_user_name), JSON_SAFE },
|
||||
{ "cifsService", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_service), JSON_SAFE },
|
||||
{ "cifsExtraMountOptions", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_extra_mount_options), 0 },
|
||||
{ "imagePath", JSON_VARIANT_STRING, json_dispatch_path, offsetof(UserRecord, image_path), 0 },
|
||||
{ "uid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, uid), 0 },
|
||||
{ "gid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, gid), 0 },
|
||||
@@ -1612,6 +1614,7 @@ int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_fla
|
||||
{ "cifsDomain", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_domain), JSON_SAFE },
|
||||
{ "cifsUserName", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_user_name), JSON_SAFE },
|
||||
{ "cifsService", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_service), JSON_SAFE },
|
||||
{ "cifsExtraMountOptions", JSON_VARIANT_STRING, json_dispatch_string, offsetof(UserRecord, cifs_extra_mount_options), 0 },
|
||||
{ "imagePath", JSON_VARIANT_STRING, json_dispatch_path, offsetof(UserRecord, image_path), 0 },
|
||||
{ "homeDirectory", JSON_VARIANT_STRING, json_dispatch_home_directory, offsetof(UserRecord, home_directory), 0 },
|
||||
{ "uid", JSON_VARIANT_UNSIGNED, json_dispatch_uid_gid, offsetof(UserRecord, uid), 0 },
|
||||
|
||||
@@ -304,6 +304,7 @@ typedef struct UserRecord {
|
||||
char *cifs_domain;
|
||||
char *cifs_user_name;
|
||||
char *cifs_service;
|
||||
char *cifs_extra_mount_options;
|
||||
|
||||
char *image_path;
|
||||
char *image_path_auto; /* when none is configured explicitly, this is where we place the implicit image */
|
||||
|
||||
Reference in New Issue
Block a user