⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 probe_disks.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic  char sccsid[] = "@(#)probe_disks.c 1.1 92/07/30 Copyright Sun Micro";#endif/* * Copyright (c) 1988 by Sun Microsystems, Inc. */#include <stdio.h>#include <errno.h>#include <sys/types.h>#ifndef SVR4#include <sys/dir.h>#endif SVR4#include <sys/file.h>#ifdef SVR4#include <sys/dkio.h>#else SVR4#include <sun/dkio.h>#endif SVR4#include "probe.h"#include "../../lib/include/probe_sundiag.h"#include "sdrtns.h"			/* Sundiag standard header */#ifdef SVR4#include <sys/fcntl.h>#endif SVR4static int get_disk_info();#ifndef DKC_INTEL82077#define DKC_INTEL82077  19      /* 3D floppy ctlr available from SunOS4.1.2_PSR */#endif  DKC_INTEL82077#define DISKDEVS        16/* * check_disk_dev(makedevs, dname, dunit, amt) - checks disks (see dkio(4s) * and MAKEDEV) dname, dunit, and returns status and capacity if possible * returns DISKPROB if no device, NOLABEL if no label, and DISKOK * if everything OK - don't complain about bad open because nlist * doesn't know if SCSI disk is really exists or not, so assume not there */check_disk_dev(makedevs, dname, dunit, amt, cname)    int makedevs;    char *dname;    int dunit;    int *amt;    int *cname;{    char *mode = "0640";    char *perrmsg;    char name[MAXNAMLEN], buf[BUFSIZ-1];    int  nunit, blk, chr, fmajor, unit, fd, capacity, create_flag;    int	 idunit;    Dev_type dev_type;    Special_dev special_dev = no;    func_name = "check_disk_dev";    TRACE_IN    if (strcmp(XD, dname) == 0) {        blk = 10;        chr = 42;    } else if (strcmp(IP, dname) == 0) {        blk = 22;        chr = 65;    } else if (strcmp(ID, dname) == 0) {        blk = 22;        chr = 72;    } else if (strcmp(XY, dname) == 0) {        blk = 3;        chr = 9;    } else if (strcmp(SD, dname) == 0) {        blk = 7;        chr = 17;	special_dev = scsi;    } else if (strcmp(SF, dname) == 0) {        blk = 9;        chr = 33;	special_dev = scsi;    } else if (strcmp(FD, dname) == 0) {        blk = 16;        chr = 54;    }    if (chr == 72)		/* ID disk */    {	idunit = ((dunit>>8)<<7) + (dunit&0x7f);	blk += idunit >> 5;	chr += idunit >> 5;	idunit = ((idunit&0x3f) << 3) & 0xff;    }    if (blk != 16)		/* if not native(on-board) floppy */    {      if (special_dev == scsi)	/* open the device to be sure it is there */      {	(void)sprintf(name, "/dev/r%s%dc", dname, dunit);	unit = dunit * 8 + 2;	create_flag = 0;	if (access(name, F_OK) != 0)	{	  if (!make_dev_file(name, character, chr, unit, mode))	  {	    TRACE_OUT	    return(DISKPROB);	  }	  create_flag = 1;			/* Sundiag creates it */	}        if ((fd = open(name, O_RDONLY)) == -1)	{	  if (blk != 9 || errno != EIO)	  {	    if (create_flag) 	      unlink(name);	/* remove it */	    TRACE_OUT	    return(DISKPROB);	  }        }	else          (void)close(fd);		if (create_flag) 	  unlink(name);		/* remove it */      }      for (nunit = 0; nunit < DISKDEVS; nunit++) {	if (strcmp(ID, dname) != 0)	{	  (void)sprintf(name, "/dev/%s%s%d%c", (nunit < 8) ? "" : "r", 		      dname, dunit, 'a' + nunit % 8);	  unit = dunit * 8 + nunit % 8;	}	else	{	  (void)sprintf(name, "/dev/%s%s%03x%c", (nunit < 8) ? "" : "r", 		      dname, dunit, 'a' + nunit % 8);	  unit = idunit + nunit % 8;	}	dev_type = (nunit < 8) ? block : character;	fmajor = (nunit < 8) ? blk : chr;        if ((check_dev(makedevs, name, dev_type, fmajor, unit, 	    mode, special_dev)) != 1)	  if (nunit == 10)		/* only raw partition c is required */	  {	    TRACE_OUT            return(DISKPROB);	  }      }    }    else    {	(void)sprintf(name, "/dev/r%s%d", dname, dunit);	fmajor = chr;	name[10] = '\0';	unit = (dunit << 3) + 2;/* partition c */	name[9] = 'c';	create_flag = 0;	if (access(name, F_OK) != 0)	{	      if (!make_dev_file(name, character, fmajor, unit, mode))	      {		TRACE_OUT	        return(DISKPROB);	      }	      create_flag = 1;			/* Sundiag creates it */	}        if ((fd = open(name, O_RDONLY)) == -1) {	      if (errno != EIO)	      {		if (create_flag) 		    unlink(name);	/* remove it */		TRACE_OUT                return(DISKPROB);	      }        } else              (void) close(fd);	if (create_flag) 		unlink(name);	/* remove it */        if ((check_dev(makedevs, name, character, fmajor, unit,		mode, special_dev)) != 1)	{	  TRACE_OUT          return(DISKPROB);	/* only raw partition c is required */	}	--unit;			/* partition b */	name[9] = 'b';        check_dev(makedevs, name, character, fmajor, unit, mode, special_dev);	--unit;			/* partition a */	name[9] = 'a';        check_dev(makedevs, name, character, fmajor, unit, mode, special_dev);/***/	(void)sprintf(name, "/dev/%s%d", dname, dunit);	fmajor = blk;	name[9] = '\0';	unit = (dunit << 3) + 2;/* partition c */	name[8] = 'c';        check_dev(makedevs, name, block, fmajor, unit, mode, special_dev);	--unit;			/* partition b */	name[8] = 'b';        check_dev(makedevs, name, block, fmajor, unit, mode, special_dev);	--unit;			/* partition a */	name[8] = 'a';        check_dev(makedevs, name, block, fmajor, unit, mode, special_dev);    }    TRACE_OUT    return(get_disk_info(dname, dunit, amt, cname));}/* * check_cdrom_dev(makedevs, dname, dunit, amt) - checks CD ROM(see cdromio(4s) * and MAKEDEV) (dname,dunit), and returns status and capacity if possible * returns DISKPROB if no device, NOLABEL if no label, and DISKOK * if everything OK - don't complain about bad open because nlist * doesn't know if CD ROM drive is really exists or not, so assume not there */check_cdrom_dev(makedevs, dname, dunit, amt, cname)    int makedevs;    char *dname;    int dunit;    int *amt;    int *cname;{    char *mode = "0555";    char name[MAXNAMLEN];    int	 blk, chr, minorno, create_flag, fd;    func_name = "check_cdrom_dev";    TRACE_IN    chr = 58;#ifdef	NEW    blk = 18;    minorno = dunit*8;   /* Changed from 'dunit' to pacify 4.1.1, not for 4.1*/#else	NEW    blk = 17;    minorno = dunit*8;#endif	NEW    (void)sprintf(name, "/dev/r%s%d", dname, dunit);	    create_flag = 0;    if (access(name, F_OK) != 0)    {	if (!make_dev_file(name, character, chr, minorno, mode))	{		TRACE_OUT	        return(DISKPROB);	}	      create_flag = 1;			/* Sundiag creates it */    }    if ((fd = open(name, O_RDONLY)) == -1)    {      if (errno != EIO)      {	if (create_flag) 	  unlink(name);				/* remove it */	TRACE_OUT        return(DISKPROB);      }    }    else      (void) close(fd);    if (create_flag) 	unlink(name);	/* remove it */    if ((check_dev(makedevs,name,character,chr,minorno,mode,scsi)) != 1)    {	TRACE_OUT	return(DISKPROB);    }    (void)sprintf(name, "/dev/%s%d", dname, dunit);    if ((check_dev(makedevs,name,block,blk,minorno,mode,scsi)) != 1)    {	TRACE_OUT	return(DISKPROB);    }    TRACE_OUT    return(get_disk_info(dname, dunit, amt, cname));}/* * from dkinfo.c: */static intget_disk_info(dname, dunit, amt, cname)    char *dname;    int dunit;    unsigned int *amt;    int *cname;{    short sec_size=512; /* default sector size, becomes 1024 on Med 3D floppy */    char *perrmsg;    char name[MAXNAMLEN], buf[BUFSIZ-1];    struct dk_geom geom;    struct fdk_char floppy_char;    struct dk_info inf;    int fd;    func_name = "get_disk_info";    TRACE_IN    *amt = 0;    *cname = 0;    if (strcmp(dname, ID) == 0)      (void) sprintf(name, "/dev/r%s%03xc", dname, dunit);    else if (strcmp(dname, CDROM) == 0)      (void) sprintf(name, "/dev/r%s%d", dname, dunit);    else      (void) sprintf(name, "/dev/r%s%dc", dname, dunit);    if (access(name, F_OK) != 0)    {	send_message(0, INFO, "no device file %s, can't get info.", name);	TRACE_OUT	return(NOLABEL);    }    if ((fd = open(name, O_RDONLY)) == -1) {	perrmsg = errmsg(errno);	if (errno == EIO) {            send_message(0, INFO, "%s not ready: %s", name, perrmsg);	    TRACE_OUT	    return(NOLABEL);	} else {            send_message(0, ERROR, "%s open error: %s", name, perrmsg);	    TRACE_OUT            return(DISKPROB);	}    }    if (ioctl(fd, DKIOCINFO, &inf) != 0) {        send_message(0, ERROR, "%s disk DKIOCINFO ioctl: %s",            name, errmsg(errno));        (void) close(fd);	TRACE_OUT        return(DISKPROB);    }    else	*cname = inf.dki_ctype;    if (*cname == DKC_INTEL82077) {     /* For 3D floppy only */    	if (ioctl(fd, FDKIOGCHAR, &floppy_char) != 0) {       		send_message(0, ERROR, "%s floppy FDKIOGCHAR ioctl: %s",            	name, errmsg(errno));        	(void) close(fd);        	TRACE_OUT        	return(DISKPROB);    	}    	sec_size = floppy_char.sec_size;    }    if (ioctl(fd, DKIOCGGEOM, &geom) != 0) {        send_message(0, ERROR, "%s disk DKIOCGGEOM ioctl: %s",            name, errmsg(errno));        (void) close(fd);	TRACE_OUT        return(DISKPROB);    }    else    {        *amt = (geom.dkg_ncyl*geom.dkg_nhead*geom.dkg_nsect*sec_size)/1000;	if (strcmp(dname, CDROM) == 0) *amt = *amt * 4;  /* 2048/sector */    }    (void) close(fd);    TRACE_OUT    return(DISKOK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -