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* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 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 39char* 40fmtfs(struct stat* st) 41{ 42 return st->st_fstype; 43} 44 45#else 46 47#include <cdt.h> 48 49typedef struct Id_s 50{ 51 Dtlink_t link; 52 dev_t id; 53 char name[1]; 54} Id_t; 55 56char* 57fmtfs(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, Dthash); 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