|
Packit Service |
cbae08 |
/*
|
|
Packit Service |
cbae08 |
* Copyright 2011 Oracle. All rights reserved.
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* This file is part of fedfs-utils.
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* fedfs-utils is free software; you can redistribute it and/or modify
|
|
Packit Service |
cbae08 |
* it under the terms of the GNU General Public License version 2.0 as
|
|
Packit Service |
cbae08 |
* published by the Free Software Foundation.
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* fedfs-utils is distributed in the hope that it will be useful, but
|
|
Packit Service |
cbae08 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
cbae08 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
cbae08 |
* GNU General Public License version 2.0 for more details.
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
cbae08 |
* version 2.0 along with fedfs-utils. If not, see:
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
cbae08 |
#include <config.h>
|
|
Packit Service |
cbae08 |
#endif
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
#include <sys/types.h>
|
|
Packit Service |
cbae08 |
#include <sys/stat.h>
|
|
Packit Service |
cbae08 |
#include <sys/socket.h>
|
|
Packit Service |
cbae08 |
#include <sys/mount.h>
|
|
Packit Service |
cbae08 |
#include <sys/wait.h>
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
#include <stdbool.h>
|
|
Packit Service |
cbae08 |
#include <string.h>
|
|
Packit Service |
cbae08 |
#include <stdlib.h>
|
|
Packit Service |
cbae08 |
#include <unistd.h>
|
|
Packit Service |
cbae08 |
#include <stdio.h>
|
|
Packit Service |
cbae08 |
#include <libgen.h>
|
|
Packit Service |
cbae08 |
#include <errno.h>
|
|
Packit Service |
cbae08 |
#include <getopt.h>
|
|
Packit Service |
cbae08 |
#include <locale.h>
|
|
Packit Service |
cbae08 |
#include <netdb.h>
|
|
Packit Service |
cbae08 |
#include <langinfo.h>
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
#include "fedfs-nls.h"
|
|
Packit Service |
cbae08 |
#include "fedfs-token.h"
|
|
Packit Service |
cbae08 |
#include "fedfs-getsrvinfo.h"
|
|
Packit Service |
cbae08 |
#include "fedfs-gpl-boiler.h"
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Name of SRV record containing NFSv4 FedFS root
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Export pathname of NFSv4 FedFS root
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
#define FEDFS_NFS_EXPORTPATH "/.domainroot"
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
static char *progname;
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Display usage message
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
static void
|
|
Packit Service |
cbae08 |
fedfs_map_usage(void)
|
|
Packit Service |
cbae08 |
{
|
|
Packit Service |
cbae08 |
printf(_("\nUsage: %s [domain]\n\n"), progname);
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
printf("%s", fedfs_gpl_boilerplate);
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Construct an NFSv4 map entry for "domainname" with one server
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* @param si single-entry list of SRV records
|
|
Packit Service |
cbae08 |
* @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
|
Packit Service |
cbae08 |
* @return command exit status
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
static int fedfs_map_nfs4_oneserver(struct srvinfo *si, const char *domainname)
|
|
Packit Service |
cbae08 |
{
|
|
Packit Service |
cbae08 |
printf("-fstype=nfs,vers=4,fg");
|
|
Packit Service |
cbae08 |
if (si->si_port != 2049)
|
|
Packit Service |
cbae08 |
printf(",port=%u", si->si_port);
|
|
Packit Service |
cbae08 |
printf(" %s:%s/%s\n", si->si_target, FEDFS_NFS_EXPORTPATH, domainname);
|
|
Packit Service |
cbae08 |
return 0;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Construct an NFSv4 map entry for "domainname" with multiple servers
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* @param si list of SRV records for requested FedFS domain
|
|
Packit Service |
cbae08 |
* @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
|
Packit Service |
cbae08 |
* @return command exit status
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
static int fedfs_map_nfs4_replicas(struct srvinfo *si, const char *domainname)
|
|
Packit Service |
cbae08 |
{
|
|
Packit Service |
cbae08 |
struct srvinfo *cur;
|
|
Packit Service |
cbae08 |
unsigned short port;
|
|
Packit Service |
cbae08 |
_Bool comma;
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/*
|
|
Packit Service |
cbae08 |
* Unfortunately our automounter can't handle a list of
|
|
Packit Service |
cbae08 |
* replicas where the various servers live on different
|
|
Packit Service |
cbae08 |
* ports from one another.
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
port = si->si_port;
|
|
Packit Service |
cbae08 |
for (cur = si; cur != NULL; cur = cur->si_next)
|
|
Packit Service |
cbae08 |
if (cur->si_port != port) {
|
|
Packit Service |
cbae08 |
fprintf(stderr, _("%s: Replicas on different ports not supported\n"),
|
|
Packit Service |
cbae08 |
progname);
|
|
Packit Service |
cbae08 |
return 1;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
if (port != 2049)
|
|
Packit Service |
cbae08 |
printf("-fstype=nfs,vers=4,fg,port=%u ", port);
|
|
Packit Service |
cbae08 |
else
|
|
Packit Service |
cbae08 |
printf("-fstype=nfs,vers=4,fg ");
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/*
|
|
Packit Service |
cbae08 |
* Note that the export path is required to be indentical
|
|
Packit Service |
cbae08 |
* for all domain root servers for this domain.
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
for (comma = false, cur = si; cur != NULL; cur = cur->si_next) {
|
|
Packit Service |
cbae08 |
if (comma)
|
|
Packit Service |
cbae08 |
printf(",");
|
|
Packit Service |
cbae08 |
printf("%s(%u)", cur->si_target, cur->si_weight);
|
|
Packit Service |
cbae08 |
comma = true;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
printf(":%s/%s\n", FEDFS_NFS_EXPORTPATH, domainname);
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
return 0;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Construct an NFSv4 map entry for "domainname"
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
|
Packit Service |
cbae08 |
* @return command exit status
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
static int fedfs_map_nfs4(const char *domainname)
|
|
Packit Service |
cbae08 |
{
|
|
Packit Service |
cbae08 |
struct srvinfo *cur, *si = NULL;
|
|
Packit Service |
cbae08 |
unsigned int count;
|
|
Packit Service |
cbae08 |
int error, result;
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
result = 1;
|
|
Packit Service |
cbae08 |
error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
|
|
Packit Service |
cbae08 |
switch (error) {
|
|
Packit Service |
cbae08 |
case ESI_SUCCESS:
|
|
Packit Service |
cbae08 |
break;
|
|
Packit Service |
cbae08 |
case ESI_NONAME:
|
|
Packit Service |
cbae08 |
fprintf(stderr, _("%s: Domain name %s not found\n"),
|
|
Packit Service |
cbae08 |
progname, domainname);
|
|
Packit Service |
cbae08 |
goto out;
|
|
Packit Service |
cbae08 |
case ESI_SERVICE:
|
|
Packit Service |
cbae08 |
fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
|
|
Packit Service |
cbae08 |
progname, domainname);
|
|
Packit Service |
cbae08 |
goto out;
|
|
Packit Service |
cbae08 |
default:
|
|
Packit Service |
cbae08 |
fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
|
|
Packit Service |
cbae08 |
progname, domainname, gsi_strerror(error));
|
|
Packit Service |
cbae08 |
goto out;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
for (count = 0, cur = si; cur != NULL; cur = cur->si_next)
|
|
Packit Service |
cbae08 |
count++;
|
|
Packit Service |
cbae08 |
if (count == 1)
|
|
Packit Service |
cbae08 |
result = fedfs_map_nfs4_oneserver(si, domainname);
|
|
Packit Service |
cbae08 |
else
|
|
Packit Service |
cbae08 |
result = fedfs_map_nfs4_replicas(si, domainname);
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
out:
|
|
Packit Service |
cbae08 |
freesrvinfo(si);
|
|
Packit Service |
cbae08 |
return result;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
/**
|
|
Packit Service |
cbae08 |
* Program entry point
|
|
Packit Service |
cbae08 |
*
|
|
Packit Service |
cbae08 |
* @param argc count of command line arguments
|
|
Packit Service |
cbae08 |
* @param argv array of NUL-terminated C strings containing command line arguments
|
|
Packit Service |
cbae08 |
* @return program exit status
|
|
Packit Service |
cbae08 |
*/
|
|
Packit Service |
cbae08 |
int main(int argc, char *argv[])
|
|
Packit Service |
cbae08 |
{
|
|
Packit Service |
cbae08 |
(void)setlocale(LC_ALL, "");
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
progname = basename(argv[0]);
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
if (argc != 2) {
|
|
Packit Service |
cbae08 |
fedfs_map_usage();
|
|
Packit Service |
cbae08 |
return 1;
|
|
Packit Service |
cbae08 |
}
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
if (strcmp(progname, "fedfs-map-nfs4") == 0)
|
|
Packit Service |
cbae08 |
return fedfs_map_nfs4(argv[1]);
|
|
Packit Service |
cbae08 |
#ifdef EXAMPLE
|
|
Packit Service |
cbae08 |
/* CIFS support might plug in here */
|
|
Packit Service |
cbae08 |
else if (strcmp(progname, "fedfs-map-cifs") == 0)
|
|
Packit Service |
cbae08 |
return fedfs_map_cifs(argv[1]);
|
|
Packit Service |
cbae08 |
#endif
|
|
Packit Service |
cbae08 |
|
|
Packit Service |
cbae08 |
fprintf(stderr, _("%s: Unsupported file system type\n"), progname);
|
|
Packit Service |
cbae08 |
return 1;
|
|
Packit Service |
cbae08 |
}
|