自制Linux必读c源码
来源:互联网 发布:淘宝瑞士军刀 编辑:程序博客网 时间:2024/05/01 09:26
如果您的自制linux安装盘总是不能成功进行安装,阅读一下下面的c代码,相信肯定会成功,
"源码面前了无秘密"便是如此.此代码属于 Red Hat Linux anaconda 安装程序的关键代码.
//////////////////////////////////////////////////////////////////////////
/* * cdinstall.c - code to set up cdrom installs * * Erik Troan <ewt@redhat.com> * Matt Wilson <msw@redhat.com> * Michael Fulbright <msf@redhat.com> * Jeremy Katz <katzj@redhat.com> * * Copyright 1997 - 2002 Red Hat, Inc. * * This software may be freely redistributed under the terms of the GNU * General Public License. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <ctype.h>#include <dirent.h>#include <errno.h>#include <fcntl.h>#include <newt.h>#include <stdlib.h>#include <string.h>#include <sys/mount.h>#include <sys/ioctl.h>#include <unistd.h>#include <asm/types.h>#include <linux/cdrom.h>#include "kickstart.h"#include "loader.h"#include "loadermisc.h"#include "log.h"#include "lang.h"#include "modules.h"#include "method.h"#include "cdinstall.h"#include "mediacheck.h"#include "../isys/probe.h"#include "../isys/imount.h"#include "../isys/isys.h"static int getISOStatusFromFD(int isofd, char *mediasum);/* ejects the CD device the device node /tmp/cdrom points at */void ejectCdrom(void) { int ejectfd; logMessage("ejecting /tmp/cdrom..."); if ((ejectfd = open("/tmp/cdrom", O_RDONLY | O_NONBLOCK, 0)) >= 0) { if (ioctl(ejectfd, CDROMEJECT, 0)) logMessage("eject failed %d ", errno); close(ejectfd); } else { logMessage("eject failed %d ", errno); }}/* * Given cd device cddriver, this function will attempt to check its internal checksum. * * JKFIXME: this ignores "location", which should be fixed */static char * mediaCheckCdrom(char *cddriver) { int rc; int first; devMakeInode(cddriver, "/tmp/cdrom"); first = 1; do {char *descr;char *tstamp;int ejectcd;/* init every pass */ejectcd = 0;descr = NULL;/* if first time through, see if they want to eject the CD *//* currently in the drive (most likely the CD they booted from) *//* and test a different disk. Otherwise just test the disk in *//* the drive since it was inserted in the previous pass through *//* this loop, so they want it tested. */if (first) { first = 0; rc = newtWinChoice(_("Media Check"), _("Test"), _("Eject CD"), _("Choose /"%s/" to test the CD currently in " "the drive, or /"%s/" to eject the CD and " "insert another for testing."), _("Test"), _("Eject CD")); if (rc == 2)ejectcd = 1;}if (!ejectcd) { /* XXX MSFFIXME: should check return code for error */ readStampFileFromIso("/tmp/cdrom", &tstamp, &descr); mediaCheckFile("/tmp/cdrom", descr); if (descr)free(descr);}ejectCdrom();rc = newtWinChoice(_("Media Check"), _("Test"), _("Continue"), _("If you would like to test additional media, " "insert the next CD and press /"%s/". " "You do not have to test all CDs, although " "it is recommended you do so at least once./n/n" "To begin the installation process " "insert CD #1 into the drive " "and press /"%s/"."), _("Test"), _("Continue"));if (rc == 2) { unlink("/tmp/cdrom"); return NULL;} else { continue;} } while (1); return NULL;}/* output an error message when CD in drive is not the correct one *//* Used by mountCdromStage2() */static void wrongCDMessage(void) { char *buf = sdupprintf(_("The %s CD was not found " "in any of your CDROM drives. Please insert " "the %s CD and press %s to retry."), getProductName(), getProductName(), _("OK")); newtWinMessage(_("Error"), _("OK"), buf, _("OK")); free(buf);}/* Attempts to get a proper CD #1 in the drive *//* Is called after mediacheck is done so that we can proceed with the install *//* During mediacheck we have to have CD umount'd so it can be ejected *//* *//* JKFIXME: Assumes CD is mounted as /mnt/source */static void mountCdromStage2(char *cddev) { int gotcd1=0; int rc; devMakeInode(cddev, "/tmp/cdrom"); do {do { if (doPwMount("/tmp/cdrom", "/mnt/source", "iso9660", 1, 0, NULL, NULL, 0)) {ejectCdrom();wrongCDMessage(); } else {break; }} while (1);rc = mountStage2("/mnt/source/RedHat/base/stage2.img");/* if we failed, umount /mnt/source and keep going */if (rc) { umount("/mnt/source"); ejectCdrom(); wrongCDMessage();} else { gotcd1 = 1;} } while (!gotcd1);}/* reads iso status from device cddriver */static int getISOStatusFromCDROM(char *cddriver, char *mediasum) { int isofd; int isostatus; devMakeInode(cddriver, "/tmp/cdrom"); isofd = open("/tmp/cdrom", O_RDONLY); if (isofd < 0) {logMessage("Could not check iso status: %s", strerror(errno));unlink("/tmp/cdrom");return 0; } isostatus = getISOStatusFromFD(isofd, mediasum); close(isofd); unlink("/tmp/cdrom"); return isostatus;}/* get support status *//* if returns 1 we found status, and mediasum will be checksum */static int getISOStatusFromFD(int isofd, char *mediasum) { unsigned char tmpsum[33]; int skipsectors, isostatus; long long isosize, pvd_offset; if (mediasum)mediasum[0] = '/0'; if ((pvd_offset = parsepvd(isofd, tmpsum, &skipsectors, &isosize, &isostatus)) < 0) {logMessage("Could not parse pvd");return 0; } if (mediasum)strcpy(mediasum, tmpsum); return isostatus;}/* writes iso status info to file '/tmp/isoinfo' for later use */static void writeISOStatus(int status, char *mediasum) { FILE *f; if (!(f = fopen("/tmp/isoinfo", "w")))return; fprintf(f, "ISOSTATUS=%d/n", status); fprintf(f, "MEDIASUM=%s/n", mediasum); fclose(f);}/* ask about doing media check *//* JKFIXME: Assumes CD is mounted as /mnt/source */static void queryCDMediaCheck(char *dev, int flags) { int rc; char mediasum[33]; int isostatus; /* dont bother to test in automated installs */ if (FL_KICKSTART(flags)) return; /* see what status is */ isostatus = getISOStatusFromCDROM(dev, mediasum); writeISOStatus(isostatus, mediasum); /* see if we should check image(s) */ /* in rescue mode only test if they explicitly asked to */ if ((!isostatus && !FL_RESCUE(flags)) || FL_MEDIACHECK(flags)) { startNewt(flags); rc = newtWinChoice(_("CD Found"), _("OK"), _("Skip"), _("To begin testing the CD media before installation press %s./n/n" "Choose %s to skip the media test and start the installation."), _("OK"), _("Skip")); if (rc != 2) { /* unmount CD now we've identified */ /* a valid disc #1 is present */ umountStage2(); umount("/mnt/source"); /* test CD(s) */ mediaCheckCdrom(dev); /* remount stage2 from CD #1 and proceed */ mountCdromStage2(dev); } }}/* set up a cdrom, nominally for installation * * location: where to mount the cdrom at JKFIXME: ignored * flags: usual loader flags * interactive: whether or not to prompt about questions/errors (1 is yes) * * loaderData is the kickstart info, can be NULL meaning no info * * side effect: found cdrom is mounted as /mnt/source. stage2 mounted * as /mnt/runtime. */char * setupCdrom(char * location, struct knownDevices * kd, struct loaderData_s * loaderData, moduleInfoSet modInfo, moduleList modLoaded, moduleDeps modDeps, int flags, int interactive) { int i, rc; int foundinvalid = 0; char * buf;#if 0 if (FL_TESTING(flags) && interactive) { for (i = 0; i < kd->numKnown; i++) { if (kd->known[i].class != CLASS_CDROM) continue; buf = malloc(200); sprintf(buf, "cdrom://%s:/mnt/source", kd->known[i].name); return buf;} }#endif /* JKFIXME: ASSERT -- we have a cdrom device when we get here */ do { for (i = 0; i < kd->numKnown; i++) { if (kd->known[i].class != CLASS_CDROM) continue; logMessage("trying to mount device %s", kd->known[i].name); devMakeInode(kd->known[i].name, "/tmp/cdrom"); if (!doPwMount("/tmp/cdrom", "/mnt/source", "iso9660", 1, 0, NULL, NULL, 0)) { if (!access("/mnt/source/RedHat/base/stage2.img", R_OK) && (FL_RESCUE(flags) || !access("/mnt/source/.discinfo", R_OK))) { rc = mountStage2("/mnt/source/RedHat/base/stage2.img"); /* if we failed, umount /mnt/source and keep going */ if (rc) { umount("/mnt/source"); if (rc == -1) foundinvalid = 1; continue; } /* do the media check */ queryCDMediaCheck(kd->known[i].name, flags); buf = malloc(200); sprintf(buf, "cdrom://%s:/mnt/source", kd->known[i].name); return buf; }/* this wasnt the CD we were looking for, clean up and *//* try the next CD drive */umount("/mnt/source"); unlink("/tmp/cdrom"); } } if (interactive) { char * buf; if (foundinvalid) buf = sdupprintf(_("No %s CD was found which matches your " "boot media. Please insert the %s CD " "and press %s to retry."), getProductName(), getProductName(), _("OK")); else buf = sdupprintf(_("The %s CD was not found in any of your " "CDROM drives. Please insert the %s CD " "and press %s to retry."), getProductName(), getProductName(), _("OK")); rc = newtWinChoice(_("CD Not Found"), _("OK"), _("Back"), buf, _("OK")); free(buf); if (rc == 2) return NULL; } else { /* we can't ask them about it, so just return not found */ return NULL; } } while (1); return NULL;}/* try to find a Red Hat CD non-interactively */char * findRedHatCD(char * location, struct knownDevices * kd, moduleInfoSet modInfo, moduleList modLoaded, moduleDeps modDeps, int flags) { return setupCdrom(location, kd, NULL, modInfo, modLoaded, modDeps, flags, 0);}/* look for a Red Hat CD and mount it. if we have problems, ask */char * mountCdromImage(struct installMethod * method, char * location, struct knownDevices * kd, struct loaderData_s * loaderData, moduleInfoSet modInfo, moduleList modLoaded, moduleDeps * modDepsPtr, int flags) { return setupCdrom(location, kd, loaderData, modInfo, modLoaded, *modDepsPtr, flags, 1);}void setKickstartCD(struct knownDevices * kd, struct loaderData_s * loaderData, int argc, char ** argv, int * flagsPtr) { logMessage("kickstartFromCD"); loaderData->method = strdup("cdrom");}#ifdefSDSCintkickstartFromCD(char *kssrc, struct knownDevices * kd, int flags){inti;char*p, *kspath;logMessage("kickstartFromCD:getting kickstart file from CDROM");/* * format is ks=cdrom:[/path/to/ks.cfg] */kspath = "";p = strchr(kssrc, ':');if (p) {kspath = p + 1;}if (!p || strlen(kspath) < 1) {kspath = "/ks.cfg";}for (i = 0; i < kd->numKnown; i++) {if (kd->known[i].class == CLASS_CDROM) {logMessage("kickstartFromCD:trying CD device (%s)",kd->known[i].name);if (getKickstartFromBlockDevice(kd->known[i].name,kspath) == 0) {/* * success */return(0);}}}/* * if made it here, then couldn't find the kickstart file on the CD */logMessage("kickstartFromCD:Couldn't find kickstart file on CD");return 1;}#elseint kickstartFromCD(char *kssrc, struct knownDevices * kd, int flags) { int rc; int i; char *p, *kspath; logMessage("getting kickstart file from first CDROM"); for (i = 0; i < kd->numKnown; i++)if (kd->known[i].class == CLASS_CDROM) break; if (i >= kd->numKnown) {logMessage("No CDROM devices found!");return 1; } /* format is ks=cdrom:[/path/to/ks.cfg] */ kspath = ""; p = strchr(kssrc, ':'); if (p)kspath = p + 1; if (!p || strlen(kspath) < 1)kspath = "/ks.cfg"; if ((rc=getKickstartFromBlockDevice(kd->known[i].name, kspath))) {if (rc == 3) { startNewt(flags); newtWinMessage(_("Error"), _("OK"), _("Cannot find kickstart file on CDROM."));}return 1; } return 0;}#endif
from [Development]
其他一些c源码下载http://download.clarkconnect.com/home/2.1/
其他文章:
DOM嵌入式Linux系统启动盘制作
为Pocket PC上的IE创建ActiveX控件
Linux操作系统安装盘的定制
Linux平台下制作RedHatEL4的DVD盘
编写云台控制程序
linux之间如何进行串口通讯
- 自制Linux必读c源码
- 自制linux
- 自制linux
- Java必读源码
- PUD Linux自制
- linux自制守护进程
- 自制Linux重命名命令
- 自制linux系统
- C语言必读书籍
- linux汇编必读
- Linux 学习必读系列
- Linux开发必读好书
- linux初学必读
- linux c源码之cat源码
- Linux c源码之chmod源码
- Linux c源码之kill源码
- linux c源码之top源码
- linux c 弹出对话框源码
- 关于算命
- 中缀到后缀表达式的转换
- [转帖]IT人不可不听的10个故事
- 老友记-I'll Be There For You
- 外挂窗体、内嵌窗体
- 自制Linux必读c源码
- 字符处理方法集合
- 赵本山2007春节晚会小品
- out of memory
- 最近在研究的问题,如何实现下面的龙周围的白雾阴影。
- Jena学习笔记(0)---学习方法
- HLSL中如何把输入映射到输出像素
- SELECT 语句与其子句的详解
- 波斯的棋盘