chiark / gitweb /
[PATCH] udev_volume_id: volume_id version 034
[elogind.git] / extras / volume_id / volume_id / ufs / ufs.c
index bab1d4cfadc1e25710824696d7b64c6416a3248e..12672ffe01589d320a7dab344c265c4891570987 100644 (file)
 #include "../util.h"
 #include "ufs.h"
 
+struct ufs_super_block {
+       __u32   fs_link;
+       __u32   fs_rlink;
+       __u32   fs_sblkno;
+       __u32   fs_cblkno;
+       __u32   fs_iblkno;
+       __u32   fs_dblkno;
+       __u32   fs_cgoffset;
+       __u32   fs_cgmask;
+       __u32   fs_time;
+       __u32   fs_size;
+       __u32   fs_dsize;
+       __u32   fs_ncg; 
+       __u32   fs_bsize;
+       __u32   fs_fsize;
+       __u32   fs_frag;
+       __u32   fs_minfree;
+       __u32   fs_rotdelay;
+       __u32   fs_rps; 
+       __u32   fs_bmask;
+       __u32   fs_fmask;
+       __u32   fs_bshift;
+       __u32   fs_fshift;
+       __u32   fs_maxcontig;
+       __u32   fs_maxbpg;
+       __u32   fs_fragshift;
+       __u32   fs_fsbtodb;
+       __u32   fs_sbsize;
+       __u32   fs_csmask;
+       __u32   fs_csshift;
+       __u32   fs_nindir;
+       __u32   fs_inopb;
+       __u32   fs_nspf;
+       __u32   fs_optim;
+       __u32   fs_npsect_state;
+       __u32   fs_interleave;
+       __u32   fs_trackskew;
+       __u32   fs_id[2];
+       __u32   fs_csaddr;
+       __u32   fs_cssize;
+       __u32   fs_cgsize;
+       __u32   fs_ntrak;
+       __u32   fs_nsect;
+       __u32   fs_spc; 
+       __u32   fs_ncyl;
+       __u32   fs_cpg;
+       __u32   fs_ipg;
+       __u32   fs_fpg;
+       struct ufs_csum {
+               __u32   cs_ndir;
+               __u32   cs_nbfree;
+               __u32   cs_nifree;
+               __u32   cs_nffree;
+       } __attribute__((__packed__)) fs_cstotal;
+       __s8    fs_fmod;
+       __s8    fs_clean;
+       __s8    fs_ronly;
+       __s8    fs_flags;
+       union {
+               struct {
+                       __s8    fs_fsmnt[512];
+                       __u32   fs_cgrotor;
+                       __u32   fs_csp[31];
+                       __u32   fs_maxcluster;
+                       __u32   fs_cpc;
+                       __u16   fs_opostbl[16][8];
+               } __attribute__((__packed__)) fs_u1;
+               struct {
+                       __s8    fs_fsmnt[468];
+                       __u8    fs_volname[32];
+                       __u64   fs_swuid;
+                       __s32   fs_pad;
+                       __u32   fs_cgrotor;
+                       __u32   fs_ocsp[28];
+                       __u32   fs_contigdirs;
+                       __u32   fs_csp; 
+                       __u32   fs_maxcluster;
+                       __u32   fs_active;
+                       __s32   fs_old_cpc;
+                       __s32   fs_maxbsize;
+                       __s64   fs_sparecon64[17];
+                       __s64   fs_sblockloc;
+                       struct ufs2_csum_total {
+                               __u64   cs_ndir;
+                               __u64   cs_nbfree;
+                               __u64   cs_nifree;
+                               __u64   cs_nffree;
+                               __u64   cs_numclusters;
+                               __u64   cs_spare[3];
+                       } __attribute__((__packed__)) fs_cstotal;
+                       struct ufs_timeval {
+                               __s32   tv_sec;
+                               __s32   tv_usec;
+                       } __attribute__((__packed__)) fs_time;
+                       __s64   fs_size;
+                       __s64   fs_dsize;
+                       __u64   fs_csaddr;
+                       __s64   fs_pendingblocks;
+                       __s32   fs_pendinginodes;
+               } __attribute__((__packed__)) fs_u2;
+       }  fs_u11;
+       union {
+               struct {
+                       __s32   fs_sparecon[53];
+                       __s32   fs_reclaim;
+                       __s32   fs_sparecon2[1];
+                       __s32   fs_state;
+                       __u32   fs_qbmask[2];
+                       __u32   fs_qfmask[2];
+               } __attribute__((__packed__)) fs_sun;
+               struct {
+                       __s32   fs_sparecon[53];
+                       __s32   fs_reclaim;
+                       __s32   fs_sparecon2[1];
+                       __u32   fs_npsect;
+                       __u32   fs_qbmask[2];
+                       __u32   fs_qfmask[2];
+               } __attribute__((__packed__)) fs_sunx86;
+               struct {
+                       __s32   fs_sparecon[50];
+                       __s32   fs_contigsumsize;
+                       __s32   fs_maxsymlinklen;
+                       __s32   fs_inodefmt;
+                       __u32   fs_maxfilesize[2];
+                       __u32   fs_qbmask[2];
+                       __u32   fs_qfmask[2];
+                       __s32   fs_state;
+               } __attribute__((__packed__)) fs_44;
+       } fs_u2;
+       __s32   fs_postblformat;
+       __s32   fs_nrpos;
+       __s32   fs_postbloff;
+       __s32   fs_rotbloff;
+       __u32   fs_magic;
+       __u8    fs_space[1];
+} __attribute__((__packed__));
+
 #define UFS_MAGIC                      0x00011954
 #define UFS2_MAGIC                     0x19540119
 #define UFS_MAGIC_FEA                  0x00195612
 
 int volume_id_probe_ufs(struct volume_id *id, __u64 off)
 {
-       struct ufs_super_block {
-               __u32   fs_link;
-               __u32   fs_rlink;
-               __u32   fs_sblkno;
-               __u32   fs_cblkno;
-               __u32   fs_iblkno;
-               __u32   fs_dblkno;
-               __u32   fs_cgoffset;
-               __u32   fs_cgmask;
-               __u32   fs_time;
-               __u32   fs_size;
-               __u32   fs_dsize;
-               __u32   fs_ncg; 
-               __u32   fs_bsize;
-               __u32   fs_fsize;
-               __u32   fs_frag;
-               __u32   fs_minfree;
-               __u32   fs_rotdelay;
-               __u32   fs_rps; 
-               __u32   fs_bmask;
-               __u32   fs_fmask;
-               __u32   fs_bshift;
-               __u32   fs_fshift;
-               __u32   fs_maxcontig;
-               __u32   fs_maxbpg;
-               __u32   fs_fragshift;
-               __u32   fs_fsbtodb;
-               __u32   fs_sbsize;
-               __u32   fs_csmask;
-               __u32   fs_csshift;
-               __u32   fs_nindir;
-               __u32   fs_inopb;
-               __u32   fs_nspf;
-               __u32   fs_optim;
-               __u32   fs_npsect_state;
-               __u32   fs_interleave;
-               __u32   fs_trackskew;
-               __u32   fs_id[2];
-               __u32   fs_csaddr;
-               __u32   fs_cssize;
-               __u32   fs_cgsize;
-               __u32   fs_ntrak;
-               __u32   fs_nsect;
-               __u32   fs_spc; 
-               __u32   fs_ncyl;
-               __u32   fs_cpg;
-               __u32   fs_ipg;
-               __u32   fs_fpg;
-               struct ufs_csum {
-                       __u32   cs_ndir;
-                       __u32   cs_nbfree;
-                       __u32   cs_nifree;
-                       __u32   cs_nffree;
-               } __attribute__((__packed__)) fs_cstotal;
-               __s8    fs_fmod;
-               __s8    fs_clean;
-               __s8    fs_ronly;
-               __s8    fs_flags;
-               union {
-                       struct {
-                               __s8    fs_fsmnt[512];
-                               __u32   fs_cgrotor;
-                               __u32   fs_csp[31];
-                               __u32   fs_maxcluster;
-                               __u32   fs_cpc;
-                               __u16   fs_opostbl[16][8];
-                       } __attribute__((__packed__)) fs_u1;
-                       struct {
-                               __s8  fs_fsmnt[468];
-                               __u8   fs_volname[32];
-                               __u64  fs_swuid;
-                               __s32  fs_pad;
-                               __u32   fs_cgrotor;
-                               __u32   fs_ocsp[28];
-                               __u32   fs_contigdirs;
-                               __u32   fs_csp; 
-                               __u32   fs_maxcluster;
-                               __u32   fs_active;
-                               __s32   fs_old_cpc;
-                               __s32   fs_maxbsize;
-                               __s64   fs_sparecon64[17];
-                               __s64   fs_sblockloc;
-                               struct  ufs2_csum_total {
-                                       __u64   cs_ndir;
-                                       __u64   cs_nbfree;
-                                       __u64   cs_nifree;
-                                       __u64   cs_nffree;
-                                       __u64   cs_numclusters;
-                                       __u64   cs_spare[3];
-                               } __attribute__((__packed__)) fs_cstotal;
-                               struct  ufs_timeval {
-                                       __s32   tv_sec;
-                                       __s32   tv_usec;
-                               } __attribute__((__packed__)) fs_time;
-                               __s64    fs_size;
-                               __s64    fs_dsize;
-                               __u64    fs_csaddr;
-                               __s64    fs_pendingblocks;
-                               __s32    fs_pendinginodes;
-                       } __attribute__((__packed__)) fs_u2;
-               }  fs_u11;
-               union {
-                       struct {
-                               __s32   fs_sparecon[53];
-                               __s32   fs_reclaim;
-                               __s32   fs_sparecon2[1];
-                               __s32   fs_state;
-                               __u32   fs_qbmask[2];
-                               __u32   fs_qfmask[2];
-                       } __attribute__((__packed__)) fs_sun;
-                       struct {
-                               __s32   fs_sparecon[53];
-                               __s32   fs_reclaim;
-                               __s32   fs_sparecon2[1];
-                               __u32   fs_npsect;
-                               __u32   fs_qbmask[2];
-                               __u32   fs_qfmask[2];
-                       } __attribute__((__packed__)) fs_sunx86;
-                       struct {
-                               __s32   fs_sparecon[50];
-                               __s32   fs_contigsumsize;
-                               __s32   fs_maxsymlinklen;
-                               __s32   fs_inodefmt;
-                               __u32   fs_maxfilesize[2];
-                               __u32   fs_qbmask[2];
-                               __u32   fs_qfmask[2];
-                               __s32   fs_state;
-                       } __attribute__((__packed__)) fs_44;
-               } fs_u2;
-               __s32   fs_postblformat;
-               __s32   fs_nrpos;
-               __s32   fs_postbloff;
-               __s32   fs_rotbloff;
-               __u32   fs_magic;
-               __u8    fs_space[1];
-       } __attribute__((__packed__)) *ufs;
-
        __u32   magic;
        int     i;
+       struct ufs_super_block *ufs;
        int     offsets[] = {0, 8, 64, 256, -1};
 
+       dbg("probing at offset %llu", off);
+
        for (i = 0; offsets[i] >= 0; i++) {     
                ufs = (struct ufs_super_block *) volume_id_get_buffer(id, off + (offsets[i] * 0x400), 0x800);
                if (ufs == NULL)