This is update of smartmontools, incorporating almost two year changes, including FreeBSD port patches. Fix: [patches should be cvs rm'ed]
State Changed From-To: open->feedback Awaiting maintainers feedback
On Sun, 23 Apr 2006, Edwin Groothuis wrote: I found two Maxtor lines are missing from knowndrives, hence the patch: --- knowndrives.c.orig Wed Apr 5 23:50:07 2006 +++ knowndrives.c Sun Apr 23 20:46:00 2006 @@ -562,6 +562,20 @@ vendoropts_9_minutes, NULL, NULL }, + { "Maxtor MaXLine Pro 500", + "^Maxtor 7H500[FR]0$", + ".*", + NULL, + vendoropts_9_minutes, + NULL, NULL + }, + { "Maxtor MaXLine III family", + "^Maxtor 7[LV](30|25)0[FRS]0$", + ".*", + NULL, + vendoropts_9_minutes, + NULL, NULL + }, { "Maxtor MaXLine Plus II", "^Maxtor 7Y250[PM]0$", ".*", Sincerely, D.Marck [DM5020, MCK-RIPE, DM3-RIPN] --------------------------------------------------------------------------- *** Dmitry Morozovsky --- D.Marck --- Wild Woozle --- marck@FreeBSD.org *** ---------------------------------------------------------------------------
Looks good to me. There is also another pr, ports/96325 which may be duplicating this patch. Ed
State Changed From-To: feedback->open Maintainer approved.
Responsible Changed From-To: freebsd-ports-bugs->garga I'll take it.
Dear maintainer, Since i'm here, i propose you following patch. Most significant changes are: * Move files/smartd.sh -> files/smartd.in, and use USE_RC_SUBR=smartd.in, it does install automatically rc.d script, change %%MACROS%%... * Move pkg-message -> files/pkg-message.in and use SUB_LIST facility Please, take a look and tell me if you approve this. ----------------------------- smartmontools.diff starts here ---------- Index: Makefile =================================================================== RCS file: /home/pcvs/ports/sysutils/smartmontools/Makefile,v retrieving revision 1.22 diff -u -r1.22 Makefile --- Makefile 7 Jan 2006 06:29:55 -0000 1.22 +++ Makefile 27 Apr 2006 11:30:10 -0000 @@ -6,8 +6,7 @@ # PORTNAME= smartmontools -PORTVERSION= 5.33 -PORTREVISION= 5 +PORTVERSION= 5.36 CATEGORIES= sysutils MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= ${PORTNAME} @@ -16,29 +15,25 @@ COMMENT= S.M.A.R.T. disk monitoring tools USE_GMAKE= yes -USE_RC_SUBR= yes GNU_CONFIGURE= yes CONFIGURE_ARGS= --with-initscriptdir=${PREFIX}/etc/rc.d \ --with-docdir=${DOCSDIR} --enable-sample CONFIGURE_TARGET= --build=${MACHINE_ARCH}-portbld-freebsd${OSREL} +SUB_FILES= pkg-message +USE_RC_SUBR= smartd + PROGRAMS= smartctl smartd MAN5= smartd.conf.5 MAN8= smartd.8 smartctl.8 DOCS= AUTHORS CHANGELOG INSTALL NEWS README TODO WARNINGS EXAMPLES= smartd.conf examplescripts/README examplescripts/Example? -RC_SCRIPTS_SUB= PREFIX=${PREFIX} RC_SUBR=${RC_SUBR} - -post-build: - ${SED} ${RC_SCRIPTS_SUB:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} \ - ${FILESDIR}/smartd.sh > ${WRKDIR}/smartd.sh do-install: cd ${WRKSRC} && ${INSTALL_PROGRAM} ${PROGRAMS} ${PREFIX}/sbin cd ${WRKSRC} && ${INSTALL_MAN} ${MAN5} ${MANPREFIX}/man/man5 cd ${WRKSRC} && ${INSTALL_MAN} ${MAN8} ${MANPREFIX}/man/man8 ${INSTALL_DATA} ${WRKSRC}/smartd.conf.sample ${PREFIX}/etc - ${INSTALL_SCRIPT} ${WRKDIR}/smartd.sh ${PREFIX}/etc/rc.d/smartd.sh @${MKDIR} ${EXAMPLESDIR} cd ${WRKSRC} && ${INSTALL_DATA} ${EXAMPLES} ${EXAMPLESDIR} .if !defined(NOPORTDOCS) @@ -49,6 +44,6 @@ .include <bsd.port.pre.mk> post-install: - ${CAT} ${PKGMESSAGE} + @${CAT} ${PKGMESSAGE} .include <bsd.port.post.mk> Index: distinfo =================================================================== RCS file: /home/pcvs/ports/sysutils/smartmontools/distinfo,v retrieving revision 1.8 diff -u -r1.8 distinfo --- distinfo 24 Jan 2006 01:06:32 -0000 1.8 +++ distinfo 27 Apr 2006 11:30:10 -0000 @@ -1,3 +1,3 @@ -MD5 (smartmontools-5.33.tar.gz) = 53f6861a916169a88a9edb1848e27dd0 -SHA256 (smartmontools-5.33.tar.gz) = 2fdde1b4e610cd6e004db8f98ac1100fcbea03b8f11e236de536ce22bc6c620d -SIZE (smartmontools-5.33.tar.gz) = 509826 +MD5 (smartmontools-5.36.tar.gz) = 2e424f2d35efa38a29ebca419c1dbe3c +SHA256 (smartmontools-5.36.tar.gz) = f2032adf22f8d17aad7f3dbed0a9361c25e273d3ca6abb996c84159afd624bf4 +SIZE (smartmontools-5.36.tar.gz) = 540786 Index: pkg-message =================================================================== RCS file: pkg-message diff -N pkg-message --- pkg-message 15 Mar 2006 08:16:30 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,13 +0,0 @@ -smartmontools has been installed - -To check the status of drives, use the following: - - ${PREFIX}/sbin/smartctl -a /dev/ad0 for first ATA drive - ${PREFIX}/sbin/smartctl -a /dev/da0 for first SCSI drive - -To enable monitor of drives, you can use ${PREFIX}/sbin/smartd -A sample configuration file has been installed as ${PREFIX}/etc/smartd.conf.sample -Copy this file to ${PREFIX}/etc/smartd.conf and edit appropriately - -To have smartd start at boot - echo 'smartd_enable="YES"' >> /etc/rc.conf Index: pkg-plist =================================================================== RCS file: /home/pcvs/ports/sysutils/smartmontools/pkg-plist,v retrieving revision 1.2 diff -u -r1.2 pkg-plist --- pkg-plist 28 Apr 2004 18:27:52 -0000 1.2 +++ pkg-plist 27 Apr 2006 11:30:10 -0000 @@ -2,7 +2,6 @@ @unexec /bin/echo "===>" Stopping smartd ... @unexec /usr/bin/killall smartd 2>/dev/null || true etc/smartd.conf.sample -etc/rc.d/smartd.sh sbin/smartctl sbin/smartd %%PORTDOCS%%%%DOCSDIR%%/AUTHORS Index: files/patch-config.h.in =================================================================== RCS file: files/patch-config.h.in diff -N files/patch-config.h.in --- files/patch-config.h.in 10 Oct 2005 12:39:59 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,12 +0,0 @@ ---- config.h.in.orig Thu Aug 4 15:16:22 2005 -+++ config.h.in Thu Aug 4 15:19:21 2005 -@@ -66,6 +66,9 @@ - /* Define to 1 if you have the <sys/twereg.h> header file. */ - #undef HAVE_SYS_TWEREG_H - -+/* Define to 1 if you have the <sys/tw_osl_ioctl.h> header file. */ -+#undef HAVE_SYS_TW_OSL_IOCTL_H -+ - /* Define to 1 if you have the <sys/types.h> header file. */ - #undef HAVE_SYS_TYPES_H - Index: files/patch-configure.in =================================================================== RCS file: files/patch-configure.in diff -N files/patch-configure.in --- files/patch-configure.in 10 Oct 2005 12:39:59 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,11 +0,0 @@ ---- configure.in.orig Thu Aug 4 15:16:15 2005 -+++ configure.in Thu Aug 4 15:18:50 2005 -@@ -56,6 +56,8 @@ - dnl Check for FreeBSD twe include files...currently missing on 5.2, but should be there - AC_CHECK_HEADERS([sys/tweio.h]) - AC_CHECK_HEADERS([sys/twereg.h]) -+dnl Check for FreeBSD twa include files... -+AC_CHECK_HEADERS([sys/tw_osl_ioctl.h]) - - dnl Checks for typedefs, structures, and compiler characteristics. - Index: files/patch-knowndrives.c =================================================================== RCS file: files/patch-knowndrives.c diff -N files/patch-knowndrives.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-knowndrives.c 27 Apr 2006 11:30:10 -0000 @@ -0,0 +1,23 @@ +--- knowndrives.c.orig Wed Apr 5 23:50:07 2006 ++++ knowndrives.c Sun Apr 23 20:46:00 2006 +@@ -562,6 +562,20 @@ + vendoropts_9_minutes, + NULL, NULL + }, ++ { "Maxtor MaXLine Pro 500", ++ "^Maxtor 7H500[FR]0$", ++ ".*", ++ NULL, ++ vendoropts_9_minutes, ++ NULL, NULL ++ }, ++ { "Maxtor MaXLine III family", ++ "^Maxtor 7[LV](30|25)0[FRS]0$", ++ ".*", ++ NULL, ++ vendoropts_9_minutes, ++ NULL, NULL ++ }, + { "Maxtor MaXLine Plus II", + "^Maxtor 7Y250[PM]0$", + ".*", Index: files/patch-os_freebsd.c =================================================================== RCS file: files/patch-os_freebsd.c diff -N files/patch-os_freebsd.c --- files/patch-os_freebsd.c 10 Oct 2005 12:39:59 -0000 1.6 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,641 +0,0 @@ ---- os_freebsd.c.orig Sun Oct 9 13:00:56 2005 -+++ os_freebsd.c Sun Oct 9 13:00:46 2005 -@@ -18,6 +18,7 @@ - #include <stdio.h> - #include <sys/types.h> - #include <dirent.h> -+#include <fcntl.h> - #include <err.h> - #include <camlib.h> - #include <cam/scsi/scsi_message.h> -@@ -109,7 +110,11 @@ - } - - if (parse_ok == CONTROLLER_ATA) { -+#ifdef IOCATAREQUEST -+ if ((fdchan->device = open(dev,O_RDONLY))<0) { -+#else - if ((fdchan->atacommand = open("/dev/ata",O_RDWR))<0) { -+#endif - int myerror = errno; //preserve across free call - free (fdchan); - errno = myerror; -@@ -120,7 +125,26 @@ - if (parse_ok == CONTROLLER_3WARE_678K_CHAR) { - char buf[512]; - sprintf(buf,"/dev/twe%d",fdchan->device); -+#ifdef IOCATAREQUEST -+ if ((fdchan->device = open(buf,O_RDWR))<0) { -+#else - if ((fdchan->atacommand = open(buf,O_RDWR))<0) { -+#endif -+ int myerror = errno; // preserver across free call -+ free(fdchan); -+ errno=myerror; -+ return -1; -+ } -+ } -+ -+ if (parse_ok == CONTROLLER_3WARE_9000_CHAR) { -+ char buf[512]; -+ sprintf(buf,"/dev/twa%d",fdchan->device); -+#ifdef IOCATAREQUEST -+ if ((fdchan->device = open(buf,O_RDWR))<0) { -+#else -+ if ((fdchan->atacommand = open(buf,O_RDWR))<0) { -+#endif - int myerror = errno; // preserver across free call - free(fdchan); - errno=myerror; -@@ -167,8 +191,13 @@ - free(fdchan->devname); - - // close device, if open -+#ifdef IOCATAREQUEST -+ if (fdchan->device) -+ failed=close(fdchan->device); -+#else - if (fdchan->atacommand) - failed=close(fdchan->atacommand); -+#endif - - if (fdchan->scsicontrol) - failed=close(fdchan->scsicontrol); -@@ -221,7 +250,7 @@ - } - - int ata_command_interface(int fd, smart_command_set command, int select, char *data) { --#ifndef ATAREQUEST -+#if !defined(ATAREQUEST) && !defined(IOCATAREQUEST) - // sorry, but without ATAng, we can't do anything here - printwarning(BAD_KERNEL,NULL); - errno = ENOSYS; -@@ -229,7 +258,11 @@ - #else - struct freebsd_dev_channel* con; - int retval, copydata=0; -+#ifdef IOCATAREQUEST -+ struct ata_ioc_request request; -+#else - struct ata_cmd iocmd; -+#endif - unsigned char buff[512]; - - // check that "file descriptor" is valid -@@ -238,89 +271,97 @@ - - bzero(buff,512); - -+#ifdef IOCATAREQUEST -+ bzero(&request,sizeof(struct ata_ioc_request)); -+#else - bzero(&iocmd,sizeof(struct ata_cmd)); -+#endif - bzero(buff,512); -+ -+#ifndef IOCATAREQUEST - iocmd.cmd=ATAREQUEST; - iocmd.channel=con->channel; - iocmd.device=con->device; -+#define request iocmd.u.request -+#endif - -- iocmd.u.request.u.ata.command=ATA_SMART_CMD; -- iocmd.u.request.timeout=600; -+ request.u.ata.command=ATA_SMART_CMD; -+ request.timeout=600; - switch (command){ - case READ_VALUES: -- iocmd.u.request.u.ata.feature=ATA_SMART_READ_VALUES; -- iocmd.u.request.u.ata.lba=0xc24f<<8; -- iocmd.u.request.flags=ATA_CMD_READ; -- iocmd.u.request.data=buff; -- iocmd.u.request.count=512; -+ request.u.ata.feature=ATA_SMART_READ_VALUES; -+ request.u.ata.lba=0xc24f<<8; -+ request.flags=ATA_CMD_READ; -+ request.data=buff; -+ request.count=512; - copydata=1; - break; - case READ_THRESHOLDS: -- iocmd.u.request.u.ata.feature=ATA_SMART_READ_THRESHOLDS; -- iocmd.u.request.u.ata.count=1; -- iocmd.u.request.u.ata.lba=1|(0xc24f<<8); -- iocmd.u.request.flags=ATA_CMD_READ; -- iocmd.u.request.data=buff; -- iocmd.u.request.count=512; -+ request.u.ata.feature=ATA_SMART_READ_THRESHOLDS; -+ request.u.ata.count=1; -+ request.u.ata.lba=1|(0xc24f<<8); -+ request.flags=ATA_CMD_READ; -+ request.data=buff; -+ request.count=512; - copydata=1; - break; - case READ_LOG: -- iocmd.u.request.u.ata.feature=ATA_SMART_READ_LOG_SECTOR; -- iocmd.u.request.u.ata.lba=select|(0xc24f<<8); -- iocmd.u.request.u.ata.count=1; -- iocmd.u.request.flags=ATA_CMD_READ; -- iocmd.u.request.data=buff; -- iocmd.u.request.count=512; -+ request.u.ata.feature=ATA_SMART_READ_LOG_SECTOR; -+ request.u.ata.lba=select|(0xc24f<<8); -+ request.u.ata.count=1; -+ request.flags=ATA_CMD_READ; -+ request.data=buff; -+ request.count=512; - copydata=1; - break; - case IDENTIFY: -- iocmd.u.request.u.ata.command=ATA_IDENTIFY_DEVICE; -- iocmd.u.request.flags=ATA_CMD_READ; -- iocmd.u.request.data=buff; -- iocmd.u.request.count=512; -+ request.u.ata.command=ATA_IDENTIFY_DEVICE; -+ request.flags=ATA_CMD_READ; -+ request.data=buff; -+ request.count=512; - copydata=1; - break; - case PIDENTIFY: -- iocmd.u.request.u.ata.command=ATA_IDENTIFY_PACKET_DEVICE; -- iocmd.u.request.flags=ATA_CMD_READ; -- iocmd.u.request.data=buff; -- iocmd.u.request.count=512; -+ request.u.ata.command=ATA_IDENTIFY_PACKET_DEVICE; -+ request.flags=ATA_CMD_READ; -+ request.data=buff; -+ request.count=512; - copydata=1; - break; - case ENABLE: -- iocmd.u.request.u.ata.feature=ATA_SMART_ENABLE; -- iocmd.u.request.u.ata.lba=0xc24f<<8; -- iocmd.u.request.flags=ATA_CMD_CONTROL; -+ request.u.ata.feature=ATA_SMART_ENABLE; -+ request.u.ata.lba=0xc24f<<8; -+ request.flags=ATA_CMD_CONTROL; - break; - case DISABLE: -- iocmd.u.request.u.ata.feature=ATA_SMART_DISABLE; -- iocmd.u.request.u.ata.lba=0xc24f<<8; -- iocmd.u.request.flags=ATA_CMD_CONTROL; -+ request.u.ata.feature=ATA_SMART_DISABLE; -+ request.u.ata.lba=0xc24f<<8; -+ request.flags=ATA_CMD_CONTROL; - break; - case AUTO_OFFLINE: - // NOTE: According to ATAPI 4 and UP, this command is obsolete -- iocmd.u.request.u.ata.feature=ATA_SMART_AUTO_OFFLINE; -- iocmd.u.request.u.ata.lba=select|(0xc24f<<8); -- iocmd.u.request.flags=ATA_CMD_CONTROL; -+ request.u.ata.feature=ATA_SMART_AUTO_OFFLINE; -+ request.u.ata.lba=select|(0xc24f<<8); -+ request.flags=ATA_CMD_CONTROL; - break; - case AUTOSAVE: -- iocmd.u.request.u.ata.feature=ATA_SMART_AUTOSAVE; -- iocmd.u.request.u.ata.count=0xf1; // to enable autosave -- iocmd.u.request.u.ata.lba=0xc24f<<8; -- iocmd.u.request.flags=ATA_CMD_CONTROL; -+ request.u.ata.feature=ATA_SMART_AUTOSAVE; -+ request.u.ata.count=0xf1; // to enable autosave -+ request.u.ata.lba=0xc24f<<8; -+ request.flags=ATA_CMD_CONTROL; - break; - case IMMEDIATE_OFFLINE: -- iocmd.u.request.u.ata.feature=ATA_SMART_IMMEDIATE_OFFLINE; -- iocmd.u.request.u.ata.lba = select|(0xc24f<<8); // put test in sector -- iocmd.u.request.flags=ATA_CMD_CONTROL; -+ request.u.ata.feature=ATA_SMART_IMMEDIATE_OFFLINE; -+ request.u.ata.lba = select|(0xc24f<<8); // put test in sector -+ request.flags=ATA_CMD_CONTROL; - break; - case STATUS_CHECK: // same command, no HDIO in FreeBSD - case STATUS: - // this command only says if SMART is working. It could be - // replaced with STATUS_CHECK below. -- iocmd.u.request.u.ata.feature=ATA_SMART_STATUS; -- iocmd.u.request.u.ata.lba=0xc24f<<8; -- iocmd.u.request.flags=ATA_CMD_CONTROL; -+ request.u.ata.feature=ATA_SMART_STATUS; -+ request.u.ata.lba=0xc24f<<8; -+ request.flags=ATA_CMD_CONTROL; - break; - default: - pout("Unrecognized command %d in ata_command_interface()\n" -@@ -334,15 +375,19 @@ - unsigned const char failed_lo=0xf4, failed_hi=0x2c; - unsigned char low,high; - -- if ((retval=ioctl(con->atacommand, IOCATA, &iocmd))) -+#ifdef IOCATAREQUEST -+ if ((retval=ioctl(con->device, IOCATAREQUEST, &request)) || request.error) -+#else -+ if ((retval=ioctl(con->atacommand, IOCATA, &iocmd)) || request.error) -+#endif - return -1; - - #if __FreeBSD_version < 502000 - printwarning(NO_RETURN,NULL); - #endif - -- high = (iocmd.u.request.u.ata.lba >> 16) & 0xff; -- low = (iocmd.u.request.u.ata.lba >> 8) & 0xff; -+ high = (request.u.ata.lba >> 16) & 0xff; -+ low = (request.u.ata.lba >> 8) & 0xff; - - // Cyl low and Cyl high unchanged means "Good SMART status" - if (low==normal_lo && high==normal_hi) -@@ -355,21 +400,23 @@ - // We haven't gotten output that makes sense; print out some debugging info - char buf[512]; - sprintf(buf,"CMD=0x%02x\nFR =0x%02x\nNS =0x%02x\nSC =0x%02x\nCL =0x%02x\nCH =0x%02x\nRETURN =0x%04x\n", -- (int)iocmd.u.request.u.ata.command, -- (int)iocmd.u.request.u.ata.feature, -- (int)iocmd.u.request.u.ata.count, -- (int)((iocmd.u.request.u.ata.lba) & 0xff), -- (int)((iocmd.u.request.u.ata.lba>>8) & 0xff), -- (int)((iocmd.u.request.u.ata.lba>>16) & 0xff), -- (int)iocmd.u.request.error); -+ (int)request.u.ata.command, -+ (int)request.u.ata.feature, -+ (int)request.u.ata.count, -+ (int)((request.u.ata.lba) & 0xff), -+ (int)((request.u.ata.lba>>8) & 0xff), -+ (int)((request.u.ata.lba>>16) & 0xff), -+ (int)request.error); - printwarning(BAD_SMART,buf); - return 0; - } - -- if ((retval=ioctl(con->atacommand, IOCATA, &iocmd))) { -- perror("Failed command: "); -+#ifdef IOCATAREQUEST -+ if ((retval=ioctl(con->device, IOCATAREQUEST, &request)) || request.error) -+#else -+ if ((retval=ioctl(con->atacommand, IOCATA, &iocmd)) || request.error) -+#endif - return -1; -- } - // - if (copydata) - memcpy(data, buff, 512); -@@ -483,16 +530,22 @@ - - // Interface to ATA devices behind 3ware escalade RAID controller cards. See os_linux.c - -+#define BUFFER_LEN_678K_CHAR ( sizeof(struct twe_usercommand) ) // 520 -+#define BUFFER_LEN_9000_CHAR ( sizeof(TW_OSLI_IOCTL_NO_DATA_BUF) + sizeof(TWE_Command) ) // 2048 -+#define TW_IOCTL_BUFFER_SIZE ( MAX(BUFFER_LEN_678K_CHAR, BUFFER_LEN_9000_CHAR) ) -+ - int escalade_command_interface(int fd, int disknum, int escalade_type, smart_command_set command, int select, char *data) { - // to hold true file descriptor - struct freebsd_dev_channel* con; - - // return value and buffer for ioctl() - int ioctlreturn, readdata=0; -- struct twe_usercommand* cmd = NULL; -+ struct twe_usercommand* cmd_twe = NULL; -+ TW_OSLI_IOCTL_NO_DATA_BUF* cmd_twa = NULL; -+ TWE_Command_ATA* ata = NULL; - - // Used by both the SCSI and char interfaces -- char ioctl_buffer[sizeof(struct twe_usercommand)]; -+ char ioctl_buffer[TW_IOCTL_BUFFER_SIZE]; - - if (disknum < 0) { - printwarning(NO_DISK_3WARE,NULL); -@@ -503,27 +556,40 @@ - if (isnotopen(&fd,&con)) - return -1; - -- memset(ioctl_buffer, 0, sizeof(struct twe_usercommand)); -+ memset(ioctl_buffer, 0, TW_IOCTL_BUFFER_SIZE); - -- cmd = (struct twe_usercommand*)ioctl_buffer; -- cmd->tu_command.ata.opcode = TWE_OP_ATA_PASSTHROUGH; -+ if (escalade_type==CONTROLLER_3WARE_9000_CHAR) { -+ cmd_twa = (TW_OSLI_IOCTL_NO_DATA_BUF*)ioctl_buffer; -+ cmd_twa->pdata = ((TW_OSLI_IOCTL_WITH_PAYLOAD*)cmd_twa)->payload.data_buf; -+ cmd_twa->driver_pkt.buffer_length = 512; -+ ata = (TWE_Command_ATA*)&cmd_twa->cmd_pkt.command.cmd_pkt_7k; -+ } else if (escalade_type==CONTROLLER_3WARE_678K_CHAR) { -+ cmd_twe = (struct twe_usercommand*)ioctl_buffer; -+ ata = &cmd_twe->tu_command.ata; -+ } else { -+ pout("Unrecognized escalade_type %d in freebsd_3ware_command_interface(disk %d)\n" -+ "Please contact " PACKAGE_BUGREPORT "\n", escalade_type, disknum); -+ errno=ENOSYS; -+ return -1; -+ } - - // Same for (almost) all commands - but some reset below -- cmd->tu_command.ata.request_id = 0xFF; -- cmd->tu_command.ata.unit = disknum; -- cmd->tu_command.ata.host_id = 0; -- cmd->tu_command.ata.status = 0; -- cmd->tu_command.ata.flags = 0x1; -- cmd->tu_command.ata.drive_head = 0x0; -- cmd->tu_command.ata.sector_num = 0; -+ ata->opcode = TWE_OP_ATA_PASSTHROUGH; -+ ata->request_id = 0xFF; -+ ata->unit = disknum; -+ ata->host_id = 0; -+ ata->status = 0; -+ ata->flags = 0x1; -+ ata->drive_head = 0x0; -+ ata->sector_num = 0; - - // All SMART commands use this CL/CH signature. These are magic - // values from the ATA specifications. -- cmd->tu_command.ata.cylinder_lo = 0x4F; -- cmd->tu_command.ata.cylinder_hi = 0xC2; -+ ata->cylinder_lo = 0x4F; -+ ata->cylinder_hi = 0xC2; - - // SMART ATA COMMAND REGISTER value -- cmd->tu_command.ata.command = ATA_SMART_CMD; -+ ata->command = ATA_SMART_CMD; - - // Is this a command that reads or returns 512 bytes? - // passthru->param values are: -@@ -538,61 +604,63 @@ - command == IDENTIFY || - command == WRITE_LOG ) { - readdata=1; -- cmd->tu_size = 512; -- cmd->tu_data = data; -- cmd->tu_command.ata.sgl_offset = 0x5; -- cmd->tu_command.ata.size = 0x5; -- cmd->tu_command.ata.param = 0xD; -- cmd->tu_command.ata.sector_count = 0x1; -+ if (escalade_type==CONTROLLER_3WARE_678K_CHAR) { -+ cmd_twe->tu_data = data; -+ cmd_twe->tu_size = 512; -+ } -+ ata->sgl_offset = 0x5; -+ ata->size = 0x5; -+ ata->param = 0xD; -+ ata->sector_count = 0x1; - // For 64-bit to work correctly, up the size of the command packet - // in dwords by 1 to account for the 64-bit single sgl 'address' - // field. Note that this doesn't agree with the typedefs but it's - // right (agree with kernel driver behavior/typedefs). -- //if (sizeof(long)==8) -- // cmd->tu_command.ata.size++; -+ //if (escalade_type==CONTROLLER_3WARE_9000_CHAR && sizeof(long)==8) -+ // ata->size++; - } - else { - // Non data command -- but doesn't use large sector - // count register values. -- cmd->tu_command.ata.sgl_offset = 0x0; -- cmd->tu_command.ata.size = 0x5; -- cmd->tu_command.ata.param = 0x8; -- cmd->tu_command.ata.sector_count = 0x0; -+ ata->sgl_offset = 0x0; -+ ata->size = 0x5; -+ ata->param = 0x8; -+ ata->sector_count = 0x0; - } - - // Now set ATA registers depending upon command - switch (command){ - case CHECK_POWER_MODE: -- cmd->tu_command.ata.command = ATA_CHECK_POWER_MODE; -- cmd->tu_command.ata.features = 0; -- cmd->tu_command.ata.cylinder_lo = 0; -- cmd->tu_command.ata.cylinder_hi = 0; -+ ata->command = ATA_CHECK_POWER_MODE; -+ ata->features = 0; -+ ata->cylinder_lo = 0; -+ ata->cylinder_hi = 0; - break; - case READ_VALUES: -- cmd->tu_command.ata.features = ATA_SMART_READ_VALUES; -+ ata->features = ATA_SMART_READ_VALUES; - break; - case READ_THRESHOLDS: -- cmd->tu_command.ata.features = ATA_SMART_READ_THRESHOLDS; -+ ata->features = ATA_SMART_READ_THRESHOLDS; - break; - case READ_LOG: -- cmd->tu_command.ata.features = ATA_SMART_READ_LOG_SECTOR; -+ ata->features = ATA_SMART_READ_LOG_SECTOR; - // log number to return -- cmd->tu_command.ata.sector_num = select; -+ ata->sector_num = select; - break; - case WRITE_LOG: -- cmd->tu_data = data; -+ if (escalade_type==CONTROLLER_3WARE_9000_CHAR) -+ memcpy(cmd_twa->pdata, data, 512); - readdata=0; -- cmd->tu_command.ata.features = ATA_SMART_WRITE_LOG_SECTOR; -- cmd->tu_command.ata.sector_count = 1; -- cmd->tu_command.ata.sector_num = select; -- cmd->tu_command.ata.param = 0xF; // PIO data write -+ ata->features = ATA_SMART_WRITE_LOG_SECTOR; -+ ata->sector_num = select; -+ ata->param = 0xF; // PIO data write - break; - case IDENTIFY: - // ATA IDENTIFY DEVICE -- cmd->tu_command.ata.command = ATA_IDENTIFY_DEVICE; -- cmd->tu_command.ata.features = 0; -- cmd->tu_command.ata.cylinder_lo = 0; -- cmd->tu_command.ata.cylinder_hi = 0; -+ ata->command = ATA_IDENTIFY_DEVICE; -+ ata->features = 0; -+ ata->cylinder_lo = 0; -+ ata->cylinder_hi = 0; - break; - case PIDENTIFY: - // 3WARE controller can NOT have packet device internally -@@ -600,34 +668,34 @@ - errno=ENODEV; - return -1; - case ENABLE: -- cmd->tu_command.ata.features = ATA_SMART_ENABLE; -+ ata->features = ATA_SMART_ENABLE; - break; - case DISABLE: -- cmd->tu_command.ata.features = ATA_SMART_DISABLE; -+ ata->features = ATA_SMART_DISABLE; - break; - case AUTO_OFFLINE: -- cmd->tu_command.ata.features = ATA_SMART_AUTO_OFFLINE; -+ ata->features = ATA_SMART_AUTO_OFFLINE; - // Enable or disable? -- cmd->tu_command.ata.sector_count = select; -+ ata->sector_count = select; - break; - case AUTOSAVE: -- cmd->tu_command.ata.features = ATA_SMART_AUTOSAVE; -+ ata->features = ATA_SMART_AUTOSAVE; - // Enable or disable? -- cmd->tu_command.ata.sector_count = select; -+ ata->sector_count = select; - break; - case IMMEDIATE_OFFLINE: -- cmd->tu_command.ata.features = ATA_SMART_IMMEDIATE_OFFLINE; -+ ata->features = ATA_SMART_IMMEDIATE_OFFLINE; - // What test type to run? -- cmd->tu_command.ata.sector_num = select; -+ ata->sector_num = select; - break; - case STATUS_CHECK: -- cmd->tu_command.ata.features = ATA_SMART_STATUS; -+ ata->features = ATA_SMART_STATUS; - break; - case STATUS: - // This is JUST to see if SMART is enabled, by giving SMART status - // command. But it doesn't say if status was good, or failing. - // See below for the difference. -- cmd->tu_command.ata.features = ATA_SMART_STATUS; -+ ata->features = ATA_SMART_STATUS; - break; - default: - pout("Unrecognized command %d in freebsd_3ware_command_interface(disk %d)\n" -@@ -637,7 +705,19 @@ - } - - // Now send the command down through an ioctl() -- ioctlreturn=ioctl(con->atacommand,TWEIO_COMMAND,cmd); -+ if (escalade_type==CONTROLLER_3WARE_9000_CHAR) { -+#ifdef IOCATAREQUEST -+ ioctlreturn=ioctl(con->device,TW_OSL_IOCTL_FIRMWARE_PASS_THROUGH,cmd_twa); -+#else -+ ioctlreturn=ioctl(con->atacommand,TW_OSL_IOCTL_FIRMWARE_PASS_THROUGH,cmd_twa); -+#endif -+ } else { -+#ifdef IOCATAREQUEST -+ ioctlreturn=ioctl(con->device,TWEIO_COMMAND,cmd_twe); -+#else -+ ioctlreturn=ioctl(con->atacommand,TWEIO_COMMAND,cmd_twe); -+#endif -+ } - - // Deal with the different error cases - if (ioctlreturn) { -@@ -648,9 +728,9 @@ - - // See if the ATA command failed. Now that we have returned from - // the ioctl() call, if passthru is valid, then: -- // - cmd->tu_command.ata.status contains the 3ware controller STATUS -- // - cmd->tu_command.ata.command contains the ATA STATUS register -- // - cmd->tu_command.ata.features contains the ATA ERROR register -+ // - ata->status contains the 3ware controller STATUS -+ // - ata->command contains the ATA STATUS register -+ // - ata->features contains the ATA ERROR register - // - // Check bits 0 (error bit) and 5 (device fault) of the ATA STATUS - // If bit 0 (error bit) is set, then ATA ERROR register is valid. -@@ -658,21 +738,27 @@ - // doesn't make much sense: we don't care in detail why the error - // happened. - -- if (cmd->tu_command.ata.status || (cmd->tu_command.ata.command & 0x21)) { -- pout("Command failed, ata.status=(0x%2.2x), ata.command=(0x%2.2x), ata.flags=(0x%2.2x)\n",cmd->tu_command.ata.status,cmd->tu_command.ata.command,cmd->tu_command.ata.flags); -+ if (ata->status || (ata->command & 0x21)) { -+ pout("Command failed, ata.status=(0x%2.2x), ata.command=(0x%2.2x), ata.flags=(0x%2.2x)\n",ata->status,ata->command,ata->flags); - errno=EIO; - return -1; - } - -+ // If this is a read data command, copy data to output buffer -+ if (readdata) { -+ if (escalade_type==CONTROLLER_3WARE_9000_CHAR) -+ memcpy(data, cmd_twa->pdata, 512); -+ } -+ - // For STATUS_CHECK, we need to check register values - if (command==STATUS_CHECK) { - - // To find out if the SMART RETURN STATUS is good or failing, we - // need to examine the values of the Cylinder Low and Cylinder - // High Registers. -- -- unsigned short cyl_lo=cmd->tu_command.ata.cylinder_lo; -- unsigned short cyl_hi=cmd->tu_command.ata.cylinder_hi; -+ -+ unsigned short cyl_lo=ata->cylinder_lo; -+ unsigned short cyl_hi=ata->cylinder_hi; - - // If values in Cyl-LO and Cyl-HI are unchanged, SMART status is good. - if (cyl_lo==0x4F && cyl_hi==0xC2) -@@ -688,7 +774,7 @@ - - // copy sector count register (one byte!) to return data - if (command==CHECK_POWER_MODE) -- *data=*(char *)&(cmd->tu_command.ata.sector_count); -+ *data=*(char *)&(ata->sector_count); - - // look for nonexistent devices/ports - if (command==IDENTIFY && !nonempty((unsigned char *)data, 512)) { -@@ -709,6 +795,14 @@ - return 0; - } - -+static int get_twa_channel_unit (const char* name, int* unit, int* dev) { -+ if (sscanf(name, "twa%d", dev) != 1) -+ return -1; -+ *unit=0; // not really needed for TWA drives, as we handle that seperately -+ return 0; -+} -+ -+#ifndef IOCATAREQUEST - static int get_ata_channel_unit ( const char* name, int* unit, int* dev) { - #ifndef ATAREQUEST - *dev=0; -@@ -756,7 +850,7 @@ - return 0; - #endif - } -- -+#endif - - // Guess device type (ata or scsi) based on device name (FreeBSD - // specific) SCSI device name in FreeBSD can be sd, sr, scd, st, nst, -@@ -768,6 +862,7 @@ - static const char * fbsd_dev_scsi_tape2 = "nsa"; - static const char * fbsd_dev_scsi_tape3 = "esa"; - static const char * fbsd_dev_twe_disk = "twed"; -+static const char * fbsd_dev_twa_disk = "twa"; - - static int parse_ata_chan_dev(const char * dev_name, struct freebsd_dev_channel *chan) { - int len; -@@ -788,11 +883,13 @@ - // form /dev/ad* or ad* - if (!strncmp(fbsd_dev_ata_disk_prefix, dev_name, - strlen(fbsd_dev_ata_disk_prefix))) { -+#ifndef IOCATAREQUEST - if (chan != NULL) { - if (get_ata_channel_unit(dev_name,&(chan->channel),&(chan->device))<0) { - return CONTROLLER_UNKNOWN; - } - } -+#endif - return CONTROLLER_ATA; - } - -@@ -824,6 +921,16 @@ - } - } - return CONTROLLER_3WARE_678K_CHAR; -+ } -+ -+ if (!strncmp(fbsd_dev_twa_disk,dev_name, -+ strlen(fbsd_dev_twa_disk))) { -+ if (chan != NULL) { -+ if (get_twa_channel_unit(dev_name,&(chan->channel),&(chan->device))<0) { -+ return CONTROLLER_UNKNOWN; -+ } -+ } -+ return CONTROLLER_3WARE_9000_CHAR; - } - - // we failed to recognize any of the forms Index: files/patch-os_freebsd.h =================================================================== RCS file: files/patch-os_freebsd.h diff -N files/patch-os_freebsd.h --- files/patch-os_freebsd.h 10 Oct 2005 12:39:59 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,265 +0,0 @@ ---- os_freebsd.h.orig Sun Sep 5 09:16:07 2004 -+++ os_freebsd.h Sat Aug 6 21:08:54 2005 -@@ -261,6 +261,262 @@ - - #endif - -+#ifdef HAVE_SYS_TW_OSL_IOCTL_H -+#include <sys/tw_osl_ioctl.h> -+#else -+/* -+ * Following cut out of tw_osl_types.h -+ * -+ */ -+ -+typedef void TW_VOID; -+typedef char TW_INT8; -+typedef unsigned char TW_UINT8; -+typedef short TW_INT16; -+typedef unsigned short TW_UINT16; -+typedef int TW_INT32; -+typedef unsigned int TW_UINT32; -+typedef long long TW_INT64; -+typedef unsigned long long TW_UINT64; -+ -+/* -+ * Following cut out of tw_cl_share.h -+ * -+ */ -+ -+#pragma pack(1) -+ -+struct tw_cl_event_packet { -+ TW_UINT32 sequence_id; -+ TW_UINT32 time_stamp_sec; -+ TW_UINT16 aen_code; -+ TW_UINT8 severity; -+ TW_UINT8 retrieved; -+ TW_UINT8 repeat_count; -+ TW_UINT8 parameter_len; -+ TW_UINT8 parameter_data[98]; -+ TW_UINT32 event_src; -+ TW_UINT8 severity_str[20]; -+}; -+ -+#pragma pack() -+ -+/* -+ * Following cut out of tw_cl_fwif.h -+ * -+ */ -+ -+#define TWA_FW_CMD_ATA_PASSTHROUGH 0x11 -+ -+#define TWA_SENSE_DATA_LENGTH 18 -+ -+#pragma pack(1) -+/* 7000 structures. */ -+struct tw_cl_command_init_connect { -+ TW_UINT8 res1__opcode; /* 3:5 */ -+ TW_UINT8 size; -+ TW_UINT8 request_id; -+ TW_UINT8 res2; -+ TW_UINT8 status; -+ TW_UINT8 flags; -+ TW_UINT16 message_credits; -+ TW_UINT32 features; -+ TW_UINT16 fw_srl; -+ TW_UINT16 fw_arch_id; -+ TW_UINT16 fw_branch; -+ TW_UINT16 fw_build; -+ TW_UINT32 result; -+}; -+ -+ -+/* Structure for downloading firmware onto the controller. */ -+struct tw_cl_command_download_firmware { -+ TW_UINT8 sgl_off__opcode;/* 3:5 */ -+ TW_UINT8 size; -+ TW_UINT8 request_id; -+ TW_UINT8 unit; -+ TW_UINT8 status; -+ TW_UINT8 flags; -+ TW_UINT16 param; -+ TW_UINT8 sgl[1]; -+}; -+ -+ -+/* Structure for hard resetting the controller. */ -+struct tw_cl_command_reset_firmware { -+ TW_UINT8 res1__opcode; /* 3:5 */ -+ TW_UINT8 size; -+ TW_UINT8 request_id; -+ TW_UINT8 unit; -+ TW_UINT8 status; -+ TW_UINT8 flags; -+ TW_UINT8 res2; -+ TW_UINT8 param; -+}; -+ -+ -+/* Structure for sending get/set param commands. */ -+struct tw_cl_command_param { -+ TW_UINT8 sgl_off__opcode;/* 3:5 */ -+ TW_UINT8 size; -+ TW_UINT8 request_id; -+ TW_UINT8 host_id__unit; /* 4:4 */ -+ TW_UINT8 status; -+ TW_UINT8 flags; -+ TW_UINT16 param_count; -+ TW_UINT8 sgl[1]; -+}; -+ -+ -+/* Generic command packet. */ -+struct tw_cl_command_generic { -+ TW_UINT8 sgl_off__opcode;/* 3:5 */ -+ TW_UINT8 size; -+ TW_UINT8 request_id; -+ TW_UINT8 host_id__unit; /* 4:4 */ -+ TW_UINT8 status; -+ TW_UINT8 flags; -+ TW_UINT16 count; /* block cnt, parameter cnt, message credits */ -+}; -+ -+ -+/* Command packet header. */ -+struct tw_cl_command_header { -+ TW_UINT8 sense_data[TWA_SENSE_DATA_LENGTH]; -+ struct { -+ TW_INT8 reserved[4]; -+ TW_UINT16 error; -+ TW_UINT8 padding; -+ TW_UINT8 res__severity; /* 5:3 */ -+ } status_block; -+ TW_UINT8 err_specific_desc[98]; -+ struct { -+ TW_UINT8 size_header; -+ TW_UINT16 reserved; -+ TW_UINT8 size_sense; -+ } header_desc; -+}; -+ -+ -+/* 7000 Command packet. */ -+union tw_cl_command_7k { -+ struct tw_cl_command_init_connect init_connect; -+ struct tw_cl_command_download_firmware download_fw; -+ struct tw_cl_command_reset_firmware reset_fw; -+ struct tw_cl_command_param param; -+ struct tw_cl_command_generic generic; -+ TW_UINT8 padding[1024 - sizeof(struct tw_cl_command_header)]; -+}; -+ -+ -+/* 9000 Command Packet. */ -+struct tw_cl_command_9k { -+ TW_UINT8 res__opcode; /* 3:5 */ -+ TW_UINT8 unit; -+ TW_UINT16 lun_l4__req_id; /* 4:12 */ -+ TW_UINT8 status; -+ TW_UINT8 sgl_offset; /* offset (in bytes) to sg_list, from the -+ end of sgl_entries */ -+ TW_UINT16 lun_h4__sgl_entries; -+ TW_UINT8 cdb[16]; -+ TW_UINT8 sg_list[872];/* total struct size = -+ 1024-sizeof(cmd_hdr) */ -+}; -+ -+ -+/* Full command packet. */ -+struct tw_cl_command_packet { -+ struct tw_cl_command_header cmd_hdr; -+ union { -+ union tw_cl_command_7k cmd_pkt_7k; -+ struct tw_cl_command_9k cmd_pkt_9k; -+ } command; -+}; -+ -+#pragma pack() -+ -+/* -+ * Following cut out of tw_cl_ioctl.h -+ * -+ */ -+ -+#pragma pack(1) -+ -+/* Structure used to handle GET/RELEASE LOCK ioctls. */ -+struct tw_cl_lock_packet { -+ TW_UINT32 timeout_msec; -+ TW_UINT32 time_remaining_msec; -+ TW_UINT32 force_flag; -+}; -+ -+ -+/* Structure used to handle GET COMPATIBILITY INFO ioctl. */ -+struct tw_cl_compatibility_packet { -+ TW_UINT8 driver_version[32];/* driver version */ -+ TW_UINT16 working_srl; /* driver & firmware negotiated srl */ -+ TW_UINT16 working_branch; /* branch # of the firmware that the -+ driver is compatible with */ -+ TW_UINT16 working_build; /* build # of the firmware that the -+ driver is compatible with */ -+}; -+ -+ -+/* Driver understandable part of the ioctl packet built by the API. */ -+struct tw_cl_driver_packet { -+ TW_UINT32 control_code; -+ TW_UINT32 status; -+ TW_UINT32 unique_id; -+ TW_UINT32 sequence_id; -+ TW_UINT32 os_status; -+ TW_UINT32 buffer_length; -+}; -+ -+#pragma pack() -+ -+/* -+ * Following cut out of tw_osl_ioctl.h -+ * -+ */ -+ -+#pragma pack(1) -+/* -+ * We need the structure below to ensure that the first byte of -+ * data_buf is not overwritten by the kernel, after we return -+ * from the ioctl call. Note that cmd_pkt has been reduced -+ * to an array of 1024 bytes even though it's actually 2048 bytes -+ * in size. This is because, we don't expect requests from user -+ * land requiring 2048 (273 sg elements) byte cmd pkts. -+ */ -+typedef struct tw_osli_ioctl_no_data_buf { -+ struct tw_cl_driver_packet driver_pkt; -+ TW_VOID *pdata; /* points to data_buf */ -+ TW_INT8 padding[488 - sizeof(TW_VOID *)]; -+ struct tw_cl_command_packet cmd_pkt; -+} TW_OSLI_IOCTL_NO_DATA_BUF; -+ -+#pragma pack() -+ -+#define TW_OSL_IOCTL_FIRMWARE_PASS_THROUGH \ -+ _IOWR('T', 202, TW_OSLI_IOCTL_NO_DATA_BUF) -+ -+#pragma pack(1) -+ -+typedef struct tw_osli_ioctl_with_payload { -+ struct tw_cl_driver_packet driver_pkt; -+ TW_INT8 padding[488]; -+ struct tw_cl_command_packet cmd_pkt; -+ union { -+ struct tw_cl_event_packet event_pkt; -+ struct tw_cl_lock_packet lock_pkt; -+ struct tw_cl_compatibility_packet compat_pkt; -+ TW_INT8 data_buf[1]; -+ } payload; -+} TW_OSLI_IOCTL_WITH_PAYLOAD; -+ -+#pragma pack() -+ -+#endif -+ - /* - The following definitions/macros/prototypes are used for three - different interfaces, referred to as "the three cases" below. Index: files/pkg-message.in =================================================================== RCS file: files/pkg-message.in diff -N files/pkg-message.in --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/pkg-message.in 27 Apr 2006 11:30:10 -0000 @@ -0,0 +1,14 @@ +smartmontools has been installed + +To check the status of drives, use the following: + + %%PREFIX%%/sbin/smartctl -a /dev/ad0 for first ATA drive + %%PREFIX%%/sbin/smartctl -a /dev/da0 for first SCSI drive + +To enable monitor of drives, you can use %%PREFIX%%/sbin/smartd +A sample configuration file has been installed as +%%PREFIX%%/etc/smartd.conf.sample +Copy this file to %%PREFIX%%/etc/smartd.conf and edit appropriately + +To have smartd start at boot + echo 'smartd_enable="YES"' >> /etc/rc.conf Index: files/smartd.in =================================================================== RCS file: files/smartd.in diff -N files/smartd.in --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/smartd.in 27 Apr 2006 11:30:10 -0000 @@ -0,0 +1,44 @@ +#!/bin/sh +# $FreeBSD$ + +# PROVIDE: smartd +# REQUIRE: DAEMON +# BEFORE: LOGIN +# KEYWORD: shutdown + +# Define these smartd_* variables in one of these files: +# /etc/rc.conf +# /etc/rc.conf.local +# /etc/rc.conf.d/smartd +# +# DO NOT CHANGE THESE DEFAULT VALUES HERE +# +smartd_enable="${smartd_enable-NO}" +smartd_pidfile="/var/run/smartd.pid" + +. %%RC_SUBR%% + +name="smartd" +rcvar=`set_rcvar` +command="%%PREFIX%%/sbin/smartd" + +load_rc_config $name + +: ${smartd_config="%%PREFIX%%/etc/smartd.conf"} +: ${smartd_flags="-c ${smartd_config}"} + +pidfile="${smartd_pidfile}" +required_files="${smartd_config}" + +case "${smartd_flags}" in +*-p\ *) + echo "ERROR: \$smartd_flags includes -p option." \ + "Please use \$smartd_pidfile instead." + exit 1 + ;; +*) + smartd_flags="-p ${pidfile} ${smartd_flags}" + ;; +esac + +run_rc_command "$1" Index: files/smartd.sh =================================================================== RCS file: files/smartd.sh diff -N files/smartd.sh --- files/smartd.sh 20 Feb 2006 20:47:44 -0000 1.7 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,44 +0,0 @@ -#!/bin/sh -# $FreeBSD: ports/sysutils/smartmontools/files/smartd.sh,v 1.7 2006/02/20 20:47:44 dougb Exp $ - -# PROVIDE: smartd -# REQUIRE: DAEMON -# BEFORE: LOGIN -# KEYWORD: shutdown - -# Define these smartd_* variables in one of these files: -# /etc/rc.conf -# /etc/rc.conf.local -# /etc/rc.conf.d/smartd -# -# DO NOT CHANGE THESE DEFAULT VALUES HERE -# -smartd_enable="${smartd_enable-NO}" -smartd_pidfile="/var/run/smartd.pid" - -. %%RC_SUBR%% - -name="smartd" -rcvar=`set_rcvar` -command="%%PREFIX%%/sbin/smartd" - -load_rc_config $name - -: ${smartd_config="%%PREFIX%%/etc/smartd.conf"} -: ${smartd_flags="-c ${smartd_config}"} - -pidfile="${smartd_pidfile}" -required_files="${smartd_config}" - -case "${smartd_flags}" in -*-p\ *) - echo "ERROR: \$smartd_flags includes -p option." \ - "Please use \$smartd_pidfile instead." - exit 1 - ;; -*) - smartd_flags="-p ${pidfile} ${smartd_flags}" - ;; -esac - -run_rc_command "$1" ----------------------------- smartmontools.diff ends here ---------- Regards -- Renato Botelho <garga @ FreeBSD.org> <freebsd @ galle.com.br> GnuPG Key: http://www.FreeBSD.org/~garga/pubkey.asc Pilfering Treasure property is paticularly dangerous: big thieves are ruthless in punishing little thieves. -- Diogenes
State Changed From-To: open->feedback Ask for maintainer approval.
State Changed From-To: feedback->closed Committed. Thanks!