Chameleon

Chameleon Commit Details

Date:2010-08-21 18:53:07 (10 years 3 months ago)
Author:Tamás Kosárszky
Commit:413
Parents: 412
Message:Merged back danielkza's changes (r289-r294, r390). Added support for UUID and label based volume specification. Added NTFS UUID used to match what you get on Windows. Please test and comment here: http://forum.voodooprojects.org/index.php/topic,1450.0.html
Changes:
M/trunk/doc/BootHelp.txt
M/trunk/Chameleon.xcodeproj/project.pbxproj
M/trunk/i386/libsaio/saio_types.h
M/trunk/i386/libsaio/xml.h
M/trunk/i386/libsa/libsa.h
M/trunk/i386/libsaio/ntfs_private.h
M/trunk/i386/libsa/printf.c
M/trunk/i386/libsaio/disk.c
M/trunk/i386/libsaio/ntfs.c
M/trunk/i386/boot2/options.c
M/trunk/i386/libsaio/sys.c
M/trunk/i386/libsaio/ntfs.h
M/trunk/i386/libsaio/xml.c

File differences

trunk/doc/BootHelp.txt
4848
4949
5050
51
52
51
52
53
5354
54
55
56
57
58
59
60
61
5562
56
57
58
5963
6064
6165
"Instant Menu"=Yes Force displaying the partition selection menu.
"Default Partition" Sets the default boot partition,
=hd(x,y)| where 'x' & 'y' are the disk and partition numbers
=<UUID> or specify the selected volume UUID string.
=hd(x,y)|UUID|"Label" Specified as a disk/partition pair, an UUID, or a
label enclosed in quotes.
"Hide Partition" Remove unwanted partition(s) from the boot menu.
=hd(x,y) [hd(m,n)] only non mac osx boot partitions can be hidden.
=partition Specified, possibly multiple times, as hd(x,y), an
[;partition2 ...] UUID or label enclosed in quotes.
"Rename Partition" Rename partition(s) for the boot menu.
=partition <alias> Where partition is hd(x,y), UUID or label enclosed
[;partition2 <alias2> in quotes. The alias can optionally be quoted too.
...]
"Rename Partition" Rename partition(s) for the boot menu.
=hd(x,y) <alias> [;hd(m,n) <alias2> ...]
GUI=No Disable the GUI (enabled by default).
"Boot Banner"=Yes|No Show boot banner in GUI mode (enabled by default).
"Legacy Logo"=Yes|No Use the legacy grey apple logo (disabled by default).
trunk/Chameleon.xcodeproj/project.pbxproj
1010
1111
1212
13
1314
1415
1516
......
497498
498499
499500
501
500502
501503
502504
0172D0DC11FB66820030222E /* dram_controllers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dram_controllers.h; sourceTree = "<group>"; };
0172D0DD11FB66820030222E /* dram_controllers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dram_controllers.c; sourceTree = "<group>"; };
019DFBAF11FB94090013E8CC /* MEMTEST86_LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MEMTEST86_LICENSE; sourceTree = "<group>"; };
65ED53931204B83200B22507 /* disk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disk.h; sourceTree = "<group>"; };
B0056CD611F3868000754B65 /* boot */ = {isa = PBXFileReference; lastKnownFileType = text; path = boot; sourceTree = "<group>"; };
B0056CD711F3868000754B65 /* boot.sys */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.preload"; path = boot.sys; sourceTree = "<group>"; };
B0056CD811F3868000754B65 /* boot0 */ = {isa = PBXFileReference; lastKnownFileType = text; path = boot0; sourceTree = "<group>"; };
B0056D3911F3868000754B65 /* device_tree.c */,
B0056D3A11F3868000754B65 /* device_tree.h */,
B0056D3B11F3868000754B65 /* disk.c */,
65ED53931204B83200B22507 /* disk.h */,
0172D0DC11FB66820030222E /* dram_controllers.h */,
0172D0DD11FB66820030222E /* dram_controllers.c */,
B0056D3C11F3868000754B65 /* efi.h */,
trunk/i386/libsaio/xml.c
110110
111111
112112
113
113114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
114171
115172
116173
return 0;
}
/* Function for basic XML character entities parsing */
char*
XMLDecode(const char* src)
{
typedef const struct XMLEntity {
const char* name;
size_t nameLen;
char value;
} XMLEntity;
/* This is ugly, but better than specifying the lengths by hand */
#define _e(str,c) {str,sizeof(str)-1,c}
const XMLEntity ents[] = {
_e("quot;",'"'), _e("apos;",'\''),
_e("lt;", '<'), _e("gt;", '>'),
_e("amp;", '&')
};
size_t len;
const char *s;
char *out, *o;
if ( !src || !(len = strlen(src)) || !(out = malloc(len+1)) )
return 0;
o = out;
s = src;
while (s <= src+len) /* Make sure the terminator is also copied */
{
if ( *s == '&' )
{
bool entFound = false;
int i;
s++;
for ( i = 0; i < sizeof(ents); i++)
{
if ( strncmp(s, ents[i].name, ents[i].nameLen) == 0 )
{
entFound = true;
break;
}
}
if ( entFound )
{
*o++ = ents[i].value;
s += ents[i].nameLen;
continue;
}
}
*o++ = *s++;
}
return out;
}
#if UNUSED
//==========================================================================
// XMLParseFile
trunk/i386/libsaio/xml.h
7373
7474
7575
76
7677
7778
7879
TagPtr XMLGetProperty( TagPtr dict, const char * key );
long XMLParseNextTag(char *buffer, TagPtr *tag);
void XMLFreeTag(TagPtr tag);
char* XMLDecode(const char *in);
//==========================================================================
// XMLParseFile
// Expects to see one dictionary in the XML file.
trunk/i386/libsaio/ntfs_private.h
275275
276276
277277
278
279
278
279
280
281
280282
281283
282284
cn_t bf_mftmirrcn;/* $MFTMirr cn */
u_int8_t bf_mftrecsz;/* MFT record size (clust) */
/* 0xF6 inducates 1/4 */
u_int32_t bf_ibsz;/* index buffer size */
u_int32_t bf_volsn;/* volume ser. num. */
u_int8_t reserved5[3];
u_int8_t bf_ibsz;/* index buffer size */
u_int8_t reserved6[3];
u_int64_t bf_volsn;/* volume ser. num. */
};
/*
trunk/i386/libsaio/ntfs.c
295295
296296
297297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
298333
299334
300335
......
307342
308343
309344
310
311
return;
}
long NTFSGetUUID(CICell ih, char *uuidStr)
{
bool NTFSProbe(const void*);
struct bootfile *boot;
void *buf = malloc(MAX_BLOCK_SIZE);
if ( !buf )
return -1;
/*
* Read the boot sector, check signatures, and do some minimal
* sanity checking. NOTE: the size of the read below is intended
* to be a multiple of all supported block sizes, so we don't
* have to determine or change the device's block size.
*/
Seek(ih, 0);
Read(ih, (long)buf, MAX_BLOCK_SIZE);
boot = (struct bootfile *) buf;
// Check for NTFS signature
if ( memcmp((void*)boot->bf_sysid, NTFS_BBID, NTFS_BBIDLEN) != 0 )
return -1;
// Check for non-null volume serial number
if( !boot->bf_volsn )
return -1;
// Use UUID like the one you get on Windows
return sprintf(uuidStr, "%04X-%04X", (unsigned short)(boot->bf_volsn >> 16) & 0xFFFF,
(unsigned short)boot->bf_volsn & 0xFFFF);
// return CreateUUIDString((uint8_t*)&(boot->bf_volsn), sizeof(boot->bf_volsn), uuidStr);
}
bool NTFSProbe(const void * buffer)
{
bool result = false;
return result;
}
trunk/i386/libsaio/sys.c
6363
6464
6565
66
6667
68
6769
6870
6971
......
819821
820822
821823
822
824
823825
824826
825827
826
827
828
828
829
830
831
832
833
834
835
836
837
829838
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849839
850840
851841
......
10751065
10761066
10771067
1068
10781069
10791070
1080
1081
1071
1072
1073
10821074
10831075
10841076
10851077
1086
1078
1079
1080
1081
10871082
1088
1089
1090
1083
1084
10911085
10921086
1093
1087
10941088
#include "libsaio.h"
#include "boot.h"
#include "bootstruct.h"
#include "disk.h"
#include "ramdisk.h"
#include "xml.h"
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
# include <Kernel/libkern/crypto/md5.h>
#else
return bvr;
/*
* Checking "Default Partition" key in system configuration - use format: hd(x,y) or the volume UUID -
* Checking "Default Partition" key in system configuration - use format: hd(x,y), the volume UUID or label -
* to override the default selection.
* We accept only kBVFlagSystemVolume or kBVFlagForeignBoot volumes.
*/
const char * val;
char testStr[64];
int cnt;
char *val = XMLDecode(getStringForKey(kDefaultPartition, &bootInfo->bootConfig));
if (val) {
for ( bvr = chain; bvr; bvr = bvr->next ) {
if (matchVolumeToString(bvr, val, false)) {
free(val);
return bvr;
}
}
free(val);
}
if (getValueForKey(kDefaultPartition, &val, &cnt, &bootInfo->bootConfig) && cnt >= 7 && filteredChain)
{
for ( bvr = chain; bvr; bvr = bvr->next )
{
if ( bvr->biosdev >= 0x80 && bvr->biosdev < 0x100
&& ( bvr->flags & ( kBVFlagSystemVolume|kBVFlagForeignBoot ) ) )
{
// Trying to match hd(x,y) format.
sprintf(testStr, "hd(%d,%d)", bvr->biosdev - 0x80, bvr->part_no);
if (strcmp(testStr, val) == 0)
return bvr;
// Trying to match volume UUID.
if (bvr->fs_getuuid && bvr->fs_getuuid(bvr, testStr) == 0 && strcmp(testStr, val) == 0)
return bvr;
}
}
}
/*
* Scannig the volume chain backwards and trying to find
* a HFS+ volume with valid boot record signature.
//==========================================================================
// getDeviceDescription() - Extracts unit number and partition number
// from bvr structure into "dw(u,p)" format.
// Returns length of the out string
int getDeviceDescription(BVRef bvr, char *str)
{
const struct devsw *dp;
if(!str)
return 0;
*str = '\0';
if (bvr)
{
for (dp = devsw; dp->name && bvr->biosdev >= dp->biosdev; dp++);
const struct devsw *dp = devsw;
while(dp->name && bvr->biosdev >= dp->biosdev)
dp++;
dp--;
if (dp->name) sprintf(str, "%s(%d,%d)", dp->name, bvr->biosdev - dp->biosdev, bvr->part_no);
return true;
if (dp->name)
return sprintf(str, "%s(%d,%d)", dp->name, bvr->biosdev - dp->biosdev, bvr->part_no);
}
return false;
return 0;
}
trunk/i386/libsaio/ntfs.h
2222
2323
2424
25
25
extern void NTFSGetDescription(CICell ih, char *str, long strMaxLen);
extern bool NTFSProbe (const void *buf);
extern long NTFSGetUUID(CICell ih, char *uuidStr);
trunk/i386/libsaio/disk.c
6767
6868
6969
70
71
72
7073
7174
7275
......
870873
871874
872875
873
876
877
874878
875879
876880
......
15521556
15531557
15541558
1555
1556
1559
1560
15571561
1562
1563
1564
1565
1566
1567
15581568
15591569
15601570
......
15871597
15881598
15891599
1590
1591
1600
15921601
15931602
1594
1595
1596
1597
1598
1599
1600
1601
1603
1604
1605
1606
1607
16021608
16031609
16041610
......
16271633
16281634
16291635
1636
1637
16301638
16311639
16321640
......
16771685
16781686
16791687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
16801761
1681
1762
16821763
1683
1684
1685
1686
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
16871807
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
16991832
17001833
1701
1834
17021835
1703
1704
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
17051855
1706
1707
1708
1709
1710
1856
1857
1858
1859
1860
17111861
1712
1713
1714
1715
1716
1717
1718
1719
17201862
17211863
17221864
17231865
17241866
1725
1726
1727
1867
1868
1869
17281870
1729
1730
1731
17321871
17331872
1734
1735
1736
1737
1738
1739
1740
1741
1742
1873
1874
1875
1876
1877
1878
1879
1880
1881
17431882
1744
1745
1746
1883
17471884
1748
1885
17491886
17501887
17511888
#include "msdos.h"
#include "ext2fs.h"
#include "xml.h"
#include "disk.h"
#include <limits.h>
#include <IOKit/storage/IOApplePartitionScheme.h>
#include <IOKit/storage/IOGUIDPartitionScheme.h>
biosdev, partno,
part->relsect,
part,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
NTFSGetUUID,
NTFSGetDescription,
(BVFree)free,
0, kBIOSDevTypeHardDrive, 0);
struct DiskBVMap * map = NULL;
int bvCount = 0;
const char *val;
char devsw[12];
const char *raw = 0;
char* val = 0;
int len;
getValueForKey(kHidePartition, &raw, &len, &bootInfo->bootConfig);
if(raw)
{
val = XMLDecode(raw);
}
/*
* Traverse gDISKBVmap to get references for
)
newBVR->visible = true;
/*
* Looking for "Hide Partition" entries in "hd(x,y) hd(n,m)" format
/* Looking for "Hide Partition" entries in 'hd(x,y)|uuid|"label" hd(m,n)|uuid|"label"' format
* to be able to hide foreign partitions from the boot menu.
*/
if ( (newBVR->flags & kBVFlagForeignBoot)
&& getValueForKey(kHidePartition, &val, &len, &bootInfo->bootConfig)
)
{
sprintf(devsw, "hd(%d,%d)", BIOS_DEV_UNIT(newBVR), newBVR->part_no);
if (strstr(val, devsw) != NULL)
newBVR->visible = false;
}
if ( (newBVR->flags & kBVFlagForeignBoot) )
{
if(val && matchVolumeToString(newBVR, val, true))
newBVR->visible = false;
}
/*
* Use the first bvr entry as the starting chain pointer.
#endif
*count = bvCount;
free(val);
return chain;
}
//==========================================================================
char* matchVolumeToString( BVRef bvr, const char* match, bool matchParcial)
{
char testStr[64];
char *ret = 0;
int len = 0;
if ( !bvr || !match || !*match)
return 0;
if ( bvr->biosdev < 0x80 || bvr->biosdev >= 0x100
|| !(bvr->flags & (kBVFlagSystemVolume|kBVFlagForeignBoot)) )
return 0;
// Try to match hd(x,y) first.
len = snprintf(testStr, sizeof(testStr)-1, "hd(%d,%d)", BIOS_DEV_UNIT(bvr), bvr->part_no);
if ( matchParcial )
ret = strstr(match, testStr);
else if ( !strcmp(match, testStr) )
ret = (char*) match;
if(ret)
return ret+len;
// Try to match volume UUID.
if ( bvr->fs_getuuid && bvr->fs_getuuid(bvr, testStr) == 0 )
{
{
char* temp = malloc(64);
if(temp && bvr->description) {
bvr->description(bvr, temp, 63);
printf("Volume: UUID=%s, Label=%s\n", testStr, temp);
}
}
len = strlen(testStr);
if ( matchParcial )
ret = strstr(match, testStr);
else if ( !strcmp(match, testStr) )
ret = (char*) match;
if(ret)
return ret+len;
}
// Try to match volume label (always quoted).
if ( bvr->description )
{
char *temp = 0;
bvr->description(bvr, testStr, sizeof(testStr)-1);
len = strlen(testStr);
if ( !len )
return 0;
len += 2; /* quoted */
temp = malloc(len+1);
if(temp)
{
len = snprintf(temp, len, "\"%s\"", testStr);
if ( matchParcial )
ret = strstr(match, temp);
else if ( !strcmp(match, temp) )
ret = (char*) match;
free(temp);
if (ret)
return ret+len;
}
}
return 0;
}
/* If Rename Partition has defined an alias, then extract it for description purpose */
static const char * getVolumeLabelAlias( BVRef bvr, const char * str, long strMaxLen)
bool getVolumeLabelAlias( BVRef bvr, char* str, long strMaxLen)
{
const int MAX_ALIAS_SIZE=31;
static char szAlias[MAX_ALIAS_SIZE+1];
char *q=szAlias;
const char * szAliases = getStringForKey(kRenamePartition, &bootInfo->bootConfig);
/* The format for the rename string is the following:
* hd(x,y)|uuid|"label" "alias";hd(m,n)|uuid|"label" etc; ...
*/
char *aliasList, *next;
if ( !str || strMaxLen <= 0)
return false;
aliasList = XMLDecode(getStringForKey(kRenamePartition, &bootInfo->bootConfig));
if ( !aliasList )
return false;
next = aliasList;
while ( next && *next )
{
char *start, *aliasStart, *aliasEnd;
char *ret;
start = aliasStart = (char*)matchVolumeToString(bvr, next, true);
if ( !start || !*start )
break;
/* Find and delimit the current entry's end */
next = strstr(start, ";");
if ( next )
{
/* Not enough characters for a successful match: we'd need at least
* one space and another char. before the semicolon
*/
if ( next-start < 2 ) {
next++;
continue;
}
*next = '\0';
next++;
}
/* Check for at least one space, but ignore the rest of them */
while ( isspace(*aliasStart) )
aliasStart++;
if ( start == aliasStart )
continue;
if (!str || !*str || !szAliases) return 0; // no renaming wanted
const char * p = strstr(szAliases, str);
if(!p || !(*p)) return 0; // this volume must not be renamed, or option is malformed
p+= strlen(str); // skip the "hd(n,m) " field
// multiple aliases can be found separated by a semi-column
while(*p && *p != ';' && q<(szAlias+MAX_ALIAS_SIZE)) *q++=*p++;
*q='\0';
return szAlias;
switch ( *aliasStart )
{
case '\0':
break;
case '"':
/* If a starting quote is found, skip it, then find the ending one,
* and replace it for a string terminator.
*/
aliasStart++;
aliasEnd = strstr(aliasStart, "\"");
if ( !aliasEnd || aliasStart == aliasEnd )
break;
*aliasEnd = '\0';
default:
ret = strncpy(str, aliasStart, strMaxLen);
free(aliasList);
return ret != 0;
}
}
free(aliasList);
return false;
}
void getBootVolumeDescription( BVRef bvr, char * str, long strMaxLen, bool verbose )
void getBootVolumeDescription( BVRef bvr, char * str, long strMaxLen, bool useDeviceDescription )
{
unsigned char type = (unsigned char) bvr->part_type;
char *p;
unsigned char type;
char *p = str;
if(!bvr || !p || strMaxLen <= 0)
return;
type = (unsigned char) bvr->part_type;
if (useDeviceDescription)
{
int len = getDeviceDescription(bvr, str);
if(len >= strMaxLen)
return;
len++;
strcpy(str + len, " ");
strMaxLen -= len;
p += len;
}
p = str;
if (verbose) {
getDeviceDescription(bvr, str);
strcat(str, " ");
for (; strMaxLen > 0 && *p != '\0'; p++, strMaxLen--);
/* See if a partition rename is preferred */
if(getVolumeLabelAlias(bvr, p, strMaxLen)) {
verbose("Renamed: %s\n", p);
strncpy(bvr->label, p, sizeof(bvr->label) - 1);
return; // we're done here no need to seek for real name
}
// See if we should get the renamed alias name for this partion:
const char * szAliasName = getVolumeLabelAlias(bvr, str, strMaxLen);
if (szAliasName && *szAliasName)
{
strncpy(bvr->label, szAliasName, strMaxLen);
return; // we're done here no need to seek for real name
}
//
// Get the volume label using filesystem specific functions
// or use the alternate volume label if available.
//
if (*bvr->altlabel == '\0')
{
if (bvr->description)
if (*bvr->altlabel != '\0')
strncpy(p, bvr->altlabel, strMaxLen);
else if (bvr->description)
bvr->description(bvr, p, strMaxLen);
}
else
strncpy(p, bvr->altlabel, strMaxLen);
if (*p == '\0') {
const char * name = getNameForValue( fdiskTypes, type );
if (name == NULL) {
name = bvr->type_name;
}
if (name == NULL) {
sprintf(p, "TYPE %02x", type);
} else {
strncpy(p, name, strMaxLen);
}
const char * name = getNameForValue( fdiskTypes, type );
if (name == NULL) {
name = bvr->type_name;
}
if (name == NULL) {
sprintf(p, "TYPE %02x", type);
} else {
strncpy(p, name, strMaxLen);
}
}
/* See if a partion rename is wanted: */
// Set the devices label
sprintf(bvr->label, p);
strncpy(bvr->label, p, sizeof(bvr->label)-1);
}
//==========================================================================
trunk/i386/libsaio/saio_types.h
135135
136136
137137
138
138
139139
140140
141141
typedef long (*FSGetDirEntry)(CICell ih, char * dirPath, long long * dirIndex,
char ** name, long * flags, long * time,
FinderInfo * finderInfo, long * infoValid);
typedef long (* FSGetUUID)(CICell ih, char *uuidStr);
typedef long (*FSGetUUID)(CICell ih, char *uuidStr);
typedef void (*BVGetDescription)(CICell ih, char * str, long strMaxLen);
// Can be just pointed to free or a special free function
typedef void (*BVFree)(CICell ih);
trunk/i386/boot2/options.c
111111
112112
113113
114
114
115115
116116
117117
......
781781
782782
783783
784
784
785785
786786
787787
......
858858
859859
860860
861
861
862862
863863
864864
position_t p = pos( gui.screen.width / 2 + 1 , ( gui.devicelist.pos.y + 3 ) + ( ( gui.devicelist.height - gui.devicelist.iconspacing ) / 2 ) );
char dummy[80];
getBootVolumeDescription( gBootVolume, dummy, 80, true );
getBootVolumeDescription( gBootVolume, dummy, sizeof(dummy) - 1, true );
drawDeviceIcon( gBootVolume, gui.screen.pixmap, p, true );
drawStrCenteredAt( (char *) msg, &font_small, gui.screen.pixmap, gui.countdown.pos );
strlcpy(prompt, val, cnt);
} else {
name = malloc(80);
getBootVolumeDescription(gBootVolume, name, 80, false);
getBootVolumeDescription(gBootVolume, name, sizeof(name) - 1, false);
prompt = malloc(256);
sprintf(prompt, "Press any key to start up from %s, or press F8 to enter startup options.", name);
free(name);
// Associate a menu item for each BVRef.
for (bvr=bvChain, i=gDeviceCount-1, selectIndex=0; bvr; bvr=bvr->next) {
if (bvr->visible) {
getBootVolumeDescription(bvr, menuItems[i].name, 80, true);
getBootVolumeDescription(bvr, menuItems[i].name, sizeof(menuItems[0].name) - 1, true);
menuItems[i].param = (void *) bvr;
if (bvr == menuBVR) {
selectIndex = i;
trunk/i386/libsa/libsa.h
132132
133133
134134
135
135136
136137
137138
* printf.c
*/
extern int sprintf(char *s, const char * format, ...);
extern int snprintf(char *s, long len, const char* fmt, ...);
extern int slvprintf(char * buffer, int len, const char * fmt, va_list arg);
/*
trunk/i386/libsa/printf.c
6060
6161
6262
63
64
65
66
67
68
69
70
71
72
73
74
75
76
6377
6478
6579
return (pi.str - str);
}
int snprintf(char *str, long len, const char * fmt, ...)
{
va_list ap;
struct putc_info pi;
va_start(ap, fmt);
pi.str = str;
pi.last_str = str + len - 1;
prf(fmt, ap, sputc, &pi);
*pi.str = '\0';
va_end(ap);
return (pi.str - str);
}
/*VARARGS1*/
int slvprintf(char * str, int len, const char * fmt, va_list ap)
{

Archive Download the corresponding diff file

Revision: 413