1 /*
2 * Copyright (c) 1990 Jan-Simon Pendry
3 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
4 * Copyright (c) 1990, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Jan-Simon Pendry at Imperial College, London.
9 *
10 * %sccs.include.redist.c%
11 *
12 * @(#)mtab_aix.c 8.1 (Berkeley) 06/06/93
13 *
14 * $Id: mtab_aix.c,v 5.2.2.1 1992/02/09 15:10:07 jsp beta $
15 *
16 */
17
18 #include "am.h"
19
20 #ifdef READ_MTAB_AIX3_STYLE
21
22 #include <sys/mntctl.h>
23 #include <sys/vmount.h>
24
mnt_dup(mp)25 static struct mntent *mnt_dup(mp)
26 struct vmount *mp;
27 {
28 struct mntent *new_mp = ALLOC(mntent);
29
30 char *ty;
31 new_mp->mnt_fsname = strdup(vmt2dataptr(mp, VMT_OBJECT));
32 new_mp->mnt_dir = strdup(vmt2dataptr(mp, VMT_STUB));
33 new_mp->mnt_opts = strdup(vmt2dataptr(mp, VMT_ARGS));
34 switch (mp->vmt_gfstype) {
35 case MNT_JFS: ty = MTAB_TYPE_UFS; break;
36 case MNT_NFS:
37 ty = MTAB_TYPE_NFS;
38 new_mp->mnt_fsname = str3cat(new_mp->mnt_fsname,
39 vmt2dataptr(mp, VMT_HOSTNAME),
40 ":", new_mp->mnt_fsname);
41 break;
42 default: ty = "unknown"; break;
43 }
44 new_mp->mnt_type = strdup(ty);
45 new_mp->mnt_passno = mp->vmt_vfsnumber;
46 new_mp->mnt_freq = 0;
47
48 return new_mp;
49 }
50
51 /*
52 * Read a mount table into memory
53 */
read_mtab(fs)54 mntlist *read_mtab(fs)
55 char *fs;
56 {
57 mntlist **mpp, *mhp;
58
59 int i;
60 char *mntinfo = 0, *cp;
61 struct vmount *vp;
62 int ret;
63
64 /*
65 * First figure out size of mount table
66 * and allocate space for a copy...
67 * Then get mount table for real.
68 */
69 ret = mntctl(MCTL_QUERY, sizeof(i), &i);
70 if (ret == 0) {
71 mntinfo = xmalloc(i);
72 ret = mntctl(MCTL_QUERY, i, mntinfo);
73 }
74
75 if (ret <= 0) {
76 plog(XLOG_ERROR, "mntctl: %m");
77 goto out;
78 }
79 #ifdef DEBUG
80 /*dlog("mntctl returns %d structures", ret);*/
81 #endif /* DEBUG */
82
83 mpp = &mhp;
84 for (i = 0, cp = mntinfo; i < ret; i++, cp += vp->vmt_length) {
85 vp = (struct vmount *) cp;
86
87 /*
88 * Allocate a new slot
89 */
90 *mpp = ALLOC(mntlist);
91
92 /*
93 * Copy the data returned by mntctl
94 */
95 (*mpp)->mnt = mnt_dup(vp);
96
97 /*
98 * Move to next pointer
99 */
100 mpp = &(*mpp)->mnext;
101 }
102
103 *mpp = 0;
104
105 out:
106 if (mntinfo)
107 free(mntinfo);
108 return mhp;
109 }
110
111 #endif /* READ_MTAB_AIX3_STYLE */
112