Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/string/fmtfs.c
1810 views
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 <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
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*
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*
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
102