DF-2878 / regress.c
#include <sys/types.h> #include <sys/ioccom.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <stdint.h> #include <stddef.h> #include <unistd.h> #include <errno.h> #define DISKMAGIC32 0x82564557u struct p32 { uint32_t s,o,f; uint8_t t,fr; uint16_t c; }; struct l32 { uint32_t magic; uint16_t type,sub; char tn[16],pn[16]; uint32_t secsize,nsect,ntrk,ncyl,spc,spu; uint16_t spt,spcyl; uint32_t acyl; uint16_t rpm,il,ts,cs; uint32_t hs,ttk,fl; uint32_t dd[5],sp[5]; uint32_t magic2; uint16_t ck,nparts; uint32_t bbsize,sbsize; struct p32 parts[16]; }; _Static_assert(sizeof(struct l32)==404,"size"); #define DIOCSDINFO32 _IOW('d',102,struct l32) static uint16_t cksum(struct l32*lp){uint16_t*p=(uint16_t*)lp,*e=(uint16_t*)&lp->parts[lp->nparts],s=0;while(p<e)s^=*p++;return s;} int main(void){ struct l32 lp; memset(&lp,0,sizeof lp); lp.magic=DISKMAGIC32; lp.secsize=512; lp.nsect=32; lp.ntrk=64; lp.spc=2048; lp.spu=61696; lp.il=1; lp.magic2=DISKMAGIC32; lp.nparts=3; lp.bbsize=8192; lp.sbsize=8192; lp.parts[0].s=16; lp.parts[0].o=2048; lp.parts[0].t=10; /* 'a' IN-SLICE */ lp.parts[2].s=61696; lp.parts[2].o=0; /* 'c' raw */ lp.ck=cksum(&lp); int fd=open("/dev/vn0s1",O_RDWR); if(fd<0){perror("open");return 2;} if(ioctl(fd,DIOCSDINFO32,&lp)<0){printf("in-slice label REJECTED: %s\n",strerror(errno));return 1;} printf("in-slice label accepted (no regression)\n"); return 0; } |