1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #pragma prototyped
23 
24 /*
25  * Glenn Fowler
26  * AT&T Bell Laboratories
27  *
28  * return fs type string given stat
29  */
30 
31 #include <ast.h>
32 #include <ls.h>
33 #include <mnt.h>
34 
35 #include "FEATURE/fs"
36 
37 #if _str_st_fstype
38 
39 char*
fmtfs(struct stat * st)40 fmtfs(struct stat* st)
41 {
42 	return st->st_fstype;
43 }
44 
45 #else
46 
47 #include <cdt.h>
48 
49 typedef struct Id_s
50 {
51 	Dtlink_t	link;
52 	dev_t		id;
53 	char		name[1];
54 } Id_t;
55 
56 char*
fmtfs(struct stat * st)57 fmtfs(struct stat* st)
58 {
59 	register Id_t*		ip;
60 	register void*		mp;
61 	register Mnt_t*		mnt;
62 	register char*		s;
63 	struct stat		rt;
64 	char*			buf;
65 
66 	static Dt_t*		dict;
67 	static Dtdisc_t		disc;
68 
69 	if (!dict)
70 	{
71 		disc.key = offsetof(Id_t, id);
72 		disc.size = sizeof(dev_t);
73 		dict = dtopen(&disc, Dtset);
74 	}
75 	else if (ip = (Id_t*)dtmatch(dict, &st->st_dev))
76 		return ip->name;
77 	s = FS_default;
78 	if (mp = mntopen(NiL, "r"))
79 	{
80 		while ((mnt = mntread(mp)) && (stat(mnt->dir, &rt) || rt.st_dev != st->st_dev));
81 		if (mnt && mnt->type)
82 			s = mnt->type;
83 	}
84 	if (!dict || !(ip = newof(0, Id_t, 1, strlen(s))))
85 	{
86 		if (!mp)
87 			return s;
88 		buf = fmtbuf(strlen(s) + 1);
89 		strcpy(buf, s);
90 		mntclose(mp);
91 		return buf;
92 	}
93 	strcpy(ip->name, s);
94 	if (mp)
95 		mntclose(mp);
96 	dtinsert(dict, ip);
97 	return ip->name;
98 }
99 
100 #endif
101