home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Id: ufs_ops.c,v 5.1.1.2 90/01/11 17:22:09 jsp Exp Locker: jsp $
- *
- * 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 are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Imperial College of Science, Technology and Medicine, London, UK.
- * The names of the College and University may not be used to endorse
- * or promote products derived from this software without specific
- * prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * %W% (Berkeley) %G%
- */
-
- #include "am.h"
-
- #ifdef HAS_UFS
-
- #include <sys/stat.h>
- #ifdef NFS_3
- typedef nfs_fh fhandle_t;
- #endif
- #include <sys/mount.h>
-
- #ifdef UFS_HDR
- #include UFS_HDR
- #endif
-
- /*
- * UN*X file system
- */
-
- /*
- * UFS needs local filesystem and device.
- */
- static int ufs_match(fo)
- am_opts *fo;
- {
- if (!fo->opt_dev) {
- plog(XLOG_USER, "ufs: no device specified");
- return 0;
- }
- /*
- * Determine magic cookie to put in mtab
- */
- fo->fs_mtab = strealloc(fo->fs_mtab, fo->opt_dev);
- #ifdef DEBUG
- dlog("UFS: mounting device \"%s\" on \"%s\"",
- fo->opt_dev, fo->opt_fs);
- #endif
-
- return 1;
- }
-
- static mount_ufs(dir, fs_name, opts)
- char *dir;
- char *fs_name;
- char *opts;
- {
- struct ufs_args ufs_args;
- struct mntent mnt;
- int flags;
-
- /*
- * Figure out the name of the file system type.
- */
- #ifdef M_NEWTYPE
- char *type = MOUNT_TYPE_UFS;
- #else
- int type = MOUNT_TYPE_UFS;
- #endif
-
- bzero((voidp) &ufs_args, sizeof(ufs_args)); /* Paranoid */
-
- /*
- * Fill in the mount structure
- */
- mnt.mnt_dir = dir;
- mnt.mnt_fsname = fs_name;
- mnt.mnt_type = MTAB_TYPE_UFS;
- mnt.mnt_opts = opts;
- mnt.mnt_freq = 1;
- mnt.mnt_passno = 2;
-
- flags = compute_mount_flags(&mnt);
-
- #ifdef ULTRIX_HACK
- ufs_args.ufs_flags = flags;
- ufs_args.ufs_pgthresh = 64; /* 64K - XXX */
- flags &= M_RDONLY;
- #else
- ufs_args.fspec = fs_name;
- #endif
-
- /*
- * Call generic mount routine
- */
- return mount_fs(&mnt, flags, (caddr_t) &ufs_args, 0, type);
- }
-
- /*ARGSUSED*/
- static int ufs_mount(mp)
- am_node *mp;
- {
- mntfs *mf = mp->am_mnt;
-
- int error;
-
- error = mount_ufs(mf->mf_mount, mf->mf_info, mf->mf_fo->opt_opts);
- if (error) {
- errno = error;
- plog(XLOG_ERROR, "mount_ufs: %m");
- return error;
- }
-
- return 0;
- }
-
- static int ufs_umount(mp)
- am_node *mp;
- {
- mntfs *mf = mp->am_mnt;
-
- return UMOUNT_FS(mf->mf_mount);
- }
-
- /*
- * Ops structure
- */
- am_ops ufs_ops = {
- "ufs",
- ufs_match,
- 0, /* ufs_init */
- ufs_mount,
- ufs_umount,
- efs_lookuppn,
- efs_readdir,
- 0, /* ufs_readlink */
- 0, /* ufs_mounted */
- 0, /* ufs_umounted */
- find_afs_srvr,
- FS_MKMNT|FS_NOTIMEOUT|FS_UBACKGROUND|FS_AMQINFO,
- &afs_srvr_list,
- };
-
- #endif /* HAS_UFS */
-