*
* %W% (Berkeley) %G%
*
- * $Id: mount_aix.c,v 1.4.2.2 2002/01/21 00:49:45 ezk Exp $
+ * $Id: mount_aix.c,v 1.4.2.3 2002/06/21 22:40:45 ib42 Exp $
*
*/
int size, ret;
int real_size = sizeof(nfs_args_t); /* size passed to aix3_mkvp() */
char *real_args = data; /* args passed to aix3_mkvp() */
- char *host = strdup(fsname);
- char *rfs = strchr(host, ':');
- int free_rfs = 0;
+ char *host, *rfs, *idx;
+ int aix_type = type;
#ifdef HAVE_FS_NFS3
struct nfs_args v2args;
nfs_args_t *v3args = (nfs_args_t *) data;
+#ifdef MOUNT_TYPE_NFS3_BIS
+ struct aix42_nfs_args_bis v3args_bis;
+#endif /* MOUNT_TYPE_NFS3_BIS */
#endif /* HAVE_FS_NFS3 */
+ retry_ibm_stupid_service_pack:
#ifdef DEBUG
dlog("mount_aix3: fsname %s, dir %s, type %d", fsname, dir, type);
#endif /* DEBUG */
- switch (type) {
+#ifdef MOUNT_TYPE_NFS3_BIS
+ retry_ibm_stupid_service_pack:
+#endif /* MOUNT_TYPE_NFS3_BIS */
+ switch (aix_type) {
case MOUNT_TYPE_NFS:
v2args.pathconf = v3args->pathconf;
/* now set real_* stuff */
- real_size = sizeof(struct nfs_args);
+ real_size = sizeof(v2args);
real_args = (char *) &v2args;
case MOUNT_TYPE_NFS3:
- /* do nothing, because the nfs_args passed is already a v3 one */
+#ifdef MOUNT_TYPE_NFS3_BIS
+ case MOUNT_TYPE_NFS3_BIS:
/* just fall through */
+ if (aix_type == MOUNT_TYPE_NFS3_BIS) {
+ memmove((voidp) &v3args_bis.addr, (voidp) &v3args->addr, sizeof(struct sockaddr_in));
+ v3args_bis.u0 = v3args->u0;
+ v3args_bis.proto = v3args->proto;
+ v3args_bis.hostname = v3args->hostname;
+ v3args_bis.netname = v3args->netname;
+ v3args_bis.fh = v3args->fh;
+ v3args_bis.flags = v3args->flags;
+ v3args_bis.wsize = v3args->wsize;
+ v3args_bis.rsize = v3args->rsize;
+ v3args_bis.timeo = v3args->timeo;
+ v3args_bis.retrans = v3args->retrans;
+ v3args_bis.acregmin = v3args->acregmin;
+ v3args_bis.acregmax = v3args->acregmax;
+ v3args_bis.acdirmin = v3args->acdirmin;
+ v3args_bis.acdirmax = v3args->acdirmax;
+ v3args_bis.u14 = v3args->u14;
+ v3args_bis.pathconf = v3args->pathconf;
+ /* now set real_* stuff */
+ real_size = sizeof(v3args_bis);
+ real_args = (char *) &v3args_bis;
+ }
+#endif /* MOUNT_TYPE_NFS3_BIS */
#endif /* HAVE_FS_NFS3 */
- if (rfs) {
- *rfs++ = '\0';
+ idx = strchr(fsname, ':');
+ if (idx) {
+ *idx = '\0';
+ rfs = strdup(idx + 1);
+ host = strdup(fsname);
+ *idx = ':';
} else {
- rfs = host;
- free_rfs = 1;
+ rfs = strdup(fsname);
host = strdup(am_get_hostname());
}
size = aix3_mkvp(buf, type, flags, rfs, dir, host,
real_args, real_size, mnt_opts);
- if (free_rfs)
- XFREE(rfs);
+ XFREE(rfs);
XFREE(host);
- break;
+ break;
case MOUNT_TYPE_UFS:
/* Need to open block device and extract log device info from sblk. */
}
ret = vmount((struct vmount *)buf, size);
- if (ret < 0)
+ if (ret < 0) {
+#ifdef MOUNT_TYPE_NFS3_BIS
+ if (aix_type == MOUNT_TYPE_NFS3 && errno == EINVAL) {
+ aix_type = MOUNT_TYPE_NFS3_BIS;
+#ifdef DEBUG
+ dlog("mount_aix3: retrying with alternate nfs3_args structure");
+#endif /* DEBUG */
+ goto retry_ibm_stupid_service_pack;
+ }
+#endif /* MOUNT_TYPE_NFS3_BIS */
plog(XLOG_ERROR, "mount_aix3: vmount failed with errno %d", errno);
+ }
return ret;
}
--- /dev/null
+/*
+ * Copyright (c) 1997-2002 Erez Zadok
+ * Copyright (c) 1990 Jan-Simon Pendry
+ * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Jan-Simon Pendry at Imperial College, London.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgment:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * %W% (Berkeley) %G%
+ *
+ * $Id: nfs_prot_aix5_1.h,v 1.1.2.1 2002/06/21 22:40:46 ib42 Exp $
+ *
+ */
+
+#ifndef _AMU_NFS_PROT_H
+#define _AMU_NFS_PROT_H
+
+
+/*
+ * AIX 4.3 and newer support NFS V.3, hence the separate header.
+ */
+
+#ifdef HAVE_RPCSVC_NFS_PROT_H
+# include <rpcsvc/nfs_prot.h>
+#endif /* HAVE_RPCSVC_NFS_PROT_H */
+#ifdef HAVE_NFS_NFSV2_H
+# include <nfs/nfsv2.h>
+#endif /* HAVE_NFS_NFSV2_H */
+#ifdef HAVE_NFS_RPCV2_H
+# include <nfs/rpcv2.h>
+#endif /* HAVE_NFS_RPCV2_H */
+#ifdef HAVE_SYS_FS_NFS_H
+# include <sys/fs/nfs.h>
+#endif /* HAVE_SYS_FS_NFS_H */
+#ifdef HAVE_RPCSVC_MOUNT_H
+# include <rpcsvc/mount.h>
+#endif /* HAVE_RPCSVC_MOUNT_H */
+
+
+/*
+ * MACROS
+ */
+
+#ifndef MNTPATHLEN
+# define MNTPATHLEN 1024
+#endif /* not MNTPATHLEN */
+#ifndef MNTNAMLEN
+# define MNTNAMLEN 255
+#endif /* not MNTNAMLEN */
+
+/* map field names */
+#define ex_dir ex_name
+#define gr_name g_name
+#define gr_next g_next
+#define ml_directory ml_path
+#define ml_hostname ml_name
+#define ml_next ml_nxt
+
+#define dr_drok_u diropres
+#define ca_attributes attributes
+#define ca_where where
+#define da_fhandle dir
+#define da_name name
+#define dl_entries entries
+#define dl_eof eof
+#define dr_status status
+#define dr_u diropres_u
+#define drok_attributes attributes
+#define drok_fhandle file
+#define fh_data data
+#define la_fhandle from
+#define la_to to
+#define na_atime atime
+#define na_blocks blocks
+#define na_blocksize blocksize
+#define na_ctime ctime
+#define na_fileid fileid
+#define na_fsid fsid
+#define na_gid gid
+#define na_mode mode
+#define na_mtime mtime
+#define na_nlink nlink
+#define na_rdev rdev
+#define na_size size
+#define na_type type
+#define na_uid uid
+#define ne_cookie cookie
+#define ne_fileid fileid
+#define ne_name name
+#define ne_nextentry nextentry
+#define ns_attr_u attributes
+#define ns_status status
+#define ns_u attrstat_u
+#define nt_seconds seconds
+#define nt_useconds useconds
+#define ra_count count
+#define ra_fhandle file
+#define ra_offset offset
+#define ra_totalcount totalcount
+#define raok_attributes attributes
+#define raok_len_u data_len
+#define raok_u data
+#define raok_val_u data_val
+#define rda_cookie cookie
+#define rda_count count
+#define rda_fhandle dir
+#define rdr_reply_u reply
+#define rdr_status status
+#define rdr_u readdirres_u
+#define rlr_data_u data
+#define rlr_status status
+#define rlr_u readlinkres_u
+#define rna_from from
+#define rna_to to
+#define rr_reply_u reply
+#define rr_status status
+#define rr_u readres_u
+#define sa_atime atime
+#define sa_gid gid
+#define sa_mode mode
+#define sa_mtime mtime
+#define sa_size size
+#define sa_uid uid
+#define sag_attributes attributes
+#define sag_fhandle file
+#define sfr_reply_u reply
+#define sfr_status status
+#define sfr_u statfsres_u
+#define sfrok_bavail bavail
+#define sfrok_bfree bfree
+#define sfrok_blocks blocks
+#define sfrok_bsize bsize
+#define sfrok_tsize tsize
+#define sla_attributes attributes
+#define sla_from from
+#define sla_to to
+#define wra_beginoffset beginoffset
+#define wra_fhandle file
+#define wra_len_u data_len
+#define wra_offset offset
+#define wra_totalcount totalcount
+#define wra_u data
+#define wra_val_u data_val
+
+
+/*
+ * TYPEDEFS:
+ */
+typedef char *dirpath;
+typedef char *name;
+typedef struct exports *exports;
+typedef struct exports exportnode;
+typedef struct groups *groups;
+typedef struct groups groupnode;
+typedef struct mountlist *mountlist;
+
+typedef attrstat nfsattrstat;
+typedef createargs nfscreateargs;
+typedef dirlist nfsdirlist;
+typedef diropargs nfsdiropargs;
+typedef diropokres nfsdiropokres;
+typedef diropres nfsdiropres;
+typedef entry nfsentry;
+typedef fattr nfsfattr;
+typedef ftype nfsftype;
+typedef linkargs nfslinkargs;
+typedef readargs nfsreadargs;
+typedef readdirargs nfsreaddirargs;
+typedef readdirres nfsreaddirres;
+typedef readlinkres nfsreadlinkres;
+typedef readokres nfsreadokres;
+typedef readres nfsreadres;
+typedef renameargs nfsrenameargs;
+typedef sattr nfssattr;
+typedef sattrargs nfssattrargs;
+typedef statfsokres nfsstatfsokres;
+typedef statfsres nfsstatfsres;
+typedef symlinkargs nfssymlinkargs;
+typedef writeargs nfswriteargs;
+
+
+/*
+ * EXTERNALS:
+ */
+
+
+/*
+ * STRUCTURES:
+ */
+
+/*
+ * AIX 4.3 has NFS V3, but it is undefined in the header files.
+ * so I define everything that's needed for NFS V3 here.
+ */
+#ifdef MNT_NFS3
+
+#define FHSIZE3 64 /* size in bytes of a file handle (v3) */
+#define NFS3_FHSIZE 64
+#define MOUNTVERS3 ((unsigned long)(3))
+#define NFS_V3 ((unsigned long)(3))
+
+#if 0
+struct nfs_fh3 {
+ u_int len;
+ char val[64]; /* !!! */
+};
+#endif
+
+struct aix42_nfs_args {
+ struct sockaddr_in addr; /* server address and port */
+ caddr_t u0; /* ??? UNKNOWN ??? */
+ unsigned long proto; /* IPPROTO_TCP/IPPROTO_UDP */
+ char *hostname; /* pointer to hostname? */
+ char *netname; /* pointer to netname? */
+ caddr_t fh; /* pointer to NFS v3 fh? */
+ unsigned long junk; /* IBM sux, IBM sux, IBM sux... */
+ unsigned long flags; /* flags */
+ unsigned long wsize; /* wsize */
+ unsigned long rsize; /* rsize */
+ unsigned long timeo; /* timeo */
+ unsigned long retrans; /* retrans */
+ unsigned long acregmin; /* acregmin */
+ unsigned long acregmax; /* acregmax */
+ unsigned long acdirmin; /* acdirmin */
+ unsigned long acdirmax; /* acdirmax */
+ unsigned long u14; /* ??? UNKNOWN ??? */
+ struct pathcnf *pathconf; /* pathconf */
+};
+
+typedef struct {
+ u_int fhandle3_len;
+ char *fhandle3_val;
+} fhandle3;
+
+enum mountstat3 {
+ MNT3_OK = 0,
+ MNT3ERR_PERM = 1,
+ MNT3ERR_NOENT = 2,
+ MNT3ERR_IO = 5,
+ MNT3ERR_ACCES = 13,
+ MNT3ERR_NOTDIR = 20,
+ MNT3ERR_INVAL = 22,
+ MNT3ERR_NAMETOOLONG = 63,
+ MNT3ERR_NOTSUPP = 10004,
+ MNT3ERR_SERVERFAULT = 10006
+};
+typedef enum mountstat3 mountstat3;
+
+struct mountres3_ok {
+ fhandle3 fhandle;
+ struct {
+ u_int auth_flavors_len;
+ int *auth_flavors_val;
+ } auth_flavors;
+};
+typedef struct mountres3_ok mountres3_ok;
+
+struct mountres3 {
+ mountstat3 fhs_status;
+ union {
+ mountres3_ok mountinfo;
+ } mountres3_u;
+};
+typedef struct mountres3 mountres3;
+
+struct nfs_fh3 {
+ u_int fh3_length;
+ union nfs_fh3_u {
+ struct nfs_fh3_i {
+ fhandle_t fh3_i;
+ } nfs_fh3_i;
+ char data[NFS3_FHSIZE];
+ } fh3_u;
+};
+typedef struct nfs_fh3 nfs_fh3;
+
+#endif /* MNT_NFS3 */
+
+/*
+ * EXTERNALS:
+ */
+extern bool_t xdr_groups(XDR *xdrs, groups *objp);
+extern char *yperr_string (int incode);
+
+#endif /* not _AMU_NFS_PROT_H */