X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffindlib%2Ffstype.c;h=059ae048b41f931d64b32c1e59de821b3bf9b660;hb=f8f848fdb5aace95292d905dc60fe0de45521859;hp=a23d9aaa651672fa2a8582454b8adf921130156c;hpb=99e6d4a3be04f173b4bcd6ec77e1d1d63a3f2153;p=bacula%2Fbacula diff --git a/bacula/src/findlib/fstype.c b/bacula/src/findlib/fstype.c index a23d9aaa65..059ae048b4 100644 --- a/bacula/src/findlib/fstype.c +++ b/bacula/src/findlib/fstype.c @@ -44,22 +44,23 @@ "HAVE_LINUX_OS\n" \ "HAVE_NETBSD_OS\n" \ "HAVE_OPENBSD_OS\n" \ - "HAVE_SUN_OS\n" -#define POOLMEM char -#define bstrdup strdup -#define Dmsg0(n,s) fprintf(stderr, s); -#define Dmsg1(n,s,a1) fprintf(stderr, s, a1); -#define Dmsg2(n,s,a1,a2) fprintf(stderr, s, a1, a2); + "HAVE_SUN_OS\n" \ + "HAVE_WIN32\n" +#define false 0 +#define true 1 +#define bstrncpy strncpy +#define Dmsg0(n,s) fprintf(stderr, s) +#define Dmsg1(n,s,a1) fprintf(stderr, s, a1) +#define Dmsg2(n,s,a1,a2) fprintf(stderr, s, a1, a2) #endif /* * These functions should be implemented for each OS * - * POOLMEM *fstype(const char *fname); + * bool fstype(const char *fname, char *fs, int fslen); */ #if defined(HAVE_DARWIN_OS) \ || defined(HAVE_FREEBSD_OS ) \ - || defined(HAVE_NETBSD_OS) \ || defined(HAVE_OPENBSD_OS) #include @@ -75,7 +76,25 @@ bool fstype(const char *fname, char *fs, int fslen) Dmsg1(50, "statfs() failed for \"%s\"\n", fname); return false; } +#elif defined(HAVE_NETBSD_OS) +#include +#include +#ifdef HAVE_SYS_STATVFS_H +#include +#else +#define statvfs statfs +#endif +bool fstype(const char *fname, char *fs, int fslen) +{ + struct statvfs st; + if (statvfs(fname, &st) == 0) { + bstrncpy(fs, st.f_fstypename, fslen); + return true; + } + Dmsg1(50, "statfs() failed for \"%s\"\n", fname); + return false; +} #elif defined(HAVE_HPUX_OS) \ || defined(HAVE_IRIX_OS) @@ -110,7 +129,20 @@ bool fstype(const char *fname, char *fs, int fslen) */ switch (st.f_type) { -#if 0 /* These need confirmation */ + /* Known good values */ + case 0xef53: bstrncpy(fs, "ext2", fslen); return true; /* EXT2_SUPER_MAGIC */ + /* case 0xef53: ext2 and ext3 are the same */ /* EXT3_SUPER_MAGIC */ + case 0x3153464a: bstrncpy(fs, "jfs", fslen); return true; /* JFS_SUPER_MAGIC */ + case 0x5346544e: bstrncpy(fs, "ntfs", fslen); return true; /* NTFS_SB_MAGIC */ + case 0x9fa0: bstrncpy(fs, "proc", fslen); return true; /* PROC_SUPER_MAGIC */ + case 0x52654973: bstrncpy(fs, "reiserfs", fslen); return true; /* REISERFS_SUPER_MAGIC */ + case 0x58465342: bstrncpy(fs, "xfs", fslen); return true; /* XFS_SB_MAGIC */ + case 0x9fa2: bstrncpy(fs, "usbdevfs", fslen); return true; /* USBDEVICE_SUPER_MAGIC */ + case 0x62656572: bstrncpy(fs, "sysfs", fslen); return true; /* SYSFS_MAGIC */ + case 0x517B: bstrncpy(fs, "smbfs", fslen); return true; /* SMB_SUPER_MAGIC */ + case 0x9660: bstrncpy(fs, "iso9660", fslen); return true; /* ISOFS_SUPER_MAGIC */ + +#if 0 /* These need confirmation */ case 0xadf5: bstrncpy(fs, "adfs", fslen); return true; /* ADFS_SUPER_MAGIC */ case 0xadff: bstrncpy(fs, "affs", fslen); return true; /* AFFS_SUPER_MAGIC */ case 0x6B414653: bstrncpy(fs, "afs", fslen); return true; /* AFS_FS_MAGIC */ @@ -138,11 +170,9 @@ bool fstype(const char *fname, char *fs, int fslen) case 0x958458f6: bstrncpy(fs, "hugetlbfs", fslen); return true; /* HUGETLBFS_MAGIC */ case 0x12061983: bstrncpy(fs, "hwgfs", fslen); return true; /* HWGFS_MAGIC */ case 0x66726f67: bstrncpy(fs, "ibmasmfs", fslen); return true; /* IBMASMFS_MAGIC */ - case 0x9660: bstrncpy(fs, "iso9660", fslen); return true; /* ISOFS_SUPER_MAGIC */ case 0x9660: bstrncpy(fs, "isofs", fslen); return true; /* ISOFS_SUPER_MAGIC */ case 0x07c0: bstrncpy(fs, "jffs", fslen); return true; /* JFFS_MAGIC_SB_BITMASK */ case 0x72b6: bstrncpy(fs, "jffs2", fslen); return true; /* JFFS2_SUPER_MAGIC */ - case 0x3153464a: bstrncpy(fs, "jfs", fslen); return true; /* JFS_SUPER_MAGIC */ case 0x2468: bstrncpy(fs, "minix", fslen); return true; /* MINIX2_SUPER_MAGIC */ case 0x2478: bstrncpy(fs, "minix", fslen); return true; /* MINIX2_SUPER_MAGIC2 */ case 0x137f: bstrncpy(fs, "minix", fslen); return true; /* MINIX_SUPER_MAGIC */ @@ -151,42 +181,31 @@ bool fstype(const char *fname, char *fs, int fslen) case 0x4d44: bstrncpy(fs, "msdos", fslen); return true; /* MSDOS_SUPER_MAGIC */ case 0x564c: bstrncpy(fs, "ncpfs", fslen); return true; /* NCP_SUPER_MAGIC */ case 0x6969: bstrncpy(fs, "nfs", fslen); return true; /* NFS_SUPER_MAGIC */ - case 0x5346544e: bstrncpy(fs, "ntfs", fslen); return true; /* NTFS_SB_MAGIC */ case 0x9fa1: bstrncpy(fs, "openpromfs", fslen); return true; /* OPENPROM_SUPER_MAGIC */ case 0x6f70726f: bstrncpy(fs, "oprofilefs", fslen); return true; /* OPROFILEFS_MAGIC */ case 0xa0b4d889: bstrncpy(fs, "pfmfs", fslen); return true; /* PFMFS_MAGIC */ case 0x50495045: bstrncpy(fs, "pipfs", fslen); return true; /* PIPEFS_MAGIC */ - case 0x9fa0: bstrncpy(fs, "proc", fslen); return true; /* PROC_SUPER_MAGIC */ case 0x002f: bstrncpy(fs, "qnx4", fslen); return true; /* QNX4_SUPER_MAGIC */ case 0x858458f6: bstrncpy(fs, "ramfs", fslen); return true; /* RAMFS_MAGIC */ - case 0x52654973: bstrncpy(fs, "reiserfs", fslen); return true; /* REISERFS_SUPER_MAGIC */ case 0x7275: bstrncpy(fs, "romfs", fslen); return true; /* ROMFS_MAGIC */ case 0x858458f6: bstrncpy(fs, "rootfs", fslen); return true; /* RAMFS_MAGIC */ case 0x67596969: bstrncpy(fs, "rpc_pipefs", fslen); return true; /* RPCAUTH_GSSMAGIC */ - case 0x517B: bstrncpy(fs, "smbfs", fslen); return true; /* SMB_SUPER_MAGIC */ case 0x534F434B: bstrncpy(fs, "sockfs", fslen); return true; /* SOCKFS_MAGIC */ - case 0x62656572: bstrncpy(fs, "sysfs", fslen); return true; /* SYSFS_MAGIC */ case 0x012ff7b6: bstrncpy(fs, "sysv2", fslen); return true; /* SYSV2_SUPER_MAGIC */ case 0x012ff7b5: bstrncpy(fs, "sysv4", fslen); return true; /* SYSV4_SUPER_MAGIC */ case 0x858458f6: bstrncpy(fs, "tmpfs", fslen); return true; /* RAMFS_MAGIC */ case 0x01021994: bstrncpy(fs, "tmpfs", fslen); return true; /* TMPFS_MAGIC */ case 0x15013346: bstrncpy(fs, "udf", fslen); return true; /* UDF_SUPER_MAGIC */ case 0x00011954: bstrncpy(fs, "ufs", fslen); return true; /* UFS_MAGIC */ - case 0x9fa2: bstrncpy(fs, "usbdevfs", fslen); return true; /* USBDEVICE_SUPER_MAGIC */ case 0xa501FCF5: bstrncpy(fs, "vxfs", fslen); return true; /* VXFS_SUPER_MAGIC */ case 0x012ff7b4: bstrncpy(fs, "xenix", fslen); return true; /* XENIX_SUPER_MAGIC */ - case 0x58465342: bstrncpy(fs, "xfs", fslen); return true; /* XFS_SB_MAGIC */ case 0x012fd16d: bstrncpy(fs, "xiafs", fslen); return true; /* _XIAFS_SUPER_MAGIC */ - - case 0xef53: bstrncpy(fs, "ext2", fslen); return true; /* EXT2_SUPER_MAGIC */ - /* case 0xef53: ext2 and ext3 are the same */ /* EXT3_SUPER_MAGIC */ -#else /* Known good values */ #endif default: Dmsg2(10, "Unknown file system type \"0x%x\" for \"%s\".\n", st.f_type, - fname); - return false; + fname); + return false; } } Dmsg1(50, "statfs() failed for \"%s\"\n", fname); @@ -209,15 +228,70 @@ bool fstype(const char *fname, char *fs, int fslen) return false; } -#else /* No recognised OS */ +#elif defined (__digital__) && defined (__unix__) /* Tru64 */ +/* Tru64 */ +#include +#include bool fstype(const char *fname, char *fs, int fslen) { - Dmsg0(10, "!!! fstype() not implemented for this OS. !!!\n"); + struct statfs st; + if (statfs((char *)fname, &st) == 0) { + switch (st.f_type) { + /* Known good values */ + case 0xa: bstrncpy(fs, "advfs", fslen); return true; /* Tru64 AdvFS */ + case 0xe: bstrncpy(fs, "nfs", fslen); return true; /* Tru64 NFS */ + default: + Dmsg2(10, "Unknown file system type \"0x%x\" for \"%s\".\n", st.f_type, + fname); + return false; + } + } + Dmsg1(50, "statfs() failed for \"%s\"\n", fname); + return false; +} +/* Tru64 */ +#elif defined (HAVE_WIN32) +/* Windows */ + +bool fstype(const char *fname, char *fs, int fslen) +{ + DWORD componentlength; + DWORD fsflags; + CHAR rootpath[4]; + UINT oldmode; + BOOL result; + + /* Copy Drive Letter, colon, and backslash to rootpath */ + bstrncpy(rootpath, fname, sizeof(rootpath)); + + /* We don't want any popups if there isn't any media in the drive */ + oldmode = SetErrorMode(SEM_FAILCRITICALERRORS); + + result = GetVolumeInformation(rootpath, NULL, 0, NULL, &componentlength, &fsflags, fs, fslen); + + SetErrorMode(oldmode); + + if (result) { + /* Windows returns NTFS, FAT, etc. Make it lowercase to be consistent with other OSes */ + lcase(fs); + } else { + Dmsg2(10, "GetVolumeInformation() failed for \"%s\", Error = %d.\n", rootpath, GetLastError()); + } + + return result != 0; +} +/* Windows */ + +#else /* No recognised OS */ + +bool fstype(const char *fname, char *fs, int fslen) +{ + Dmsg0(10, "!!! fstype() not implemented for this OS. !!!\n"); #ifdef TEST_PROGRAM Dmsg1(10, "Please define one of the following when compiling:\n\n%s\n", - SUPPORTEDOSES); + SUPPORTEDOSES); exit(EXIT_FAILURE); #endif @@ -229,20 +303,21 @@ bool fstype(const char *fname, char *fs, int fslen) int main(int argc, char **argv) { char *p; + char fs[1000]; int status = 0; if (argc < 2) { p = (argc < 1) ? "fstype" : argv[0]; printf("usage:\t%s path ...\n" "\t%s prints the file system type and pathname of the paths.\n", - p, p); + p, p); return EXIT_FAILURE; } while (*++argv) { - if ((p = fstype(*argv)) == NULL) { - status = EXIT_FAILURE; + if (!fstype(*argv, fs, sizeof(fs))) { + status = EXIT_FAILURE; } else { - printf("%s\t%s\n", p, *argv); + printf("%s\t%s\n", fs, *argv); } } return status;