diff options
-rw-r--r-- | usr/src/boot/include/isofs/cd9660/cd9660_rrip.h | 66 | ||||
-rw-r--r-- | usr/src/boot/include/isofs/cd9660/iso.h | 339 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/bootp.c | 368 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/bootp.h | 100 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/cd9660.c | 97 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/dosfs.c | 1262 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/gzipfs.c | 508 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/netif.c | 26 | ||||
-rw-r--r-- | usr/src/boot/lib/libstand/nfs.c | 125 | ||||
-rw-r--r-- | usr/src/boot/sys/sys/types.h | 3 |
10 files changed, 1470 insertions, 1424 deletions
diff --git a/usr/src/boot/include/isofs/cd9660/cd9660_rrip.h b/usr/src/boot/include/isofs/cd9660/cd9660_rrip.h index 4dd0687116..a6de8057b8 100644 --- a/usr/src/boot/include/isofs/cd9660/cd9660_rrip.h +++ b/usr/src/boot/include/isofs/cd9660/cd9660_rrip.h @@ -1,4 +1,4 @@ -/*- +/* * Copyright (c) 1993, 1994 * The Regents of the University of California. All rights reserved. * @@ -32,27 +32,29 @@ * SUCH DAMAGE. * * @(#)cd9660_rrip.h 8.2 (Berkeley) 12/5/94 - * $FreeBSD$ */ +#ifndef CD9660_RRIP_H +#define CD9660_RRIP_H + typedef struct { - char type [ISODCL ( 0, 1)]; - u_char length [ISODCL ( 2, 2)]; /* 711 */ - u_char version [ISODCL ( 3, 3)]; + char type [ISODCL(0, 1)]; + uchar_t length [ISODCL(2, 2)]; /* 711 */ + uchar_t version [ISODCL(3, 3)]; } ISO_SUSP_HEADER; typedef struct { ISO_SUSP_HEADER h; - char mode [ISODCL ( 4, 11)]; /* 733 */ - char links [ISODCL ( 12, 19)]; /* 733 */ - char uid [ISODCL ( 20, 27)]; /* 733 */ - char gid [ISODCL ( 28, 35)]; /* 733 */ + char mode [ISODCL(4, 11)]; /* 733 */ + char links [ISODCL(12, 19)]; /* 733 */ + char uid [ISODCL(20, 27)]; /* 733 */ + char gid [ISODCL(28, 35)]; /* 733 */ } ISO_RRIP_ATTR; typedef struct { ISO_SUSP_HEADER h; - char dev_t_high [ISODCL ( 4, 11)]; /* 733 */ - char dev_t_low [ISODCL ( 12, 19)]; /* 733 */ + char dev_t_high [ISODCL(4, 11)]; /* 733 */ + char dev_t_low [ISODCL(12, 19)]; /* 733 */ } ISO_RRIP_DEVICE; #define ISO_SUSP_CFLAG_CONTINUE 0x01 @@ -63,31 +65,31 @@ typedef struct { #define ISO_SUSP_CFLAG_HOST 0x20 typedef struct { - u_char cflag [ISODCL ( 1, 1)]; - u_char clen [ISODCL ( 2, 2)]; - u_char name [1]; /* XXX */ + uchar_t cflag [ISODCL(1, 1)]; + uchar_t clen [ISODCL(2, 2)]; + uchar_t name [1]; /* XXX */ } ISO_RRIP_SLINK_COMPONENT; #define ISO_RRIP_SLSIZ 2 typedef struct { ISO_SUSP_HEADER h; - u_char flags [ISODCL ( 4, 4)]; - u_char component [ISODCL ( 5, 5)]; + uchar_t flags [ISODCL(4, 4)]; + uchar_t component [ISODCL(5, 5)]; } ISO_RRIP_SLINK; typedef struct { ISO_SUSP_HEADER h; - char flags [ISODCL ( 4, 4)]; + char flags [ISODCL(4, 4)]; } ISO_RRIP_ALTNAME; typedef struct { ISO_SUSP_HEADER h; - char dir_loc [ISODCL ( 4, 11)]; /* 733 */ + char dir_loc [ISODCL(4, 11)]; /* 733 */ } ISO_RRIP_CLINK; typedef struct { ISO_SUSP_HEADER h; - char dir_loc [ISODCL ( 4, 11)]; /* 733 */ + char dir_loc [ISODCL(4, 11)]; /* 733 */ } ISO_RRIP_PLINK; typedef struct { @@ -106,32 +108,34 @@ typedef struct { typedef struct { ISO_SUSP_HEADER h; - u_char flags [ISODCL ( 4, 4)]; - u_char time [ISODCL ( 5, 5)]; + uchar_t flags [ISODCL(4, 4)]; + uchar_t time [ISODCL(5, 5)]; } ISO_RRIP_TSTAMP; typedef struct { ISO_SUSP_HEADER h; - u_char flags [ISODCL ( 4, 4)]; + uchar_t flags [ISODCL(4, 4)]; } ISO_RRIP_IDFLAG; typedef struct { ISO_SUSP_HEADER h; - char len_id [ISODCL ( 4, 4)]; - char len_des [ISODCL ( 5, 5)]; - char len_src [ISODCL ( 6, 6)]; - char version [ISODCL ( 7, 7)]; + char len_id [ISODCL(4, 4)]; + char len_des [ISODCL(5, 5)]; + char len_src [ISODCL(6, 6)]; + char version [ISODCL(7, 7)]; } ISO_RRIP_EXTREF; typedef struct { ISO_SUSP_HEADER h; - char check [ISODCL ( 4, 5)]; - char skip [ISODCL ( 6, 6)]; + char check [ISODCL(4, 5)]; + char skip [ISODCL(6, 6)]; } ISO_RRIP_OFFSET; typedef struct { ISO_SUSP_HEADER h; - u_char location [ISODCL ( 4, 11)]; - u_char offset [ISODCL ( 12, 19)]; - u_char length [ISODCL ( 20, 27)]; + uchar_t location [ISODCL(4, 11)]; + uchar_t offset [ISODCL(12, 19)]; + uchar_t length [ISODCL(20, 27)]; } ISO_RRIP_CONT; + +#endif /* CD9660_RRIP_H */ diff --git a/usr/src/boot/include/isofs/cd9660/iso.h b/usr/src/boot/include/isofs/cd9660/iso.h index 2784a9f24e..6180affdd8 100644 --- a/usr/src/boot/include/isofs/cd9660/iso.h +++ b/usr/src/boot/include/isofs/cd9660/iso.h @@ -1,4 +1,4 @@ -/*- +/* * Copyright (c) 1994 * The Regents of the University of California. All rights reserved. * @@ -32,68 +32,70 @@ * SUCH DAMAGE. * * @(#)iso.h 8.6 (Berkeley) 5/10/95 - * $FreeBSD$ */ -#define ISODCL(from, to) (to - from + 1) +#ifndef ISO_H +#define ISO_H + +#define ISODCL(from, to) (to - from + 1) struct iso_volume_descriptor { - char type[ISODCL(1,1)]; /* 711 */ - char id[ISODCL(2,6)]; - char version[ISODCL(7,7)]; - char unused[ISODCL(8,8)]; - char type_sierra[ISODCL(9,9)]; /* 711 */ - char id_sierra[ISODCL(10,14)]; - char version_sierra[ISODCL(15,15)]; - char data[ISODCL(16,2048)]; + char type[ISODCL(1, 1)]; /* 711 */ + char id[ISODCL(2, 6)]; + char version[ISODCL(7, 7)]; + char unused[ISODCL(8, 8)]; + char type_sierra[ISODCL(9, 9)]; /* 711 */ + char id_sierra[ISODCL(10, 14)]; + char version_sierra[ISODCL(15, 15)]; + char data[ISODCL(16, 2048)]; }; /* volume descriptor types */ -#define ISO_VD_PRIMARY 1 -#define ISO_VD_SUPPLEMENTARY 2 -#define ISO_VD_END 255 +#define ISO_VD_PRIMARY 1 +#define ISO_VD_SUPPLEMENTARY 2 +#define ISO_VD_END 255 -#define ISO_STANDARD_ID "CD001" -#define ISO_ECMA_ID "CDW01" +#define ISO_STANDARD_ID "CD001" +#define ISO_ECMA_ID "CDW01" -#define ISO_SIERRA_ID "CDROM" +#define ISO_SIERRA_ID "CDROM" struct iso_primary_descriptor { - u_char type [ISODCL ( 1, 1)]; /* 711 */ - char id [ISODCL ( 2, 6)]; - char version [ISODCL ( 7, 7)]; /* 711 */ - char unused1 [ISODCL ( 8, 8)]; - char system_id [ISODCL ( 9, 40)]; /* achars */ - char volume_id [ISODCL ( 41, 72)]; /* dchars */ - char unused2 [ISODCL ( 73, 80)]; - char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ - char unused3 [ISODCL ( 89, 120)]; - char volume_set_size [ISODCL (121, 124)]; /* 723 */ - char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ - u_char logical_block_size [ISODCL (129, 132)]; /* 723 */ - char path_table_size [ISODCL (133, 140)]; /* 733 */ - char type_l_path_table [ISODCL (141, 144)]; /* 731 */ - char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ - char type_m_path_table [ISODCL (149, 152)]; /* 732 */ - char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ - char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ - char volume_set_id [ISODCL (191, 318)]; /* dchars */ - char publisher_id [ISODCL (319, 446)]; /* achars */ - char preparer_id [ISODCL (447, 574)]; /* achars */ - char application_id [ISODCL (575, 702)]; /* achars */ - char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ - char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ - char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ - char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ - char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ - char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ - char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ - char file_structure_version [ISODCL (882, 882)]; /* 711 */ - char unused4 [ISODCL (883, 883)]; - char application_data [ISODCL (884, 1395)]; - char unused5 [ISODCL (1396, 2048)]; + uchar_t type [ISODCL(1, 1)]; /* 711 */ + char id [ISODCL(2, 6)]; + char version [ISODCL(7, 7)]; /* 711 */ + char unused1 [ISODCL(8, 8)]; + char system_id [ISODCL(9, 40)]; /* achars */ + char volume_id [ISODCL(41, 72)]; /* dchars */ + char unused2 [ISODCL(73, 80)]; + char volume_space_size [ISODCL(81, 88)]; /* 733 */ + char unused3 [ISODCL(89, 120)]; + char volume_set_size [ISODCL(121, 124)]; /* 723 */ + char volume_sequence_number [ISODCL(125, 128)]; /* 723 */ + uchar_t logical_block_size [ISODCL(129, 132)]; /* 723 */ + char path_table_size [ISODCL(133, 140)]; /* 733 */ + char type_l_path_table [ISODCL(141, 144)]; /* 731 */ + char opt_type_l_path_table [ISODCL(145, 148)]; /* 731 */ + char type_m_path_table [ISODCL(149, 152)]; /* 732 */ + char opt_type_m_path_table [ISODCL(153, 156)]; /* 732 */ + char root_directory_record [ISODCL(157, 190)]; /* 9.1 */ + char volume_set_id [ISODCL(191, 318)]; /* dchars */ + char publisher_id [ISODCL(319, 446)]; /* achars */ + char preparer_id [ISODCL(447, 574)]; /* achars */ + char application_id [ISODCL(575, 702)]; /* achars */ + char copyright_file_id [ISODCL(703, 739)]; /* 7.5 dchars */ + char abstract_file_id [ISODCL(740, 776)]; /* 7.5 dchars */ + char bibliographic_file_id [ISODCL(777, 813)]; /* 7.5 dchars */ + char creation_date [ISODCL(814, 830)]; /* 8.4.26.1 */ + char modification_date [ISODCL(831, 847)]; /* 8.4.26.1 */ + char expiration_date [ISODCL(848, 864)]; /* 8.4.26.1 */ + char effective_date [ISODCL(865, 881)]; /* 8.4.26.1 */ + char file_structure_version [ISODCL(882, 882)]; /* 711 */ + char unused4 [ISODCL(883, 883)]; + char application_data [ISODCL(884, 1395)]; + char unused5 [ISODCL(1396, 2048)]; } __packed; -#define ISO_DEFAULT_BLOCK_SIZE 2048 +#define ISO_DEFAULT_BLOCK_SIZE 2048 /* * Used by Microsoft Joliet extension to ISO9660. Almost the same @@ -101,119 +103,127 @@ struct iso_primary_descriptor { */ struct iso_supplementary_descriptor { - char type [ISODCL ( 1, 1)]; /* 711 */ - char id [ISODCL ( 2, 6)]; - char version [ISODCL ( 7, 7)]; /* 711 */ - char flags [ISODCL ( 8, 8)]; /* 711? */ - char system_id [ISODCL ( 9, 40)]; /* achars */ - char volume_id [ISODCL ( 41, 72)]; /* dchars */ - char unused2 [ISODCL ( 73, 80)]; - char volume_space_size [ISODCL ( 81, 88)]; /* 733 */ - char escape [ISODCL ( 89, 120)]; - char volume_set_size [ISODCL (121, 124)]; /* 723 */ - char volume_sequence_number [ISODCL (125, 128)]; /* 723 */ - char logical_block_size [ISODCL (129, 132)]; /* 723 */ - char path_table_size [ISODCL (133, 140)]; /* 733 */ - char type_l_path_table [ISODCL (141, 144)]; /* 731 */ - char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */ - char type_m_path_table [ISODCL (149, 152)]; /* 732 */ - char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */ - char root_directory_record [ISODCL (157, 190)]; /* 9.1 */ - char volume_set_id [ISODCL (191, 318)]; /* dchars */ - char publisher_id [ISODCL (319, 446)]; /* achars */ - char preparer_id [ISODCL (447, 574)]; /* achars */ - char application_id [ISODCL (575, 702)]; /* achars */ - char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */ - char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */ - char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */ - char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */ - char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */ - char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */ - char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */ - char file_structure_version [ISODCL (882, 882)]; /* 711 */ - char unused4 [ISODCL (883, 883)]; - char application_data [ISODCL (884, 1395)]; - char unused5 [ISODCL (1396, 2048)]; + char type [ISODCL(1, 1)]; /* 711 */ + char id [ISODCL(2, 6)]; + char version [ISODCL(7, 7)]; /* 711 */ + char flags [ISODCL(8, 8)]; /* 711? */ + char system_id [ISODCL(9, 40)]; /* achars */ + char volume_id [ISODCL(41, 72)]; /* dchars */ + char unused2 [ISODCL(73, 80)]; + char volume_space_size [ISODCL(81, 88)]; /* 733 */ + char escape [ISODCL(89, 120)]; + char volume_set_size [ISODCL(121, 124)]; /* 723 */ + char volume_sequence_number [ISODCL(125, 128)]; /* 723 */ + char logical_block_size [ISODCL(129, 132)]; /* 723 */ + char path_table_size [ISODCL(133, 140)]; /* 733 */ + char type_l_path_table [ISODCL(141, 144)]; /* 731 */ + char opt_type_l_path_table [ISODCL(145, 148)]; /* 731 */ + char type_m_path_table [ISODCL(149, 152)]; /* 732 */ + char opt_type_m_path_table [ISODCL(153, 156)]; /* 732 */ + char root_directory_record [ISODCL(157, 190)]; /* 9.1 */ + char volume_set_id [ISODCL(191, 318)]; /* dchars */ + char publisher_id [ISODCL(319, 446)]; /* achars */ + char preparer_id [ISODCL(447, 574)]; /* achars */ + char application_id [ISODCL(575, 702)]; /* achars */ + char copyright_file_id [ISODCL(703, 739)]; /* 7.5 dchars */ + char abstract_file_id [ISODCL(740, 776)]; /* 7.5 dchars */ + char bibliographic_file_id [ISODCL(777, 813)]; /* 7.5 dchars */ + char creation_date [ISODCL(814, 830)]; /* 8.4.26.1 */ + char modification_date [ISODCL(831, 847)]; /* 8.4.26.1 */ + char expiration_date [ISODCL(848, 864)]; /* 8.4.26.1 */ + char effective_date [ISODCL(865, 881)]; /* 8.4.26.1 */ + char file_structure_version [ISODCL(882, 882)]; /* 711 */ + char unused4 [ISODCL(883, 883)]; + char application_data [ISODCL(884, 1395)]; + char unused5 [ISODCL(1396, 2048)]; }; struct iso_sierra_primary_descriptor { - char unknown1 [ISODCL ( 1, 8)]; /* 733 */ - char type [ISODCL ( 9, 9)]; /* 711 */ - char id [ISODCL ( 10, 14)]; - char version [ISODCL ( 15, 15)]; /* 711 */ - char unused1 [ISODCL ( 16, 16)]; - char system_id [ISODCL ( 17, 48)]; /* achars */ - char volume_id [ISODCL ( 49, 80)]; /* dchars */ - char unused2 [ISODCL ( 81, 88)]; - char volume_space_size [ISODCL ( 89, 96)]; /* 733 */ - char unused3 [ISODCL ( 97, 128)]; - char volume_set_size [ISODCL (129, 132)]; /* 723 */ - char volume_sequence_number [ISODCL (133, 136)]; /* 723 */ - char logical_block_size [ISODCL (137, 140)]; /* 723 */ - char path_table_size [ISODCL (141, 148)]; /* 733 */ - char type_l_path_table [ISODCL (149, 152)]; /* 731 */ - char opt_type_l_path_table [ISODCL (153, 156)]; /* 731 */ - char unknown2 [ISODCL (157, 160)]; /* 731 */ - char unknown3 [ISODCL (161, 164)]; /* 731 */ - char type_m_path_table [ISODCL (165, 168)]; /* 732 */ - char opt_type_m_path_table [ISODCL (169, 172)]; /* 732 */ - char unknown4 [ISODCL (173, 176)]; /* 732 */ - char unknown5 [ISODCL (177, 180)]; /* 732 */ - char root_directory_record [ISODCL (181, 214)]; /* 9.1 */ - char volume_set_id [ISODCL (215, 342)]; /* dchars */ - char publisher_id [ISODCL (343, 470)]; /* achars */ - char preparer_id [ISODCL (471, 598)]; /* achars */ - char application_id [ISODCL (599, 726)]; /* achars */ - char copyright_id [ISODCL (727, 790)]; /* achars */ - char creation_date [ISODCL (791, 806)]; /* ? */ - char modification_date [ISODCL (807, 822)]; /* ? */ - char expiration_date [ISODCL (823, 838)]; /* ? */ - char effective_date [ISODCL (839, 854)]; /* ? */ - char file_structure_version [ISODCL (855, 855)]; /* 711 */ - char unused4 [ISODCL (856, 2048)]; + char unknown1 [ISODCL(1, 8)]; /* 733 */ + char type [ISODCL(9, 9)]; /* 711 */ + char id [ISODCL(10, 14)]; + char version [ISODCL(15, 15)]; /* 711 */ + char unused1 [ISODCL(16, 16)]; + char system_id [ISODCL(17, 48)]; /* achars */ + char volume_id [ISODCL(49, 80)]; /* dchars */ + char unused2 [ISODCL(81, 88)]; + char volume_space_size [ISODCL(89, 96)]; /* 733 */ + char unused3 [ISODCL(97, 128)]; + char volume_set_size [ISODCL(129, 132)]; /* 723 */ + char volume_sequence_number [ISODCL(133, 136)]; /* 723 */ + char logical_block_size [ISODCL(137, 140)]; /* 723 */ + char path_table_size [ISODCL(141, 148)]; /* 733 */ + char type_l_path_table [ISODCL(149, 152)]; /* 731 */ + char opt_type_l_path_table [ISODCL(153, 156)]; /* 731 */ + char unknown2 [ISODCL(157, 160)]; /* 731 */ + char unknown3 [ISODCL(161, 164)]; /* 731 */ + char type_m_path_table [ISODCL(165, 168)]; /* 732 */ + char opt_type_m_path_table [ISODCL(169, 172)]; /* 732 */ + char unknown4 [ISODCL(173, 176)]; /* 732 */ + char unknown5 [ISODCL(177, 180)]; /* 732 */ + char root_directory_record [ISODCL(181, 214)]; /* 9.1 */ + char volume_set_id [ISODCL(215, 342)]; /* dchars */ + char publisher_id [ISODCL(343, 470)]; /* achars */ + char preparer_id [ISODCL(471, 598)]; /* achars */ + char application_id [ISODCL(599, 726)]; /* achars */ + char copyright_id [ISODCL(727, 790)]; /* achars */ + char creation_date [ISODCL(791, 806)]; /* ? */ + char modification_date [ISODCL(807, 822)]; /* ? */ + char expiration_date [ISODCL(823, 838)]; /* ? */ + char effective_date [ISODCL(839, 854)]; /* ? */ + char file_structure_version [ISODCL(855, 855)]; /* 711 */ + char unused4 [ISODCL(856, 2048)]; }; struct iso_directory_record { - u_char length [ISODCL (1, 1)]; /* 711 */ - u_char ext_attr_length [ISODCL (2, 2)]; /* 711 */ - u_char extent [ISODCL (3, 10)]; /* 733 */ - u_char size [ISODCL (11, 18)]; /* 733 */ - char date [ISODCL (19, 25)]; /* 7 by 711 */ - u_char flags [ISODCL (26, 26)]; - char file_unit_size [ISODCL (27, 27)]; /* 711 */ - char interleave [ISODCL (28, 28)]; /* 711 */ - char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ - u_char name_len [ISODCL (33, 33)]; /* 711 */ + uchar_t length [ISODCL(1, 1)]; /* 711 */ + uchar_t ext_attr_length [ISODCL(2, 2)]; /* 711 */ + uchar_t extent [ISODCL(3, 10)]; /* 733 */ + uchar_t size [ISODCL(11, 18)]; /* 733 */ + char date [ISODCL(19, 25)]; /* 7 by 711 */ + uchar_t flags [ISODCL(26, 26)]; + char file_unit_size [ISODCL(27, 27)]; /* 711 */ + char interleave [ISODCL(28, 28)]; /* 711 */ + char volume_sequence_number [ISODCL(29, 32)]; /* 723 */ + uchar_t name_len [ISODCL(33, 33)]; /* 711 */ char name [1]; /* XXX */ } __packed; -/* can't take sizeof(iso_directory_record), because of possible alignment - of the last entry (34 instead of 33) */ -#define ISO_DIRECTORY_RECORD_SIZE 33 +/* + * can't take sizeof(iso_directory_record), because of possible alignment + * of the last entry (34 instead of 33) + */ +#define ISO_DIRECTORY_RECORD_SIZE 33 struct iso_extended_attributes { - u_char owner [ISODCL (1, 4)]; /* 723 */ - u_char group [ISODCL (5, 8)]; /* 723 */ - u_char perm [ISODCL (9, 10)]; /* 9.5.3 */ - char ctime [ISODCL (11, 27)]; /* 8.4.26.1 */ - char mtime [ISODCL (28, 44)]; /* 8.4.26.1 */ - char xtime [ISODCL (45, 61)]; /* 8.4.26.1 */ - char ftime [ISODCL (62, 78)]; /* 8.4.26.1 */ - char recfmt [ISODCL (79, 79)]; /* 711 */ - char recattr [ISODCL (80, 80)]; /* 711 */ - u_char reclen [ISODCL (81, 84)]; /* 723 */ - char system_id [ISODCL (85, 116)]; /* achars */ - char system_use [ISODCL (117, 180)]; - char version [ISODCL (181, 181)]; /* 711 */ - char len_esc [ISODCL (182, 182)]; /* 711 */ - char reserved [ISODCL (183, 246)]; - u_char len_au [ISODCL (247, 250)]; /* 723 */ + uchar_t owner [ISODCL(1, 4)]; /* 723 */ + uchar_t group [ISODCL(5, 8)]; /* 723 */ + uchar_t perm [ISODCL(9, 10)]; /* 9.5.3 */ + char ctime [ISODCL(11, 27)]; /* 8.4.26.1 */ + char mtime [ISODCL(28, 44)]; /* 8.4.26.1 */ + char xtime [ISODCL(45, 61)]; /* 8.4.26.1 */ + char ftime [ISODCL(62, 78)]; /* 8.4.26.1 */ + char recfmt [ISODCL(79, 79)]; /* 711 */ + char recattr [ISODCL(80, 80)]; /* 711 */ + uchar_t reclen [ISODCL(81, 84)]; /* 723 */ + char system_id [ISODCL(85, 116)]; /* achars */ + char system_use [ISODCL(117, 180)]; + char version [ISODCL(181, 181)]; /* 711 */ + char len_esc [ISODCL(182, 182)]; /* 711 */ + char reserved [ISODCL(183, 246)]; + uchar_t len_au [ISODCL(247, 250)]; /* 723 */ }; #ifdef _KERNEL /* CD-ROM Format type */ -enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, - ISO_FTYPE_JOLIET, ISO_FTYPE_ECMA, ISO_FTYPE_HIGH_SIERRA }; +enum ISO_FTYPE { + ISO_FTYPE_DEFAULT, + ISO_FTYPE_9660, + ISO_FTYPE_RRIP, + ISO_FTYPE_JOLIET, + ISO_FTYPE_ECMA, + ISO_FTYPE_HIGH_SIERRA +}; #ifndef ISOFSMNT_ROOT #define ISOFSMNT_ROOT 0 @@ -235,7 +245,7 @@ struct iso_mnt { int volume_space_size; - char root[ISODCL (157, 190)]; + char root[ISODCL(157, 190)]; int root_extent; int root_size; enum ISO_FTYPE iso_ftype; @@ -250,32 +260,33 @@ struct iso_mnt { }; struct ifid { - u_short ifid_len; - u_short ifid_pad; + ushort_t ifid_len; + ushort_t ifid_pad; int ifid_ino; long ifid_start; }; -#define VFSTOISOFS(mp) ((struct iso_mnt *)((mp)->mnt_data)) +#define VFSTOISOFS(mp) ((struct iso_mnt *)((mp)->mnt_data)) -#define blkoff(imp, loc) ((loc) & (imp)->im_bmask) -#define lblktosize(imp, blk) ((blk) << (imp)->im_bshift) -#define lblkno(imp, loc) ((loc) >> (imp)->im_bshift) -#define blksize(imp, ip, lbn) ((imp)->logical_block_size) +#define blkoff(imp, loc) ((loc) & (imp)->im_bmask) +#define lblktosize(imp, blk) ((blk) << (imp)->im_bshift) +#define lblkno(imp, loc) ((loc) >> (imp)->im_bshift) +#define blksize(imp, ip, lbn) ((imp)->logical_block_size) int cd9660_vget_internal(struct mount *, ino_t, int, struct vnode **, int, - struct iso_directory_record *); -#define cd9660_sysctl ((int (*)(int *, u_int, void *, size_t *, void *, \ + struct iso_directory_record *); +#define cd9660_sysctl ((int (*)(int *, uint_t, void *, size_t *, void *, \ size_t, struct proc *))eopnotsupp) extern struct vop_vector cd9660_vnodeops; extern struct vop_vector cd9660_fifoops; -int isochar(u_char *, u_char *, int, u_short *, int *, int, void *); -int isofncmp(u_char *, int, u_char *, int, int, int, void *, void *); -void isofntrans(u_char *, int, u_char *, u_short *, int, int, int, int, void *); +int isochar(uchar_t *, uchar_t *, int, ushort_t *, int *, int, void *); +int isofncmp(uchar_t *, int, uchar_t *, int, int, int, void *, void *); +void isofntrans(uchar_t *, int, uchar_t *, ushort_t *, int, int, int, int, + void *); ino_t isodirino(struct iso_directory_record *, struct iso_mnt *); -u_short sgetrune(const char *, size_t, char const **, int, void *); +ushort_t sgetrune(const char *, size_t, char const **, int, void *); #endif /* _KERNEL */ @@ -357,3 +368,5 @@ isonum_733(const unsigned char *p) * Associated files have a leading '='. */ #define ASSOCCHAR '=' + +#endif /* ISO_H */ diff --git a/usr/src/boot/lib/libstand/bootp.c b/usr/src/boot/lib/libstand/bootp.c index 2e8773ca46..a17d399019 100644 --- a/usr/src/boot/lib/libstand/bootp.c +++ b/usr/src/boot/lib/libstand/bootp.c @@ -42,14 +42,14 @@ #include <string.h> -#define BOOTP_DEBUGxx -#define SUPPORT_DHCP +#define BOOTP_DEBUGxx +#define SUPPORT_DHCP #define DHCP_ENV_NOVENDOR 1 /* do not parse vendor options */ #define DHCP_ENV_PXE 10 /* assume pxe vendor options */ #define DHCP_ENV_FREEBSD 11 /* assume freebsd vendor options */ /* set DHCP_ENV to one of the values above to export dhcp options to kenv */ -#define DHCP_ENV DHCP_ENV_NO_VENDOR +#define DHCP_ENV DHCP_ENV_NO_VENDOR #include "stand.h" #include "net.h" @@ -69,16 +69,16 @@ static char vm_cmu[4] = VM_CMU; /* Local forwards */ static ssize_t bootpsend(struct iodesc *, void *, size_t); static ssize_t bootprecv(struct iodesc *, void **, void **, time_t, void *); -static int vend_rfc1048(u_char *, u_int); +static int vend_rfc1048(uchar_t *, uint_t); #ifdef BOOTP_VEND_CMU -static void vend_cmu(u_char *); +static void vend_cmu(uchar_t *); #endif #ifdef DHCP_ENV /* export the dhcp response to kenv */ struct dhcp_opt; -static void setenv_(u_char *cp, u_char *ep, struct dhcp_opt *opts); +static void setenv_(uchar_t *cp, uchar_t *ep, struct dhcp_opt *opts); #else -#define setenv_(a, b, c) +#define setenv_(a, b, c) #endif #ifdef SUPPORT_DHCP @@ -125,37 +125,37 @@ bootp(int sock) struct iodesc *d; struct bootp *bp; struct { - u_char header[HEADER_SIZE]; + uchar_t header[HEADER_SIZE]; struct bootp wbootp; } wbuf; struct bootp *rbootp; #ifdef BOOTP_DEBUG - if (debug) + if (debug) printf("bootp: socket=%d\n", sock); #endif if (!bot) bot = getsecs(); - + if (!(d = socktodesc(sock))) { printf("bootp: bad socket. %d\n", sock); return; } #ifdef BOOTP_DEBUG - if (debug) + if (debug) printf("bootp: d=%lx\n", (long)d); #endif bp = &wbuf.wbootp; - bzero(bp, sizeof(*bp)); + bzero(bp, sizeof (*bp)); bp->bp_op = BOOTREQUEST; bp->bp_htype = 1; /* 10Mb Ethernet (48 bits) */ bp->bp_hlen = 6; bp->bp_xid = htonl(d->xid); MACPY(d->myea, bp->bp_chaddr); - strncpy(bp->bp_file, bootfile, sizeof(bp->bp_file)); - bcopy(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048)); + strncpy(bp->bp_file, bootfile, sizeof (bp->bp_file)); + bcopy(vm_rfc1048, bp->bp_vend, sizeof (vm_rfc1048)); #ifdef SUPPORT_DHCP bp->bp_vend[4] = TAG_DHCP_MSGTYPE; bp->bp_vend[5] = 1; @@ -175,16 +175,15 @@ bootp(int sock) dhcp_ok = 0; #endif - if(sendrecv(d, - bootpsend, bp, sizeof(*bp), - bootprecv, &pkt, (void **)&rbootp, NULL) == -1) { - printf("bootp: no reply\n"); - return; + if (sendrecv(d, bootpsend, bp, sizeof (*bp), + bootprecv, &pkt, (void **)&rbootp, NULL) == -1) { + printf("bootp: no reply\n"); + return; } #ifdef SUPPORT_DHCP - if(dhcp_ok) { - u_int32_t leasetime; + if (dhcp_ok) { + uint32_t leasetime; bp->bp_vend[6] = DHCPREQUEST; bp->bp_vend[7] = TAG_REQ_ADDR; bp->bp_vend[8] = 4; @@ -201,9 +200,8 @@ bootp(int sock) expected_dhcpmsgtype = DHCPACK; free(pkt); - if(sendrecv(d, - bootpsend, bp, sizeof(*bp), - bootprecv, &pkt, (void **)&rbootp, NULL) == -1) { + if (sendrecv(d, bootpsend, bp, sizeof (*bp), + bootprecv, &pkt, (void **)&rbootp, NULL) == -1) { printf("DHCPREQUEST failed\n"); return; } @@ -214,8 +212,8 @@ bootp(int sock) servip = rbootp->bp_siaddr; if (rootip.s_addr == INADDR_ANY) rootip = servip; - bcopy(rbootp->bp_file, bootfile, sizeof(bootfile)); - bootfile[sizeof(bootfile) - 1] = '\0'; + bcopy(rbootp->bp_file, bootfile, sizeof (bootfile)); + bootfile[sizeof (bootfile) - 1] = '\0'; if (!netmask) { if (IN_CLASSA(ntohl(myip.s_addr))) @@ -269,7 +267,7 @@ bootpsend(struct iodesc *d, void *pkt, size_t len) #endif bp = pkt; - bp->bp_secs = htons((u_short)(getsecs() - bot)); + bp->bp_secs = htons((ushort_t)(getsecs() - bot)); #ifdef BOOTP_DEBUG if (debug) @@ -294,7 +292,7 @@ bootprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft, ptr = NULL; n = readudp(d, &ptr, (void **)&bp, tleft); - if (n == -1 || n < sizeof(struct bootp) - BOOTP_VENDSIZE) + if (n == -1 || n < sizeof (struct bootp) - BOOTP_VENDSIZE) goto bad; #ifdef BOOTP_DEBUG @@ -317,10 +315,10 @@ bootprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft, #endif /* Suck out vendor info */ - if (bcmp(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048)) == 0) { + if (bcmp(vm_rfc1048, bp->bp_vend, sizeof (vm_rfc1048)) == 0) { int vsize = n - offsetof(struct bootp, bp_vend); - if(vend_rfc1048(bp->bp_vend, vsize) != 0) - goto bad; + if (vend_rfc1048(bp->bp_vend, vsize) != 0) + goto bad; /* Save copy of bootp reply or DHCP ACK message */ if (bp->bp_op == BOOTREPLY && @@ -335,7 +333,7 @@ bootprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft, } } #ifdef BOOTP_VEND_CMU - else if (bcmp(vm_cmu, bp->bp_vend, sizeof(vm_cmu)) == 0) + else if (bcmp(vm_cmu, bp->bp_vend, sizeof (vm_cmu)) == 0) vend_cmu(bp->bp_vend); #endif else @@ -343,7 +341,7 @@ bootprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft, *pkt = ptr; *payload = bp; - return(n); + return (n); bad: free(ptr); errno = 0; @@ -351,11 +349,11 @@ bad: } static int -vend_rfc1048(u_char *cp, u_int len) +vend_rfc1048(uchar_t *cp, uint_t len) { - u_char *ep; + uchar_t *ep; int size; - u_char tag; + uchar_t tag; const char *val; #ifdef BOOTP_DEBUG @@ -365,7 +363,7 @@ vend_rfc1048(u_char *cp, u_int len) ep = cp + len; /* Step over magic cookie */ - cp += sizeof(int); + cp += sizeof (int); setenv_(cp, ep, NULL); @@ -376,24 +374,24 @@ vend_rfc1048(u_char *cp, u_int len) break; if (tag == TAG_SUBNET_MASK) { - bcopy(cp, &netmask, sizeof(netmask)); + bcopy(cp, &netmask, sizeof (netmask)); } if (tag == TAG_GATEWAY) { - bcopy(cp, &gateip.s_addr, sizeof(gateip.s_addr)); + bcopy(cp, &gateip.s_addr, sizeof (gateip.s_addr)); } if (tag == TAG_SWAPSERVER) { /* let it override bp_siaddr */ - bcopy(cp, &rootip.s_addr, sizeof(rootip.s_addr)); + bcopy(cp, &rootip.s_addr, sizeof (rootip.s_addr)); } if (tag == TAG_ROOTPATH) { if ((val = getenv("dhcp.root-path")) == NULL) val = (const char *)cp; - strlcpy(rootpath, val, sizeof(rootpath)); + strlcpy(rootpath, val, sizeof (rootpath)); } if (tag == TAG_HOSTNAME) { if ((val = getenv("dhcp.host-name")) == NULL) val = (const char *)cp; - strlcpy(hostname, val, sizeof(hostname)); + strlcpy(hostname, val, sizeof (hostname)); } if (tag == TAG_INTF_MTU) { intf_mtu = 0; @@ -414,7 +412,7 @@ vend_rfc1048(u_char *cp, u_int len) "ignoring\n", "dhcp.interface-mtu", val); } else { - intf_mtu = (u_int)tmp; + intf_mtu = (uint_t)tmp; } } if (intf_mtu == 0) @@ -422,23 +420,23 @@ vend_rfc1048(u_char *cp, u_int len) } #ifdef SUPPORT_DHCP if (tag == TAG_DHCP_MSGTYPE) { - if(*cp != expected_dhcpmsgtype) - return(-1); + if (*cp != expected_dhcpmsgtype) + return (-1); dhcp_ok = 1; } if (tag == TAG_SERVERID) { bcopy(cp, &dhcp_serverip.s_addr, - sizeof(dhcp_serverip.s_addr)); + sizeof (dhcp_serverip.s_addr)); } #endif cp += size; } - return(0); + return (0); } #ifdef BOOTP_VEND_CMU static void -vend_cmu(u_char *cp) +vend_cmu(uchar_t *cp) { struct cmu_vend *vp; @@ -632,144 +630,150 @@ static struct dhcp_opt dhcp_opt[] = { * to the list of selected tags. */ static void -setenv_(u_char *cp, u_char *ep, struct dhcp_opt *opts) +setenv_(uchar_t *cp, uchar_t *ep, struct dhcp_opt *opts) { - u_char *ncp; - u_char tag; - char tags[512], *tp; /* the list of tags */ - -#define FLD_SEP ',' /* separator in list of elements */ - ncp = cp; - tp = tags; - if (opts == NULL) - opts = dhcp_opt; - - while (ncp < ep) { - unsigned int size; /* option size */ - char *vp, *endv, buf[256]; /* the value buffer */ - struct dhcp_opt *op; - - tag = *ncp++; /* extract tag and size */ - size = *ncp++; - cp = ncp; /* current payload */ - ncp += size; /* point to the next option */ - - if (tag == TAG_END) - break; - if (tag == 0) - continue; - - for (op = opts+1; op->tag && op->tag != tag; op++) - ; - /* if not found we end up on the default entry */ + uchar_t *ncp; + uchar_t tag; + char tags[512], *tp; /* the list of tags */ + +#define FLD_SEP ',' /* separator in list of elements */ + ncp = cp; + tp = tags; + if (opts == NULL) + opts = dhcp_opt; + + while (ncp < ep) { + unsigned int size; /* option size */ + char *vp, *endv, buf[256]; /* the value buffer */ + struct dhcp_opt *op; + + tag = *ncp++; /* extract tag and size */ + size = *ncp++; + cp = ncp; /* current payload */ + ncp += size; /* point to the next option */ - /* - * Copy data into the buffer. libstand does not have snprintf so we - * need to be careful with sprintf(). With strings, the source is - * always <256 char so shorter than the buffer so we are safe; with - * other arguments, the longest string is inet_ntoa which is 16 bytes - * so we make sure to have always enough room in the string before - * trying an sprint. - */ - vp = buf; - *vp = '\0'; - endv = buf + sizeof(buf) - 1 - 16; /* last valid write position */ - - switch(op->fmt) { - case __NONE: - break; /* should not happen */ - - case __VE: /* recurse, vendor specific */ - setenv_(cp, cp+size, vndr_opt); - break; - - case __IP: /* ip address */ - for (; size > 0 && vp < endv; size -= 4, cp += 4) { - struct in_addr in_ip; /* ip addresses */ - if (vp != buf) - *vp++ = FLD_SEP; - bcopy(cp, &in_ip.s_addr, sizeof(in_ip.s_addr)); - sprintf(vp, "%s", inet_ntoa(in_ip)); - vp += strlen(vp); - } - break; - - case __BYTES: /* opaque byte string */ - for (; size > 0 && vp < endv; size -= 1, cp += 1) { - sprintf(vp, "%02x", *cp); - vp += strlen(vp); - } - break; - - case __TXT: - bcopy(cp, buf, size); /* cannot overflow */ - buf[size] = 0; - break; - - case __32: - case __16: - case __8: /* op->fmt is also the length of each field */ - for (; size > 0 && vp < endv; size -= op->fmt, cp += op->fmt) { - uint32_t v; - if (op->fmt == __32) - v = (cp[0]<<24) + (cp[1]<<16) + (cp[2]<<8) + cp[3]; - else if (op->fmt == __16) - v = (cp[0]<<8) + cp[1]; - else - v = cp[0]; - if (vp != buf) - *vp++ = FLD_SEP; - sprintf(vp, "%u", v); - vp += strlen(vp); - } - break; - - case __INDIR: /* name=value */ - case __ILIST: /* name=value;name=value... */ - bcopy(cp, buf, size); /* cannot overflow */ - buf[size] = '\0'; - for (endv = buf; endv; endv = vp) { - char *s = NULL; /* semicolon ? */ - - /* skip leading whitespace */ - while (*endv && strchr(" \t\n\r", *endv)) - endv++; - vp = strchr(endv, '='); /* find name=value separator */ - if (!vp) - break; - *vp++ = 0; - if (op->fmt == __ILIST && (s = strchr(vp, ';'))) - *s++ = '\0'; - setenv(endv, vp, 1); - vp = s; /* prepare for next round */ - } - buf[0] = '\0'; /* option already done */ - } + if (tag == TAG_END) + break; + if (tag == 0) + continue; + + for (op = opts+1; op->tag && op->tag != tag; op++) + ; + /* if not found we end up on the default entry */ + + /* + * Copy data into the buffer. libstand does not have snprintf + * so we need to be careful with sprintf(). With strings, the + * source is always <256 char so shorter than the buffer so we + * are safe; with other arguments, the longest string is + * inet_ntoa which is 16 bytes so we make sure to have always + * enough room in the string before trying an sprint. + */ + vp = buf; + *vp = '\0'; + /* last valid write position */ + endv = buf + sizeof (buf) - 1 - 16; + + switch (op->fmt) { + case __NONE: + break; /* should not happen */ + + case __VE: /* recurse, vendor specific */ + setenv_(cp, cp+size, vndr_opt); + break; - if (tp - tags < sizeof(tags) - 5) { /* add tag to the list */ - if (tp != tags) - *tp++ = FLD_SEP; - sprintf(tp, "%d", tag); - tp += strlen(tp); + case __IP: /* ip address */ + for (; size > 0 && vp < endv; size -= 4, cp += 4) { + struct in_addr in_ip; /* ip addresses */ + if (vp != buf) + *vp++ = FLD_SEP; + bcopy(cp, &in_ip.s_addr, sizeof (in_ip.s_addr)); + sprintf(vp, "%s", inet_ntoa(in_ip)); + vp += strlen(vp); + } + break; + + case __BYTES: /* opaque byte string */ + for (; size > 0 && vp < endv; size -= 1, cp += 1) { + sprintf(vp, "%02x", *cp); + vp += strlen(vp); + } + break; + + case __TXT: + bcopy(cp, buf, size); /* cannot overflow */ + buf[size] = 0; + break; + + case __32: + case __16: + case __8: /* op->fmt is also the length of each field */ + for (; size > 0 && vp < endv; + size -= op->fmt, cp += op->fmt) { + uint32_t v; + if (op->fmt == __32) + v = (cp[0]<<24) + (cp[1]<<16) + + (cp[2]<<8) + cp[3]; + else if (op->fmt == __16) + v = (cp[0]<<8) + cp[1]; + else + v = cp[0]; + if (vp != buf) + *vp++ = FLD_SEP; + sprintf(vp, "%u", v); + vp += strlen(vp); + } + break; + + case __INDIR: /* name=value */ + case __ILIST: /* name=value;name=value... */ + bcopy(cp, buf, size); /* cannot overflow */ + buf[size] = '\0'; + for (endv = buf; endv; endv = vp) { + char *s = NULL; /* semicolon ? */ + + /* skip leading whitespace */ + while (*endv && strchr(" \t\n\r", *endv)) + endv++; + /* find name=value separator */ + vp = strchr(endv, '='); + if (!vp) + break; + *vp++ = 0; + if (op->fmt == __ILIST && (s = strchr(vp, ';'))) + *s++ = '\0'; + setenv(endv, vp, 1); + vp = s; /* prepare for next round */ + } + buf[0] = '\0'; /* option already done */ + } + + if (tp - tags < sizeof (tags) - 5) { + /* add tag to the list */ + if (tp != tags) + *tp++ = FLD_SEP; + sprintf(tp, "%d", tag); + tp += strlen(tp); + } + if (buf[0]) { + char env[128]; /* the string name */ + + if (op->tag == 0) + sprintf(env, op->desc, opts[0].desc, tag); + else + sprintf(env, "%s%s", opts[0].desc, op->desc); + /* + * Do not replace existing values in the environment, + * so that locally-obtained values can override + * server-provided values. + */ + setenv(env, buf, 0); + } } - if (buf[0]) { - char env[128]; /* the string name */ - - if (op->tag == 0) - sprintf(env, op->desc, opts[0].desc, tag); - else - sprintf(env, "%s%s", opts[0].desc, op->desc); - /* - * Do not replace existing values in the environment, so that - * locally-obtained values can override server-provided values. - */ - setenv(env, buf, 0); + if (tp != tags) { + char env[128]; /* the string name */ + sprintf(env, "%stags", opts[0].desc); + setenv(env, tags, 1); } - } - if (tp != tags) { - char env[128]; /* the string name */ - sprintf(env, "%stags", opts[0].desc); - setenv(env, tags, 1); - } } #endif /* additional dhcp */ diff --git a/usr/src/boot/lib/libstand/bootp.h b/usr/src/boot/lib/libstand/bootp.h index 4fbb712e7d..b26a5cd45c 100644 --- a/usr/src/boot/lib/libstand/bootp.h +++ b/usr/src/boot/lib/libstand/bootp.h @@ -18,11 +18,11 @@ * without express or implied warranty. */ -#include <netinet/in.h> - #ifndef _BOOTP_H_ #define _BOOTP_H_ +#include <netinet/in.h> + struct bootp { unsigned char bp_op; /* packet opcode type */ unsigned char bp_htype; /* hardware addr type */ @@ -39,11 +39,11 @@ struct bootp { unsigned char bp_sname[64]; /* server host name */ char bp_file[128]; /* boot file name */ #ifdef SUPPORT_DHCP -#define BOOTP_VENDSIZE 312 +#define BOOTP_VENDSIZE 312 #else -#define BOOTP_VENDSIZE 64 +#define BOOTP_VENDSIZE 64 #endif - unsigned char bp_vend[BOOTP_VENDSIZE]; /* vendor-specific area */ + unsigned char bp_vend[BOOTP_VENDSIZE]; /* vendor-specific area */ }; /* @@ -52,73 +52,71 @@ struct bootp { #define IPPORT_BOOTPS 67 #define IPPORT_BOOTPC 68 -#define BOOTREPLY 2 -#define BOOTREQUEST 1 +#define BOOTREPLY 2 +#define BOOTREQUEST 1 /* * Vendor magic cookie (v_magic) for CMU */ -#define VM_CMU "CMU" +#define VM_CMU "CMU" /* * Vendor magic cookie (v_magic) for RFC1048 */ -#define VM_RFC1048 { 99, 130, 83, 99 } - - +#define VM_RFC1048 { 99, 130, 83, 99 } /* * RFC1048 tag values used to specify what information is being supplied in * the vendor field of the packet. */ -#define TAG_PAD ((unsigned char) 0) -#define TAG_SUBNET_MASK ((unsigned char) 1) -#define TAG_TIME_OFFSET ((unsigned char) 2) -#define TAG_GATEWAY ((unsigned char) 3) -#define TAG_TIME_SERVER ((unsigned char) 4) -#define TAG_NAME_SERVER ((unsigned char) 5) -#define TAG_DOMAIN_SERVER ((unsigned char) 6) -#define TAG_LOG_SERVER ((unsigned char) 7) -#define TAG_COOKIE_SERVER ((unsigned char) 8) -#define TAG_LPR_SERVER ((unsigned char) 9) -#define TAG_IMPRESS_SERVER ((unsigned char) 10) -#define TAG_RLP_SERVER ((unsigned char) 11) -#define TAG_HOSTNAME ((unsigned char) 12) -#define TAG_BOOTSIZE ((unsigned char) 13) -#define TAG_DUMPFILE ((unsigned char) 14) -#define TAG_DOMAINNAME ((unsigned char) 15) -#define TAG_SWAPSERVER ((unsigned char) 16) -#define TAG_ROOTPATH ((unsigned char) 17) +#define TAG_PAD ((unsigned char) 0) +#define TAG_SUBNET_MASK ((unsigned char) 1) +#define TAG_TIME_OFFSET ((unsigned char) 2) +#define TAG_GATEWAY ((unsigned char) 3) +#define TAG_TIME_SERVER ((unsigned char) 4) +#define TAG_NAME_SERVER ((unsigned char) 5) +#define TAG_DOMAIN_SERVER ((unsigned char) 6) +#define TAG_LOG_SERVER ((unsigned char) 7) +#define TAG_COOKIE_SERVER ((unsigned char) 8) +#define TAG_LPR_SERVER ((unsigned char) 9) +#define TAG_IMPRESS_SERVER ((unsigned char) 10) +#define TAG_RLP_SERVER ((unsigned char) 11) +#define TAG_HOSTNAME ((unsigned char) 12) +#define TAG_BOOTSIZE ((unsigned char) 13) +#define TAG_DUMPFILE ((unsigned char) 14) +#define TAG_DOMAINNAME ((unsigned char) 15) +#define TAG_SWAPSERVER ((unsigned char) 16) +#define TAG_ROOTPATH ((unsigned char) 17) #define TAG_INTF_MTU ((unsigned char) 26) #ifdef SUPPORT_DHCP -#define TAG_REQ_ADDR ((unsigned char) 50) -#define TAG_LEASETIME ((unsigned char) 51) -#define TAG_OVERLOAD ((unsigned char) 52) -#define TAG_DHCP_MSGTYPE ((unsigned char) 53) -#define TAG_SERVERID ((unsigned char) 54) -#define TAG_PARAM_REQ ((unsigned char) 55) -#define TAG_MSG ((unsigned char) 56) -#define TAG_MAXSIZE ((unsigned char) 57) -#define TAG_T1 ((unsigned char) 58) -#define TAG_T2 ((unsigned char) 59) -#define TAG_CLASSID ((unsigned char) 60) -#define TAG_CLIENTID ((unsigned char) 61) -#define TAG_USER_CLASS ((unsigned char) 77) +#define TAG_REQ_ADDR ((unsigned char) 50) +#define TAG_LEASETIME ((unsigned char) 51) +#define TAG_OVERLOAD ((unsigned char) 52) +#define TAG_DHCP_MSGTYPE ((unsigned char) 53) +#define TAG_SERVERID ((unsigned char) 54) +#define TAG_PARAM_REQ ((unsigned char) 55) +#define TAG_MSG ((unsigned char) 56) +#define TAG_MAXSIZE ((unsigned char) 57) +#define TAG_T1 ((unsigned char) 58) +#define TAG_T2 ((unsigned char) 59) +#define TAG_CLASSID ((unsigned char) 60) +#define TAG_CLIENTID ((unsigned char) 61) +#define TAG_USER_CLASS ((unsigned char) 77) #endif -#define TAG_END ((unsigned char) 255) +#define TAG_END ((unsigned char) 255) #ifdef SUPPORT_DHCP -#define DHCPDISCOVER 1 -#define DHCPOFFER 2 -#define DHCPREQUEST 3 -#define DHCPDECLINE 4 -#define DHCPACK 5 -#define DHCPNAK 6 -#define DHCPRELEASE 7 +#define DHCPDISCOVER 1 +#define DHCPOFFER 2 +#define DHCPREQUEST 3 +#define DHCPDECLINE 4 +#define DHCPACK 5 +#define DHCPNAK 6 +#define DHCPRELEASE 7 #endif /* @@ -138,7 +136,7 @@ struct cmu_vend { /* v_flags values */ -#define VF_SMASK 1 /* Subnet mask field contains valid data */ +#define VF_SMASK 1 /* Subnet mask field contains valid data */ /* cached bootp response/dhcp ack */ extern struct bootp *bootp_response; diff --git a/usr/src/boot/lib/libstand/cd9660.c b/usr/src/boot/lib/libstand/cd9660.c index 9a780b44f7..3b28e20485 100644 --- a/usr/src/boot/lib/libstand/cd9660.c +++ b/usr/src/boot/lib/libstand/cd9660.c @@ -55,10 +55,10 @@ typedef struct { ISO_SUSP_HEADER h; - u_char signature [ISODCL ( 5, 6)]; - u_char len_skp [ISODCL ( 7, 7)]; /* 711 */ + uchar_t signature [ISODCL(5, 6)]; + uchar_t len_skp [ISODCL(7, 7)]; /* 711 */ } ISO_SUSP_PRESENT; - + static int buf_read_file(struct open_file *f, char **buf_p, size_t *size_p); static int cd9660_open(const char *path, struct open_file *f); @@ -79,14 +79,14 @@ static ISO_SUSP_HEADER *susp_lookup_record(struct open_file *f, int lenskip); struct fs_ops cd9660_fsops = { - "cd9660", - cd9660_open, - cd9660_close, - cd9660_read, - null_write, - cd9660_seek, - cd9660_stat, - cd9660_readdir + .fs_name = "cd9660", + .fo_open = cd9660_open, + .fo_close = cd9660_close, + .fo_read = cd9660_read, + .fo_write = null_write, + .fo_seek = cd9660_seek, + .fo_stat = cd9660_stat, + .fo_readdir = cd9660_readdir }; #define F_ISDIR 0x0001 /* Directory */ @@ -94,20 +94,20 @@ struct fs_ops cd9660_fsops = { #define F_RR 0x0004 /* Rock Ridge on this volume */ struct file { - int f_flags; /* file flags */ - off_t f_off; /* Current offset within file */ - daddr_t f_bno; /* Starting block number */ - off_t f_size; /* Size of file */ - daddr_t f_buf_blkno; /* block number of data block */ + int f_flags; /* file flags */ + off_t f_off; /* Current offset within file */ + daddr_t f_bno; /* Starting block number */ + off_t f_size; /* Size of file */ + daddr_t f_buf_blkno; /* block number of data block */ char *f_buf; /* buffer for data block */ int f_susp_skip; /* len_skip for SUSP records */ }; struct ptable_ent { - char namlen [ISODCL( 1, 1)]; /* 711 */ - char extlen [ISODCL( 2, 2)]; /* 711 */ - char block [ISODCL( 3, 6)]; /* 732 */ - char parent [ISODCL( 7, 8)]; /* 722 */ + char namlen [ISODCL(1, 1)]; /* 711 */ + char extlen [ISODCL(2, 2)]; /* 711 */ + char block [ISODCL(3, 6)]; /* 732 */ + char parent [ISODCL(7, 8)]; /* 722 */ char name [1]; }; #define PTFIXSZ 8 @@ -205,7 +205,7 @@ rrip_check(struct open_file *f, struct iso_directory_record *dp, int *lenskip) sp = (ISO_SUSP_PRESENT *)p; if (bcmp(sp->h.type, SUSP_PRESENT, 2) != 0) return (0); - if (isonum_711(sp->h.length) != sizeof(ISO_SUSP_PRESENT)) + if (isonum_711(sp->h.length) != sizeof (ISO_SUSP_PRESENT)) return (0); if (sp->signature[0] != 0xbe || sp->signature[1] != 0xef) return (0); @@ -247,10 +247,10 @@ dirmatch(struct open_file *f, const char *path, struct iso_directory_record *dp, continue; if (!icase && toupper(*path) == *cp) continue; - return 0; + return (0); } if (*path && *path != '/') - return 0; + return (0); /* * Allow stripping of trailing dots and the version number. * Note that this will find the first instead of the last version @@ -259,12 +259,12 @@ dirmatch(struct open_file *f, const char *path, struct iso_directory_record *dp, if (i >= 0 && (*cp == ';' || *cp == '.')) { /* This is to prevent matching of numeric extensions */ if (*cp == '.' && cp[1] != ';') - return 0; + return (0); while (--i >= 0) if (*++cp != ';' && (*cp < '0' || *cp > '9')) - return 0; + return (0); } - return 1; + return (1); } static int @@ -282,7 +282,7 @@ cd9660_open(const char *path, struct open_file *f) /* First find the volume descriptor */ buf = malloc(buf_size = ISO_DEFAULT_BLOCK_SIZE); vd = buf; - for (bno = 16;; bno++) { + for (bno = 16; ; bno++) { twiddle(1); rc = f->f_dev->dv_strategy(f->f_devdata, F_READ, cdb2devb(bno), ISO_DEFAULT_BLOCK_SIZE, buf, &read); @@ -293,7 +293,7 @@ cd9660_open(const char *path, struct open_file *f) goto out; } rc = EINVAL; - if (bcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0) + if (bcmp(vd->id, ISO_STANDARD_ID, sizeof (vd->id)) != 0) goto out; if (isonum_711(vd->type) == ISO_VD_END) goto out; @@ -317,11 +317,10 @@ cd9660_open(const char *path, struct open_file *f) while (off < dsize) { if ((off % ISO_DEFAULT_BLOCK_SIZE) == 0) { twiddle(1); - rc = f->f_dev->dv_strategy - (f->f_devdata, F_READ, - cdb2devb(bno + boff), - ISO_DEFAULT_BLOCK_SIZE, - buf, &read); + rc = f->f_dev->dv_strategy(f->f_devdata, F_READ, + cdb2devb(bno + boff), + ISO_DEFAULT_BLOCK_SIZE, + buf, &read); if (rc) goto out; if (read != ISO_DEFAULT_BLOCK_SIZE) { @@ -329,12 +328,12 @@ cd9660_open(const char *path, struct open_file *f) goto out; } boff++; - dp = (struct iso_directory_record *) buf; + dp = (struct iso_directory_record *)buf; } if (isonum_711(dp->length) == 0) { - /* skip to next block, if any */ - off = boff * ISO_DEFAULT_BLOCK_SIZE; - continue; + /* skip to next block, if any */ + off = boff * ISO_DEFAULT_BLOCK_SIZE; + continue; } /* See if RRIP is in use. */ @@ -342,14 +341,14 @@ cd9660_open(const char *path, struct open_file *f) use_rrip = rrip_check(f, dp, &lenskip); if (dirmatch(f, path, dp, use_rrip, - first ? 0 : lenskip)) { + first ? 0 : lenskip)) { first = 0; break; } else first = 0; dp = (struct iso_directory_record *) - ((char *) dp + isonum_711(dp->length)); + ((char *)dp + isonum_711(dp->length)); /* If the new block has zero length, it is padding. */ if (isonum_711(dp->length) == 0) { /* Skip to next block, if any. */ @@ -370,8 +369,8 @@ cd9660_open(const char *path, struct open_file *f) } /* allocate file system specific data structure */ - fp = malloc(sizeof(struct file)); - bzero(fp, sizeof(struct file)); + fp = malloc(sizeof (struct file)); + bzero(fp, sizeof (struct file)); f->f_fsdata = (void *)fp; if ((isonum_711(rec.flags) & 2) != 0) { @@ -403,14 +402,14 @@ cd9660_open(const char *path, struct open_file *f) fp->f_size = isonum_733(rec.size); free(buf); - return 0; + return (0); out: if (fp) free(fp); free(buf); - return rc; + return (rc); } static int @@ -421,7 +420,7 @@ cd9660_close(struct open_file *f) f->f_fsdata = NULL; free(fp); - return 0; + return (0); } static int @@ -508,7 +507,7 @@ again: if (isonum_711(ep->length) == 0) { daddr_t blkno; - + /* skip to next block, if any */ blkno = fp->f_off / ISO_DEFAULT_BLOCK_SIZE; fp->f_off = (blkno + 1) * ISO_DEFAULT_BLOCK_SIZE; @@ -535,7 +534,7 @@ again: } } } - reclen = sizeof(struct dirent) - (MAXNAMLEN+1) + namelen + 1; + reclen = sizeof (struct dirent) - (MAXNAMLEN+1) + namelen + 1; reclen = (reclen + 3) & ~3; d->d_fileno = isonum_733(ep->extent); @@ -569,9 +568,9 @@ cd9660_seek(struct open_file *f, off_t offset, int where) fp->f_off = fp->f_size - offset; break; default: - return -1; + return (-1); } - return fp->f_off; + return (fp->f_off); } static int @@ -587,5 +586,5 @@ cd9660_stat(struct open_file *f, struct stat *sb) sb->st_mode |= S_IFREG; sb->st_uid = sb->st_gid = 0; sb->st_size = fp->f_size; - return 0; + return (0); } diff --git a/usr/src/boot/lib/libstand/dosfs.c b/usr/src/boot/lib/libstand/dosfs.c index 8d5adb4cc9..1732511b07 100644 --- a/usr/src/boot/lib/libstand/dosfs.c +++ b/usr/src/boot/lib/libstand/dosfs.c @@ -41,138 +41,138 @@ #include "dosfs.h" -static int dos_open(const char *path, struct open_file *fd); -static int dos_close(struct open_file *fd); -static int dos_read(struct open_file *fd, void *buf, size_t size, size_t *resid); -static off_t dos_seek(struct open_file *fd, off_t offset, int whence); -static int dos_stat(struct open_file *fd, struct stat *sb); -static int dos_readdir(struct open_file *fd, struct dirent *d); +static int dos_open(const char *, struct open_file *); +static int dos_close(struct open_file *); +static int dos_read(struct open_file *, void *, size_t, size_t *); +static off_t dos_seek(struct open_file *, off_t offset, int); +static int dos_stat(struct open_file *, struct stat *); +static int dos_readdir(struct open_file *, struct dirent *); struct fs_ops dosfs_fsops = { - "dosfs", - dos_open, - dos_close, - dos_read, - null_write, - dos_seek, - dos_stat, - dos_readdir + .fs_name = "dosfs", + .fo_open = dos_open, + .fo_close = dos_close, + .fo_read = dos_read, + .fo_write = null_write, + .fo_seek = dos_seek, + .fo_stat = dos_stat, + .fo_readdir = dos_readdir }; -#define SECSIZ 512 /* sector size */ -#define SSHIFT 9 /* SECSIZ shift */ -#define DEPSEC 16 /* directory entries per sector */ -#define DSHIFT 4 /* DEPSEC shift */ -#define LOCLUS 2 /* lowest cluster number */ -#define FATBLKSZ 0x20000 /* size of block in the FAT cache buffer */ +#define SECSIZ 512 /* sector size */ +#define SSHIFT 9 /* SECSIZ shift */ +#define DEPSEC 16 /* directory entries per sector */ +#define DSHIFT 4 /* DEPSEC shift */ +#define LOCLUS 2 /* lowest cluster number */ +#define FATBLKSZ 0x20000 /* size of block in the FAT cache buffer */ /* DOS "BIOS Parameter Block" */ typedef struct { - u_char secsiz[2]; /* sector size */ - u_char spc; /* sectors per cluster */ - u_char ressec[2]; /* reserved sectors */ - u_char fats; /* FATs */ - u_char dirents[2]; /* root directory entries */ - u_char secs[2]; /* total sectors */ - u_char media; /* media descriptor */ - u_char spf[2]; /* sectors per FAT */ - u_char spt[2]; /* sectors per track */ - u_char heads[2]; /* drive heads */ - u_char hidsec[4]; /* hidden sectors */ - u_char lsecs[4]; /* huge sectors */ - u_char lspf[4]; /* huge sectors per FAT */ - u_char xflg[2]; /* flags */ - u_char vers[2]; /* filesystem version */ - u_char rdcl[4]; /* root directory start cluster */ - u_char infs[2]; /* filesystem info sector */ - u_char bkbs[2]; /* backup boot sector */ + uchar_t secsiz[2]; /* sector size */ + uchar_t spc; /* sectors per cluster */ + uchar_t ressec[2]; /* reserved sectors */ + uchar_t fats; /* FATs */ + uchar_t dirents[2]; /* root directory entries */ + uchar_t secs[2]; /* total sectors */ + uchar_t media; /* media descriptor */ + uchar_t spf[2]; /* sectors per FAT */ + uchar_t spt[2]; /* sectors per track */ + uchar_t heads[2]; /* drive heads */ + uchar_t hidsec[4]; /* hidden sectors */ + uchar_t lsecs[4]; /* huge sectors */ + uchar_t lspf[4]; /* huge sectors per FAT */ + uchar_t xflg[2]; /* flags */ + uchar_t vers[2]; /* filesystem version */ + uchar_t rdcl[4]; /* root directory start cluster */ + uchar_t infs[2]; /* filesystem info sector */ + uchar_t bkbs[2]; /* backup boot sector */ } DOS_BPB; /* Initial portion of DOS boot sector */ typedef struct { - u_char jmp[3]; /* usually 80x86 'jmp' opcode */ - u_char oem[8]; /* OEM name and version */ - DOS_BPB bpb; /* BPB */ + uchar_t jmp[3]; /* usually 80x86 'jmp' opcode */ + uchar_t oem[8]; /* OEM name and version */ + DOS_BPB bpb; /* BPB */ } DOS_BS; /* Supply missing "." and ".." root directory entries */ static const char *const dotstr[2] = {".", ".."}; static DOS_DE dot[2] = { - {". ", " ", FA_DIR, {0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, - {0, 0}, {0x21, 0}, {0, 0}, {0, 0, 0, 0}}, - {".. ", " ", FA_DIR, {0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, - {0, 0}, {0x21, 0}, {0, 0}, {0, 0, 0, 0}} + {". ", " ", FA_DIR, {0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, + {0, 0}, {0x21, 0}, {0, 0}, {0, 0, 0, 0}}, + {".. ", " ", FA_DIR, {0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, + {0, 0}, {0x21, 0}, {0, 0}, {0, 0, 0, 0}} }; /* The usual conversion macros to avoid multiplication and division */ -#define bytsec(n) ((n) >> SSHIFT) -#define secbyt(s) ((s) << SSHIFT) -#define entsec(e) ((e) >> DSHIFT) -#define bytblk(fs, n) ((n) >> (fs)->bshift) -#define blkbyt(fs, b) ((b) << (fs)->bshift) -#define secblk(fs, s) ((s) >> ((fs)->bshift - SSHIFT)) -#define blksec(fs, b) ((b) << ((fs)->bshift - SSHIFT)) +#define bytsec(n) ((n) >> SSHIFT) +#define secbyt(s) ((s) << SSHIFT) +#define entsec(e) ((e) >> DSHIFT) +#define bytblk(fs, n) ((n) >> (fs)->bshift) +#define blkbyt(fs, b) ((b) << (fs)->bshift) +#define secblk(fs, s) ((s) >> ((fs)->bshift - SSHIFT)) +#define blksec(fs, b) ((b) << ((fs)->bshift - SSHIFT)) /* Convert cluster number to offset within filesystem */ -#define blkoff(fs, b) (secbyt((fs)->lsndta) + blkbyt(fs, (b) - LOCLUS)) +#define blkoff(fs, b) (secbyt((fs)->lsndta) + blkbyt(fs, (b) - LOCLUS)) /* Convert cluster number to logical sector number */ -#define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) +#define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) /* Convert cluster number to offset within FAT */ -#define fatoff(sz, c) ((sz) == 12 ? (c) + ((c) >> 1) : \ - (sz) == 16 ? (c) << 1 : \ +#define fatoff(sz, c) ((sz) == 12 ? (c) + ((c) >> 1) : \ + (sz) == 16 ? (c) << 1 : \ (c) << 2) /* Does cluster number reference a valid data cluster? */ -#define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) +#define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) /* Get start cluster from directory entry */ -#define stclus(sz, de) ((sz) != 32 ? cv2((de)->clus) : \ - ((u_int)cv2((de)->dex.h_clus) << 16) | \ - cv2((de)->clus)) +#define stclus(sz, de) ((sz) != 32 ? cv2((de)->clus) : \ + ((uint_t)cv2((de)->dex.h_clus) << 16) | \ + cv2((de)->clus)) static int parsebs(DOS_FS *, DOS_BS *); static int namede(DOS_FS *, const char *, DOS_DE **); -static int lookup(DOS_FS *, u_int, const char *, DOS_DE **); -static void cp_xdnm(u_char *, DOS_XDE *); -static void cp_sfn(u_char *, DOS_DE *); +static int lookup(DOS_FS *, uint_t, const char *, DOS_DE **); +static void cp_xdnm(uchar_t *, DOS_XDE *); +static void cp_sfn(uchar_t *, DOS_DE *); static off_t fsize(DOS_FS *, DOS_DE *); -static int fatcnt(DOS_FS *, u_int); -static int fatget(DOS_FS *, u_int *); -static int fatend(u_int, u_int); -static int ioread(DOS_FS *, u_int, void *, size_t); +static int fatcnt(DOS_FS *, uint_t); +static int fatget(DOS_FS *, uint_t *); +static int fatend(uint_t, uint_t); +static int ioread(DOS_FS *, uint_t, void *, size_t); static int ioget(struct open_file *, daddr_t, void *, size_t); static int -dos_read_fatblk(DOS_FS *fs, struct open_file *fd, u_int blknum) +dos_read_fatblk(DOS_FS *fs, struct open_file *fd, uint_t blknum) { - int err; - size_t io_size; - daddr_t offset_in_fat, max_offset_in_fat; - - offset_in_fat = ((daddr_t)blknum) * FATBLKSZ; - max_offset_in_fat = secbyt(fs->spf); - io_size = FATBLKSZ; - if (offset_in_fat > max_offset_in_fat) - offset_in_fat = max_offset_in_fat; - if (offset_in_fat + io_size > max_offset_in_fat) - io_size = ((size_t)(max_offset_in_fat - offset_in_fat)); - - if (io_size != 0) { - err = ioget(fd, fs->lsnfat + bytsec(offset_in_fat), - fs->fatbuf, io_size); - if (err != 0) { - fs->fatbuf_blknum = ((u_int)(-1)); - return (err); + int err; + size_t io_size; + daddr_t offset_in_fat, max_offset_in_fat; + + offset_in_fat = ((daddr_t)blknum) * FATBLKSZ; + max_offset_in_fat = secbyt(fs->spf); + io_size = FATBLKSZ; + if (offset_in_fat > max_offset_in_fat) + offset_in_fat = max_offset_in_fat; + if (offset_in_fat + io_size > max_offset_in_fat) + io_size = ((size_t)(max_offset_in_fat - offset_in_fat)); + + if (io_size != 0) { + err = ioget(fd, fs->lsnfat + bytsec(offset_in_fat), + fs->fatbuf, io_size); + if (err != 0) { + fs->fatbuf_blknum = ((uint_t)(-1)); + return (err); + } } - } - if (io_size < FATBLKSZ) - memset(fs->fatbuf + io_size, 0, FATBLKSZ - io_size); + if (io_size < FATBLKSZ) + memset(fs->fatbuf + io_size, 0, FATBLKSZ - io_size); - fs->fatbuf_blknum = blknum; - return (0); + fs->fatbuf_blknum = blknum; + return (0); } /* @@ -181,38 +181,38 @@ dos_read_fatblk(DOS_FS *fs, struct open_file *fd, u_int blknum) static int dos_mount(DOS_FS *fs, struct open_file *fd) { - int err; - u_char *buf; + int err; + uchar_t *buf; + + bzero(fs, sizeof (DOS_FS)); + fs->fd = fd; + + if ((buf = malloc(secbyt(1))) == NULL) + return (errno); + if ((err = ioget(fs->fd, 0, buf, secbyt(1))) || + (err = parsebs(fs, (DOS_BS *)buf))) { + free(buf); + return (err); + } + free(buf); - bzero(fs, sizeof(DOS_FS)); - fs->fd = fd; + if ((fs->fatbuf = malloc(FATBLKSZ)) == NULL) + return (errno); + err = dos_read_fatblk(fs, fd, 0); + if (err != 0) { + free(fs->fatbuf); + return (err); + } - if ((buf = malloc(secbyt(1))) == NULL) - return (errno); - if ((err = ioget(fs->fd, 0, buf, secbyt(1))) || - (err = parsebs(fs, (DOS_BS *)buf))) { - free(buf); - return (err); - } - free(buf); - - if ((fs->fatbuf = malloc(FATBLKSZ)) == NULL) - return (errno); - err = dos_read_fatblk(fs, fd, 0); - if (err != 0) { - free(fs->fatbuf); - return (err); - } - - fs->root = dot[0]; - fs->root.name[0] = ' '; - if (fs->fatsz == 32) { - fs->root.clus[0] = fs->rdcl & 0xff; - fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; - fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; - fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; - } - return (0); + fs->root = dot[0]; + fs->root.name[0] = ' '; + if (fs->fatsz == 32) { + fs->root.clus[0] = fs->rdcl & 0xff; + fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; + fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; + fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; + } + return (0); } /* @@ -221,11 +221,11 @@ dos_mount(DOS_FS *fs, struct open_file *fd) static int dos_unmount(DOS_FS *fs) { - if (fs->links) - return (EBUSY); - free(fs->fatbuf); - free(fs); - return (0); + if (fs->links) + return (EBUSY); + free(fs->fatbuf); + free(fs); + return (0); } /* @@ -234,45 +234,45 @@ dos_unmount(DOS_FS *fs) static int dos_open(const char *path, struct open_file *fd) { - DOS_DE *de; - DOS_FILE *f; - DOS_FS *fs; - u_int size, clus; - int err; - - /* Allocate mount structure, associate with open */ - if ((fs = malloc(sizeof(DOS_FS))) == NULL) - return (errno); - if ((err = dos_mount(fs, fd))) { - free(fs); - return (err); - } + DOS_DE *de; + DOS_FILE *f; + DOS_FS *fs; + uint_t size, clus; + int err; + + /* Allocate mount structure, associate with open */ + if ((fs = malloc(sizeof (DOS_FS))) == NULL) + return (errno); + if ((err = dos_mount(fs, fd))) { + free(fs); + return (err); + } - if ((err = namede(fs, path, &de))) { - dos_unmount(fs); - return (err); - } + if ((err = namede(fs, path, &de))) { + dos_unmount(fs); + return (err); + } - clus = stclus(fs->fatsz, de); - size = cv4(de->size); + clus = stclus(fs->fatsz, de); + size = cv4(de->size); - if ((!(de->attr & FA_DIR) && (!clus != !size)) || - ((de->attr & FA_DIR) && size) || - (clus && !okclus(fs, clus))) { - dos_unmount(fs); - return (EINVAL); - } - if ((f = malloc(sizeof(DOS_FILE))) == NULL) { - err = errno; - dos_unmount(fs); - return (err); - } - bzero(f, sizeof(DOS_FILE)); - f->fs = fs; - fs->links++; - f->de = *de; - fd->f_fsdata = (void *)f; - return (0); + if ((!(de->attr & FA_DIR) && (!clus != !size)) || + ((de->attr & FA_DIR) && size) || + (clus && !okclus(fs, clus))) { + dos_unmount(fs); + return (EINVAL); + } + if ((f = malloc(sizeof (DOS_FILE))) == NULL) { + err = errno; + dos_unmount(fs); + return (err); + } + bzero(f, sizeof (DOS_FILE)); + f->fs = fs; + fs->links++; + f->de = *de; + fd->f_fsdata = f; + return (0); } /* @@ -281,57 +281,58 @@ dos_open(const char *path, struct open_file *fd) static int dos_read(struct open_file *fd, void *buf, size_t nbyte, size_t *resid) { - off_t size; - u_int nb, off, clus, c, cnt, n; - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - int err = 0; - - /* - * as ioget() can be called *a lot*, use twiddle here. - * also 4 seems to be good value not to slow loading down too much: - * with 270MB file (~540k ioget() calls, twiddle can easily waste 4-5sec. - */ - twiddle(4); - nb = (u_int)nbyte; - if ((size = fsize(f->fs, &f->de)) == -1) - return (EINVAL); - if (nb > (n = size - f->offset)) - nb = n; - off = f->offset; - if ((clus = stclus(f->fs->fatsz, &f->de))) - off &= f->fs->bsize - 1; - c = f->c; - cnt = nb; - while (cnt) { - n = 0; - if (!c) { - if ((c = clus)) - n = bytblk(f->fs, f->offset); - } else if (!off) - n++; - while (n--) { - if ((err = fatget(f->fs, &c))) - goto out; - if (!okclus(f->fs, c)) { - err = EINVAL; - goto out; - } + off_t size; + uint_t nb, off, clus, c, cnt, n; + DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; + int err = 0; + + /* + * as ioget() can be called *a lot*, use twiddle here. + * also 4 seems to be good value not to slow loading down too much: + * with 270MB file (~540k ioget() calls, twiddle can easily waste + * 4-5 sec. + */ + twiddle(4); + nb = (uint_t)nbyte; + if ((size = fsize(f->fs, &f->de)) == -1) + return (EINVAL); + if (nb > (n = size - f->offset)) + nb = n; + off = f->offset; + if ((clus = stclus(f->fs->fatsz, &f->de))) + off &= f->fs->bsize - 1; + c = f->c; + cnt = nb; + while (cnt) { + n = 0; + if (!c) { + if ((c = clus)) + n = bytblk(f->fs, f->offset); + } else if (!off) + n++; + while (n--) { + if ((err = fatget(f->fs, &c))) + goto out; + if (!okclus(f->fs, c)) { + err = EINVAL; + goto out; + } + } + if (!clus || (n = f->fs->bsize - off) > cnt) + n = cnt; + if ((err = ioread(f->fs, (c ? blkoff(f->fs, c) : + secbyt(f->fs->lsndir)) + off, buf, n))) + goto out; + f->offset += n; + f->c = c; + off = 0; + buf = (char *)buf + n; + cnt -= n; } - if (!clus || (n = f->fs->bsize - off) > cnt) - n = cnt; - if ((err = ioread(f->fs, (c ? blkoff(f->fs, c) : - secbyt(f->fs->lsndir)) + off, buf, n))) - goto out; - f->offset += n; - f->c = c; - off = 0; - buf = (char *)buf + n; - cnt -= n; - } - out: - if (resid) - *resid = nbyte - nb + cnt; - return (err); +out: + if (resid) + *resid = nbyte - nb + cnt; + return (err); } /* @@ -340,33 +341,33 @@ dos_read(struct open_file *fd, void *buf, size_t nbyte, size_t *resid) static off_t dos_seek(struct open_file *fd, off_t offset, int whence) { - off_t off; - u_int size; - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - - size = cv4(f->de.size); - switch (whence) { - case SEEK_SET: - off = 0; - break; - case SEEK_CUR: - off = f->offset; - break; - case SEEK_END: - off = size; - break; - default: - errno = EINVAL; - return (-1); - } - off += offset; - if (off < 0 || off > size) { - errno = EINVAL; - return (-1); - } - f->offset = (u_int)off; - f->c = 0; - return (off); + off_t off; + uint_t size; + DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; + + size = cv4(f->de.size); + switch (whence) { + case SEEK_SET: + off = 0; + break; + case SEEK_CUR: + off = f->offset; + break; + case SEEK_END: + off = size; + break; + default: + errno = EINVAL; + return (-1); + } + off += offset; + if (off < 0 || off > size) { + errno = EINVAL; + return (-1); + } + f->offset = (uint_t)off; + f->c = 0; + return (off); } /* @@ -375,13 +376,13 @@ dos_seek(struct open_file *fd, off_t offset, int whence) static int dos_close(struct open_file *fd) { - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - DOS_FS *fs = f->fs; + DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; + DOS_FS *fs = f->fs; - f->fs->links--; - free(f); - dos_unmount(fs); - return (0); + f->fs->links--; + free(f); + dos_unmount(fs); + return (0); } /* @@ -390,105 +391,105 @@ dos_close(struct open_file *fd) static int dos_stat(struct open_file *fd, struct stat *sb) { - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - - /* only important stuff */ - sb->st_mode = f->de.attr & FA_DIR ? S_IFDIR | 0555 : S_IFREG | 0444; - sb->st_nlink = 1; - sb->st_uid = 0; - sb->st_gid = 0; - if ((sb->st_size = fsize(f->fs, &f->de)) == -1) - return (EINVAL); - return (0); + DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; + + /* only important stuff */ + sb->st_mode = f->de.attr & FA_DIR ? S_IFDIR | 0555 : S_IFREG | 0444; + sb->st_nlink = 1; + sb->st_uid = 0; + sb->st_gid = 0; + if ((sb->st_size = fsize(f->fs, &f->de)) == -1) + return (EINVAL); + return (0); } static int dos_checksum(unsigned char *name, unsigned char *ext) { - int x, i; - char buf[11]; - - bcopy(name, buf, 8); - bcopy(ext, buf+8, 3); - x = 0; - for (i = 0; i < 11; i++) { - x = ((x & 1) << 7) | (x >> 1); - x += buf[i]; - x &= 0xff; - } - return (x); + int x, i; + char buf[11]; + + bcopy(name, buf, 8); + bcopy(ext, buf+8, 3); + x = 0; + for (i = 0; i < 11; i++) { + x = ((x & 1) << 7) | (x >> 1); + x += buf[i]; + x &= 0xff; + } + return (x); } static int dos_readdir(struct open_file *fd, struct dirent *d) { - /* DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; */ - u_char fn[261]; - DOS_DIR dd; - size_t res; - u_int chk, x, xdn; - int err; - - x = chk = 0; - while (1) { - xdn = x; - x = 0; - err = dos_read(fd, &dd, sizeof(dd), &res); - if (err) - return (err); - if (res == sizeof(dd)) - return (ENOENT); - if (dd.de.name[0] == 0) - return (ENOENT); - - /* Skip deleted entries */ - if (dd.de.name[0] == 0xe5) - continue; - - /* Check if directory entry is volume label */ - if (dd.de.attr & FA_LABEL) { - /* - * If volume label set, check if the current entry is - * extended entry (FA_XDE) for long file names. - */ - if ((dd.de.attr & FA_MASK) == FA_XDE) { - /* - * Read through all following extended entries - * to get the long file name. 0x40 marks the - * last entry containing part of long file name. - */ - if (dd.xde.seq & 0x40) - chk = dd.xde.chk; - else if (dd.xde.seq != xdn - 1 || dd.xde.chk != chk) - continue; - x = dd.xde.seq & ~0x40; - if (x < 1 || x > 20) { - x = 0; - continue; + uchar_t fn[261]; + DOS_DIR dd; + size_t res; + uint_t chk, x, xdn; + int err; + + x = chk = 0; + while (1) { + xdn = x; + x = 0; + err = dos_read(fd, &dd, sizeof (dd), &res); + if (err) + return (err); + if (res == sizeof (dd)) + return (ENOENT); + if (dd.de.name[0] == 0) + return (ENOENT); + + /* Skip deleted entries */ + if (dd.de.name[0] == 0xe5) + continue; + + /* Check if directory entry is volume label */ + if (dd.de.attr & FA_LABEL) { + /* + * If volume label set, check if the current entry is + * extended entry (FA_XDE) for long file names. + */ + if ((dd.de.attr & FA_MASK) == FA_XDE) { + /* + * Read through all following extended entries + * to get the long file name. 0x40 marks the + * last entry containing part of long file name. + */ + if (dd.xde.seq & 0x40) + chk = dd.xde.chk; + else if (dd.xde.seq != xdn - 1 || + dd.xde.chk != chk) + continue; + x = dd.xde.seq & ~0x40; + if (x < 1 || x > 20) { + x = 0; + continue; + } + cp_xdnm(fn, &dd.xde); + } else { + /* skip only volume label entries */ + continue; + } + } else { + if (xdn == 1) { + x = dos_checksum(dd.de.name, dd.de.ext); + if (x == chk) + break; + } else { + cp_sfn(fn, &dd.de); + break; + } + x = 0; } - cp_xdnm(fn, &dd.xde); - } else { - /* skip only volume label entries */ - continue; - } - } else { - if (xdn == 1) { - x = dos_checksum(dd.de.name, dd.de.ext); - if (x == chk) - break; - } else { - cp_sfn(fn, &dd.de); - break; - } - x = 0; } - } - d->d_fileno = (dd.de.clus[1] << 8) + dd.de.clus[0]; - d->d_reclen = sizeof(*d); - d->d_type = (dd.de.attr & FA_DIR) ? DT_DIR : DT_REG; - memcpy(d->d_name, fn, sizeof(d->d_name)); - return (0); + d->d_fileno = (dd.de.clus[1] << 8) + dd.de.clus[0]; + d->d_reclen = sizeof (*d); + d->d_type = (dd.de.attr & FA_DIR) ? DT_DIR : DT_REG; + memcpy(d->d_name, fn, sizeof (d->d_name)); + return (0); } /* @@ -497,47 +498,47 @@ dos_readdir(struct open_file *fd, struct dirent *d) static int parsebs(DOS_FS *fs, DOS_BS *bs) { - u_int sc; - - if ((bs->jmp[0] != 0x69 && - bs->jmp[0] != 0xe9 && - (bs->jmp[0] != 0xeb || bs->jmp[2] != 0x90)) || - bs->bpb.media < 0xf0) - return (EINVAL); - if (cv2(bs->bpb.secsiz) != SECSIZ) - return (EINVAL); - if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) - return (EINVAL); - fs->bsize = secbyt(fs->spc); - fs->bshift = ffs(fs->bsize) - 1; - if ((fs->spf = cv2(bs->bpb.spf))) { - if (bs->bpb.fats != 2) - return (EINVAL); - if (!(fs->dirents = cv2(bs->bpb.dirents))) - return (EINVAL); - } else { - if (!(fs->spf = cv4(bs->bpb.lspf))) - return (EINVAL); - if (!bs->bpb.fats || bs->bpb.fats > 16) - return (EINVAL); - if ((fs->rdcl = cv4(bs->bpb.rdcl)) < LOCLUS) - return (EINVAL); - } - if (!(fs->lsnfat = cv2(bs->bpb.ressec))) - return (EINVAL); - fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; - fs->lsndta = fs->lsndir + entsec(fs->dirents); - if (!(sc = cv2(bs->bpb.secs)) && !(sc = cv4(bs->bpb.lsecs))) - return (EINVAL); - if (fs->lsndta > sc) - return (EINVAL); - if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) - return (EINVAL); - fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; - sc = (secbyt(fs->spf) << 1) / (fs->fatsz >> 2) - 1; - if (fs->xclus > sc) - fs->xclus = sc; - return (0); + uint_t sc; + + if ((bs->jmp[0] != 0x69 && + bs->jmp[0] != 0xe9 && + (bs->jmp[0] != 0xeb || bs->jmp[2] != 0x90)) || + bs->bpb.media < 0xf0) + return (EINVAL); + if (cv2(bs->bpb.secsiz) != SECSIZ) + return (EINVAL); + if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) + return (EINVAL); + fs->bsize = secbyt(fs->spc); + fs->bshift = ffs(fs->bsize) - 1; + if ((fs->spf = cv2(bs->bpb.spf))) { + if (bs->bpb.fats != 2) + return (EINVAL); + if (!(fs->dirents = cv2(bs->bpb.dirents))) + return (EINVAL); + } else { + if (!(fs->spf = cv4(bs->bpb.lspf))) + return (EINVAL); + if (!bs->bpb.fats || bs->bpb.fats > 16) + return (EINVAL); + if ((fs->rdcl = cv4(bs->bpb.rdcl)) < LOCLUS) + return (EINVAL); + } + if (!(fs->lsnfat = cv2(bs->bpb.ressec))) + return (EINVAL); + fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; + fs->lsndta = fs->lsndir + entsec(fs->dirents); + if (!(sc = cv2(bs->bpb.secs)) && !(sc = cv4(bs->bpb.lsecs))) + return (EINVAL); + if (fs->lsndta > sc) + return (EINVAL); + if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) + return (EINVAL); + fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; + sc = (secbyt(fs->spf) << 1) / (fs->fatsz >> 2) - 1; + if (fs->xclus > sc) + fs->xclus = sc; + return (0); } /* @@ -546,169 +547,180 @@ parsebs(DOS_FS *fs, DOS_BS *bs) static int namede(DOS_FS *fs, const char *path, DOS_DE **dep) { - char name[256]; - DOS_DE *de; - char *s; - size_t n; - int err; - - err = 0; - de = &fs->root; - while (*path) { - while (*path == '/') - path++; - if (*path == '\0') - break; - if (!(s = strchr(path, '/'))) - s = strchr(path, 0); - if ((n = s - path) > 255) - return (ENAMETOOLONG); - memcpy(name, path, n); - name[n] = 0; - path = s; - if (!(de->attr & FA_DIR)) - return (ENOTDIR); - if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) - return (err); - } - *dep = de; - return (0); + char name[256]; + DOS_DE *de; + char *s; + size_t n; + int err; + + err = 0; + de = &fs->root; + while (*path) { + while (*path == '/') + path++; + if (*path == '\0') + break; + if (!(s = strchr(path, '/'))) + s = strchr(path, 0); + if ((n = s - path) > 255) + return (ENAMETOOLONG); + memcpy(name, path, n); + name[n] = 0; + path = s; + if (!(de->attr & FA_DIR)) + return (ENOTDIR); + if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) + return (err); + } + *dep = de; + return (0); } /* * Lookup path segment */ static int -lookup(DOS_FS *fs, u_int clus, const char *name, DOS_DE **dep) +lookup(DOS_FS *fs, uint_t clus, const char *name, DOS_DE **dep) { - static DOS_DIR dir[DEPSEC]; - u_char lfn[261]; - u_char sfn[13]; - u_int nsec, lsec, xdn, chk, sec, ent, x; - int err, ok; - - if (!clus) - for (ent = 0; ent < 2; ent++) - if (!strcasecmp(name, dotstr[ent])) { - *dep = dot + ent; - return (0); - } - if (!clus && fs->fatsz == 32) - clus = fs->rdcl; - nsec = !clus ? entsec(fs->dirents) : fs->spc; - lsec = 0; - xdn = chk = 0; - for (;;) { - if (!clus && !lsec) - lsec = fs->lsndir; - else if (okclus(fs, clus)) - lsec = blklsn(fs, clus); - else - return (EINVAL); - for (sec = 0; sec < nsec; sec++) { - if ((err = ioget(fs->fd, lsec + sec, dir, secbyt(1)))) - return (err); - for (ent = 0; ent < DEPSEC; ent++) { - if (!*dir[ent].de.name) - return (ENOENT); - if (*dir[ent].de.name != 0xe5) { - if ((dir[ent].de.attr & FA_MASK) == FA_XDE) { - x = dir[ent].xde.seq; - if (x & 0x40 || (x + 1 == xdn && - dir[ent].xde.chk == chk)) { - if (x & 0x40) { - chk = dir[ent].xde.chk; - x &= ~0x40; - } - if (x >= 1 && x <= 20) { - cp_xdnm(lfn, &dir[ent].xde); - xdn = x; - continue; - } - } - } else if (!(dir[ent].de.attr & FA_LABEL)) { - if ((ok = xdn == 1)) { - x = dos_checksum(dir[ent].de.name, dir[ent].de.ext); - ok = chk == x && - !strcasecmp(name, (const char *)lfn); - } - if (!ok) { - cp_sfn(sfn, &dir[ent].de); - ok = !strcasecmp(name, (const char *)sfn); - } - if (ok) { - *dep = &dir[ent].de; - return (0); - } - } + static DOS_DIR dir[DEPSEC]; + uchar_t lfn[261]; + uchar_t sfn[13]; + uint_t nsec, lsec, xdn, chk, sec, ent, x; + int err, ok; + + if (!clus) + for (ent = 0; ent < 2; ent++) + if (!strcasecmp(name, dotstr[ent])) { + *dep = dot + ent; + return (0); + } + if (!clus && fs->fatsz == 32) + clus = fs->rdcl; + nsec = !clus ? entsec(fs->dirents) : fs->spc; + lsec = 0; + xdn = chk = 0; + for (;;) { + if (!clus && !lsec) + lsec = fs->lsndir; + else if (okclus(fs, clus)) + lsec = blklsn(fs, clus); + else + return (EINVAL); + + for (sec = 0; sec < nsec; sec++) { + if ((err = ioget(fs->fd, lsec + sec, dir, secbyt(1)))) + return (err); + for (ent = 0; ent < DEPSEC; ent++) { + if (dir[ent].de.name[0] == 0) + return (ENOENT); + if (dir[ent].de.name[0] == 0xe5) { + xdn = 0; + continue; + } + if ((dir[ent].de.attr & FA_MASK) == FA_XDE) { + x = dir[ent].xde.seq; + if (x & 0x40 || + (x + 1 == xdn && + dir[ent].xde.chk == chk)) { + if (x & 0x40) { + chk = dir[ent].xde.chk; + x &= ~0x40; + } + if (x >= 1 && x <= 20) { + cp_xdnm(lfn, + &dir[ent].xde); + xdn = x; + continue; + } + } + } else if (!(dir[ent].de.attr & FA_LABEL)) { + if ((ok = xdn == 1)) { + x = dos_checksum( + dir[ent].de.name, + dir[ent].de.ext); + ok = chk == x && + !strcasecmp(name, + (const char *)lfn); + } + if (!ok) { + cp_sfn(sfn, &dir[ent].de); + ok = !strcasecmp(name, + (const char *)sfn); + } + if (ok) { + *dep = &dir[ent].de; + return (0); + } + } + xdn = 0; + } } - xdn = 0; - } - } - if (!clus) - break; - if ((err = fatget(fs, &clus))) - return (err); - if (fatend(fs->fatsz, clus)) - break; - } - return (ENOENT); + if (!clus) + break; + if ((err = fatget(fs, &clus))) + return (err); + if (fatend(fs->fatsz, clus)) + break; + } + return (ENOENT); } /* * Copy name from extended directory entry */ static void -cp_xdnm(u_char *lfn, DOS_XDE *xde) +cp_xdnm(uchar_t *lfn, DOS_XDE *xde) { - static struct { - u_int off; - u_int dim; - } ix[3] = { - {offsetof(DOS_XDE, name1), sizeof(xde->name1) / 2}, - {offsetof(DOS_XDE, name2), sizeof(xde->name2) / 2}, - {offsetof(DOS_XDE, name3), sizeof(xde->name3) / 2} - }; - u_char *p; - u_int n, x, c; - - lfn += 13 * ((xde->seq & ~0x40) - 1); - for (n = 0; n < 3; n++) - for (p = (u_char *)xde + ix[n].off, x = ix[n].dim; x; - p += 2, x--) { - if ((c = cv2(p)) && (c < 32 || c > 127)) - c = '?'; - if (!(*lfn++ = c)) - return; - } - if (xde->seq & 0x40) - *lfn = 0; + static struct { + uint_t off; + uint_t dim; + } ix[3] = { + { offsetof(DOS_XDE, name1), sizeof (xde->name1) / 2}, + { offsetof(DOS_XDE, name2), sizeof (xde->name2) / 2}, + { offsetof(DOS_XDE, name3), sizeof (xde->name3) / 2} + }; + uchar_t *p; + uint_t n, x, c; + + lfn += 13 * ((xde->seq & ~0x40) - 1); + for (n = 0; n < 3; n++) + for (p = (uchar_t *)xde + ix[n].off, x = ix[n].dim; x; + p += 2, x--) { + if ((c = cv2(p)) && (c < 32 || c > 127)) + c = '?'; + if (!(*lfn++ = c)) + return; + } + if (xde->seq & 0x40) + *lfn = 0; } /* * Copy short filename */ static void -cp_sfn(u_char *sfn, DOS_DE *de) +cp_sfn(uchar_t *sfn, DOS_DE *de) { - u_char *p; - int j, i; - - p = sfn; - if (*de->name != ' ') { - for (j = 7; de->name[j] == ' '; j--); - for (i = 0; i <= j; i++) - *p++ = de->name[i]; - if (*de->ext != ' ') { - *p++ = '.'; - for (j = 2; de->ext[j] == ' '; j--); - for (i = 0; i <= j; i++) - *p++ = de->ext[i]; - } - } - *p = 0; - if (*sfn == 5) - *sfn = 0xe5; + uchar_t *p; + int j, i; + + p = sfn; + if (*de->name != ' ') { + for (j = 7; de->name[j] == ' '; j--) + ; + for (i = 0; i <= j; i++) + *p++ = de->name[i]; + if (*de->ext != ' ') { + *p++ = '.'; + for (j = 2; de->ext[j] == ' '; j--) + ; + for (i = 0; i <= j; i++) + *p++ = de->ext[i]; + } + } + *p = '\0'; + if (*sfn == 5) + *sfn = 0xe5; } /* @@ -717,34 +729,34 @@ cp_sfn(u_char *sfn, DOS_DE *de) static off_t fsize(DOS_FS *fs, DOS_DE *de) { - u_long size; - u_int c; - int n; - - if (!(size = cv4(de->size)) && de->attr & FA_DIR) { - if (!(c = cv2(de->clus))) - size = fs->dirents * sizeof(DOS_DE); - else { - if ((n = fatcnt(fs, c)) == -1) - return (n); - size = blkbyt(fs, n); - } - } - return (size); + ulong_t size; + uint_t c; + int n; + + if (!(size = cv4(de->size)) && de->attr & FA_DIR) { + if (!(c = cv2(de->clus))) + size = fs->dirents * sizeof (DOS_DE); + else { + if ((n = fatcnt(fs, c)) == -1) + return (n); + size = blkbyt(fs, n); + } + } + return (size); } /* * Count number of clusters in chain */ static int -fatcnt(DOS_FS *fs, u_int c) +fatcnt(DOS_FS *fs, uint_t c) { - int n; + int n; - for (n = 0; okclus(fs, c); n++) - if (fatget(fs, &c)) - return (-1); - return (fatend(fs->fatsz, c) ? n : -1); + for (n = 0; okclus(fs, c); n++) + if (fatget(fs, &c)) + return (-1); + return (fatend(fs->fatsz, c) ? n : -1); } /* @@ -752,101 +764,105 @@ fatcnt(DOS_FS *fs, u_int c) * the number of current 128K block in FAT has changed. */ static int -fatget(DOS_FS *fs, u_int *c) +fatget(DOS_FS *fs, uint_t *c) { - u_int val_in, val_out, offset, blknum, nbyte; - const u_char *p_entry; - int err; - - /* check input value to prevent overflow in fatoff() */ - val_in = *c; - if (val_in & 0xf0000000) - return (EINVAL); - - /* ensure that current 128K FAT block is cached */ - offset = fatoff(fs->fatsz, val_in); - nbyte = fs->fatsz != 32 ? 2 : 4; - if (offset + nbyte > secbyt(fs->spf)) - return (EINVAL); - blknum = offset / FATBLKSZ; - offset %= FATBLKSZ; - if (offset + nbyte > FATBLKSZ) - return (EINVAL); - if (blknum != fs->fatbuf_blknum) { - err = dos_read_fatblk(fs, fs->fd, blknum); - if (err != 0) - return (err); - } - p_entry = fs->fatbuf + offset; - - /* extract cluster number from FAT entry */ - switch (fs->fatsz) { - case 32: - val_out = cv4(p_entry); - val_out &= 0x0fffffff; - break; - case 16: - val_out = cv2(p_entry); - break; - case 12: - val_out = cv2(p_entry); - if (val_in & 1) - val_out >>= 4; - else - val_out &= 0xfff; - break; - default: - return (EINVAL); - } - *c = val_out; - return (0); + uint_t val_in, val_out, offset, blknum, nbyte; + const uchar_t *p_entry; + int err; + + /* check input value to prevent overflow in fatoff() */ + val_in = *c; + if (val_in & 0xf0000000) + return (EINVAL); + + /* ensure that current 128K FAT block is cached */ + offset = fatoff(fs->fatsz, val_in); + nbyte = fs->fatsz != 32 ? 2 : 4; + if (offset + nbyte > secbyt(fs->spf)) + return (EINVAL); + blknum = offset / FATBLKSZ; + offset %= FATBLKSZ; + if (offset + nbyte > FATBLKSZ) + return (EINVAL); + if (blknum != fs->fatbuf_blknum) { + err = dos_read_fatblk(fs, fs->fd, blknum); + if (err != 0) + return (err); + } + p_entry = fs->fatbuf + offset; + + /* extract cluster number from FAT entry */ + switch (fs->fatsz) { + case 32: + val_out = cv4(p_entry); + val_out &= 0x0fffffff; + break; + case 16: + val_out = cv2(p_entry); + break; + case 12: + val_out = cv2(p_entry); + if (val_in & 1) + val_out >>= 4; + else + val_out &= 0xfff; + break; + default: + return (EINVAL); + } + *c = val_out; + return (0); } /* * Is cluster an end-of-chain marker? */ static int -fatend(u_int sz, u_int c) +fatend(uint_t sz, uint_t c) { - return (c > (sz == 12 ? 0xff7U : sz == 16 ? 0xfff7U : 0xffffff7)); + return (c > (sz == 12 ? 0xff7U : sz == 16 ? 0xfff7U : 0xffffff7)); } /* * Offset-based I/O primitive */ static int -ioread(DOS_FS *fs, u_int offset, void *buf, size_t nbyte) +ioread(DOS_FS *fs, uint_t offset, void *buf, size_t nbyte) { - char *s; - u_int off, n; - int err; - u_char local_buf[SECSIZ]; - - s = buf; - if ((off = offset & (SECSIZ - 1))) { - offset -= off; - if ((n = SECSIZ - off) > nbyte) - n = nbyte; - if ((err = ioget(fs->fd, bytsec(offset), local_buf, sizeof(local_buf)))) - return (err); - memcpy(s, local_buf + off, n); - offset += SECSIZ; - s += n; - nbyte -= n; - } - n = nbyte & (SECSIZ - 1); - if (nbyte -= n) { - if ((err = ioget(fs->fd, bytsec(offset), s, nbyte))) - return (err); - offset += nbyte; - s += nbyte; - } - if (n) { - if ((err = ioget(fs->fd, bytsec(offset), local_buf, sizeof(local_buf)))) - return (err); - memcpy(s, local_buf, n); - } - return (0); + char *s; + uint_t off, n; + int err; + uchar_t local_buf[SECSIZ]; + + s = buf; + if ((off = offset & (SECSIZ - 1))) { + offset -= off; + if ((n = SECSIZ - off) > nbyte) + n = nbyte; + err = ioget(fs->fd, bytsec(offset), local_buf, + sizeof (local_buf)); + if (err != 0) + return (err); + memcpy(s, local_buf + off, n); + offset += SECSIZ; + s += n; + nbyte -= n; + } + n = nbyte & (SECSIZ - 1); + if (nbyte -= n) { + if ((err = ioget(fs->fd, bytsec(offset), s, nbyte))) + return (err); + offset += nbyte; + s += nbyte; + } + if (n != 0) { + err = ioget(fs->fd, bytsec(offset), local_buf, + sizeof (local_buf)); + if (err != 0) + return (err); + memcpy(s, local_buf, n); + } + return (0); } /* @@ -855,14 +871,14 @@ ioread(DOS_FS *fs, u_int offset, void *buf, size_t nbyte) static int ioget(struct open_file *fd, daddr_t lsec, void *buf, size_t size) { - size_t rsize; - int rv; - - /* Make sure we get full read or error. */ - rsize = 0; - rv = (fd->f_dev->dv_strategy)(fd->f_devdata, F_READ, lsec, - size, buf, &rsize); - if ((rv == 0) && (size != rsize)) - rv = EIO; - return (rv); + size_t rsize; + int rv; + + /* Make sure we get full read or error. */ + rsize = 0; + rv = (fd->f_dev->dv_strategy)(fd->f_devdata, F_READ, lsec, + size, buf, &rsize); + if ((rv == 0) && (size != rsize)) + rv = EIO; + return (rv); } diff --git a/usr/src/boot/lib/libstand/gzipfs.c b/usr/src/boot/lib/libstand/gzipfs.c index a658f90755..c6c7b206e6 100644 --- a/usr/src/boot/lib/libstand/gzipfs.c +++ b/usr/src/boot/lib/libstand/gzipfs.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 1998 Michael Smith. * All rights reserved. * @@ -32,57 +32,58 @@ #include <string.h> #include <zlib.h> -#define Z_BUFSIZE 2048 /* XXX larger? */ +#define Z_BUFSIZE 2048 /* XXX larger? */ struct z_file { - int zf_rawfd; - off_t zf_dataoffset; - z_stream zf_zstream; - unsigned char zf_buf[Z_BUFSIZE]; - int zf_endseen; + int zf_rawfd; + off_t zf_dataoffset; + z_stream zf_zstream; + unsigned char zf_buf[Z_BUFSIZE]; + int zf_endseen; }; -static int zf_fill(struct z_file *z); -static int zf_open(const char *path, struct open_file *f); -static int zf_close(struct open_file *f); -static int zf_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t zf_seek(struct open_file *f, off_t offset, int where); -static int zf_stat(struct open_file *f, struct stat *sb); +static int zf_fill(struct z_file *z); +static int zf_open(const char *path, struct open_file *f); +static int zf_close(struct open_file *f); +static int zf_read(struct open_file *f, void *buf, size_t size, size_t *resid); +static off_t zf_seek(struct open_file *f, off_t offset, int where); +static int zf_stat(struct open_file *f, struct stat *sb); struct fs_ops gzipfs_fsops = { - "zip", - zf_open, - zf_close, - zf_read, - null_write, - zf_seek, - zf_stat, - null_readdir + .fs_name = "zip", + .fo_open = zf_open, + .fo_close = zf_close, + .fo_read = zf_read, + .fo_write = null_write, + .fo_seek = zf_seek, + .fo_stat = zf_stat, + .fo_readdir = null_readdir }; static int zf_fill(struct z_file *zf) { - int result; - int req; - - req = Z_BUFSIZE - zf->zf_zstream.avail_in; - result = 0; - - /* If we need more */ - if (req > 0) { - /* move old data to bottom of buffer */ - if (req < Z_BUFSIZE) - bcopy(zf->zf_buf + req, zf->zf_buf, Z_BUFSIZE - req); - - /* read to fill buffer and update availibility data */ - result = read(zf->zf_rawfd, zf->zf_buf + zf->zf_zstream.avail_in, req); - zf->zf_zstream.next_in = zf->zf_buf; - if (result >= 0) - zf->zf_zstream.avail_in += result; - } - return(result); + int result; + int req; + + req = Z_BUFSIZE - zf->zf_zstream.avail_in; + result = 0; + + /* If we need more */ + if (req > 0) { + /* move old data to bottom of buffer */ + if (req < Z_BUFSIZE) + bcopy(zf->zf_buf + req, zf->zf_buf, Z_BUFSIZE - req); + + /* read to fill buffer and update availibility data */ + result = read(zf->zf_rawfd, + zf->zf_buf + zf->zf_zstream.avail_in, req); + zf->zf_zstream.next_in = zf->zf_buf; + if (result >= 0) + zf->zf_zstream.avail_in += result; + } + return (result); } /* @@ -93,257 +94,264 @@ zf_fill(struct z_file *zf) static int get_byte(struct z_file *zf, off_t *curoffp) { - if ((zf->zf_zstream.avail_in == 0) && (zf_fill(zf) == -1)) - return(-1); - zf->zf_zstream.avail_in--; - ++*curoffp; - return(*(zf->zf_zstream.next_in)++); + if ((zf->zf_zstream.avail_in == 0) && (zf_fill(zf) == -1)) + return (-1); + zf->zf_zstream.avail_in--; + ++*curoffp; + return (*(zf->zf_zstream.next_in)++); } static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ static int check_header(struct z_file *zf) { - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - zf->zf_dataoffset = 0; - /* Check the gzip magic header */ - for (len = 0; len < 2; len++) { - c = get_byte(zf, &zf->zf_dataoffset); - if (c != gz_magic[len]) { - return(1); + int method; /* method byte */ + int flags; /* flags byte */ + uInt len; + int c; + + zf->zf_dataoffset = 0; + /* Check the gzip magic header */ + for (len = 0; len < 2; len++) { + c = get_byte(zf, &zf->zf_dataoffset); + if (c != gz_magic[len]) { + return (1); + } + } + method = get_byte(zf, &zf->zf_dataoffset); + flags = get_byte(zf, &zf->zf_dataoffset); + if (method != Z_DEFLATED || (flags & RESERVED) != 0) { + return (1); + } + + /* Discard time, xflags and OS code: */ + for (len = 0; len < 6; len++) + (void) get_byte(zf, &zf->zf_dataoffset); + + if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ + len = (uInt)get_byte(zf, &zf->zf_dataoffset); + len += ((uInt)get_byte(zf, &zf->zf_dataoffset))<<8; + /* len is garbage if EOF but the loop below will quit anyway */ + while (len-- != 0 && get_byte(zf, &zf->zf_dataoffset) != -1) + ; + } + if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ + while ((c = get_byte(zf, &zf->zf_dataoffset)) != 0 && c != -1) + ; + } + if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ + while ((c = get_byte(zf, &zf->zf_dataoffset)) != 0 && c != -1) + ; } - } - method = get_byte(zf, &zf->zf_dataoffset); - flags = get_byte(zf, &zf->zf_dataoffset); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - return(1); - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(zf, &zf->zf_dataoffset); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(zf, &zf->zf_dataoffset); - len += ((uInt)get_byte(zf, &zf->zf_dataoffset))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(zf, &zf->zf_dataoffset) != -1) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(zf, &zf->zf_dataoffset)) != 0 && c != -1) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(zf, &zf->zf_dataoffset)) != 0 && c != -1) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) c = get_byte(zf, &zf->zf_dataoffset); - } - /* if there's data left, we're in business */ - return((c == -1) ? 1 : 0); + if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ + for (len = 0; len < 2; len++) + c = get_byte(zf, &zf->zf_dataoffset); + } + /* if there's data left, we're in business */ + return ((c == -1) ? 1 : 0); } - + static int zf_open(const char *fname, struct open_file *f) { - char *zfname; - int rawfd; - struct z_file *zf; - char *cp; - int error; - struct stat sb; - - /* Have to be in "just read it" mode */ - if (f->f_flags != F_READ) - return(EPERM); - - /* If the name already ends in .gz or .bz2, ignore it */ - if ((cp = strrchr(fname, '.')) && (!strcmp(cp, ".gz") - || !strcmp(cp, ".bz2") || !strcmp(cp, ".split"))) - return(ENOENT); - - /* Try to open the compressed datafile */ - rawfd = open(fname, O_RDONLY | F_GZIP); - if (rawfd == -1) { - /* add .gz sufix and try again */ - zfname = malloc(strlen(fname) + 4); - if (zfname == NULL) - return(ENOMEM); - sprintf(zfname, "%s.gz", fname); - rawfd = open(zfname, O_RDONLY); - free(zfname); - if (rawfd == -1) - return(ENOENT); - } - - if (fstat(rawfd, &sb) < 0) { - printf("zf_open: stat failed\n"); - close(rawfd); - return(ENOENT); - } - if (!S_ISREG(sb.st_mode)) { - close(rawfd); - return(EISDIR); /* best guess */ - } - - /* Allocate a z_file structure, populate it */ - zf = malloc(sizeof(struct z_file)); - if (zf == NULL) - return(ENOMEM); - bzero(zf, sizeof(struct z_file)); - zf->zf_rawfd = rawfd; - - /* Verify that the file is gzipped */ - if (check_header(zf)) { - close(zf->zf_rawfd); - free(zf); - return(EFTYPE); - } + char *zfname; + int rawfd; + struct z_file *zf; + char *cp; + int error; + struct stat sb; + + /* Have to be in "just read it" mode */ + if (f->f_flags != F_READ) + return (EPERM); + + /* If the name already ends in .gz or .bz2, ignore it */ + if ((cp = strrchr(fname, '.')) && (strcmp(cp, ".gz") == 0 || + strcmp(cp, ".bz2") == 0 || strcmp(cp, ".split") == 0)) + return (ENOENT); + + /* Try to open the compressed datafile */ + rawfd = open(fname, O_RDONLY | F_GZIP); + if (rawfd == -1) { + /* add .gz sufix and try again */ + zfname = malloc(strlen(fname) + 4); + if (zfname == NULL) + return (ENOMEM); + sprintf(zfname, "%s.gz", fname); + rawfd = open(zfname, O_RDONLY); + free(zfname); + if (rawfd == -1) + return (ENOENT); + } - /* Initialise the inflation engine */ - if ((error = inflateInit2(&(zf->zf_zstream), -15)) != Z_OK) { - printf("zf_open: inflateInit returned %d : %s\n", error, zf->zf_zstream.msg); - close(zf->zf_rawfd); - free(zf); - return(EIO); - } + if (fstat(rawfd, &sb) < 0) { + printf("zf_open: stat failed\n"); + close(rawfd); + return (ENOENT); + } + if (!S_ISREG(sb.st_mode)) { + close(rawfd); + return (EISDIR); /* best guess */ + } + + /* Allocate a z_file structure, populate it */ + zf = malloc(sizeof (struct z_file)); + if (zf == NULL) + return (ENOMEM); + bzero(zf, sizeof (struct z_file)); + zf->zf_rawfd = rawfd; + + /* Verify that the file is gzipped */ + if (check_header(zf)) { + close(zf->zf_rawfd); + free(zf); + return (EFTYPE); + } - /* Looks OK, we'll take it */ - f->f_fsdata = zf; - return(0); + /* Initialise the inflation engine */ + if ((error = inflateInit2(&(zf->zf_zstream), -15)) != Z_OK) { + printf("zf_open: inflateInit returned %d : %s\n", error, + zf->zf_zstream.msg); + close(zf->zf_rawfd); + free(zf); + return (EIO); + } + + /* Looks OK, we'll take it */ + f->f_fsdata = zf; + return (0); } static int zf_close(struct open_file *f) { - struct z_file *zf = (struct z_file *)f->f_fsdata; - - inflateEnd(&(zf->zf_zstream)); - close(zf->zf_rawfd); - free(zf); - return(0); + struct z_file *zf = (struct z_file *)f->f_fsdata; + + inflateEnd(&(zf->zf_zstream)); + close(zf->zf_rawfd); + free(zf); + return (0); } - -static int + +static int zf_read(struct open_file *f, void *buf, size_t size, size_t *resid) { - struct z_file *zf = (struct z_file *)f->f_fsdata; - int error; - - zf->zf_zstream.next_out = buf; /* where and how much */ - zf->zf_zstream.avail_out = size; - - while (zf->zf_zstream.avail_out && zf->zf_endseen == 0) { - if ((zf->zf_zstream.avail_in == 0) && (zf_fill(zf) == -1)) { - printf("zf_read: fill error\n"); - return(EIO); + struct z_file *zf = (struct z_file *)f->f_fsdata; + int error; + + zf->zf_zstream.next_out = buf; /* where and how much */ + zf->zf_zstream.avail_out = size; + + while (zf->zf_zstream.avail_out && zf->zf_endseen == 0) { + if ((zf->zf_zstream.avail_in == 0) && (zf_fill(zf) == -1)) { + printf("zf_read: fill error\n"); + return (EIO); + } + if (zf->zf_zstream.avail_in == 0) { /* oops, unexpected EOF */ + printf("zf_read: unexpected EOF\n"); + if (zf->zf_zstream.avail_out == size) + return (EIO); + break; + } + + /* decompression pass */ + error = inflate(&zf->zf_zstream, Z_SYNC_FLUSH); + if (error == Z_STREAM_END) { /* EOF, all done */ + zf->zf_endseen = 1; + break; + } + if (error != Z_OK) { /* argh, decompression error */ + printf("inflate: %s\n", zf->zf_zstream.msg); + return (EIO); + } } - if (zf->zf_zstream.avail_in == 0) { /* oops, unexpected EOF */ - printf("zf_read: unexpected EOF\n"); - if (zf->zf_zstream.avail_out == size) - return(EIO); - break; - } - - error = inflate(&zf->zf_zstream, Z_SYNC_FLUSH); /* decompression pass */ - if (error == Z_STREAM_END) { /* EOF, all done */ - zf->zf_endseen = 1; - break; - } - if (error != Z_OK) { /* argh, decompression error */ - printf("inflate: %s\n", zf->zf_zstream.msg); - return(EIO); - } - } - if (resid != NULL) - *resid = zf->zf_zstream.avail_out; - return(0); + if (resid != NULL) + *resid = zf->zf_zstream.avail_out; + return (0); } static int zf_rewind(struct open_file *f) { - struct z_file *zf = (struct z_file *)f->f_fsdata; + struct z_file *zf = (struct z_file *)f->f_fsdata; - if (lseek(zf->zf_rawfd, zf->zf_dataoffset, SEEK_SET) == -1) - return(-1); - zf->zf_zstream.avail_in = 0; - zf->zf_zstream.next_in = NULL; - zf->zf_endseen = 0; - (void)inflateReset(&zf->zf_zstream); + if (lseek(zf->zf_rawfd, zf->zf_dataoffset, SEEK_SET) == -1) + return (-1); + zf->zf_zstream.avail_in = 0; + zf->zf_zstream.next_in = NULL; + zf->zf_endseen = 0; + (void) inflateReset(&zf->zf_zstream); - return(0); + return (0); } static off_t zf_seek(struct open_file *f, off_t offset, int where) { - struct z_file *zf = (struct z_file *)f->f_fsdata; - off_t target; - char discard[16]; - - switch (where) { - case SEEK_SET: - target = offset; - break; - case SEEK_CUR: - target = offset + zf->zf_zstream.total_out; - break; - default: - errno = EINVAL; - return(-1); - } - - /* rewind if required */ - if (target < zf->zf_zstream.total_out && zf_rewind(f) != 0) - return(-1); - - /* skip forwards if required */ - while (target > zf->zf_zstream.total_out) { - errno = zf_read(f, discard, min(sizeof(discard), - target - zf->zf_zstream.total_out), NULL); - if (errno) - return(-1); - } - /* This is where we are (be honest if we overshot) */ - return(zf->zf_zstream.total_out); + struct z_file *zf = (struct z_file *)f->f_fsdata; + off_t target; + char discard[16]; + + switch (where) { + case SEEK_SET: + target = offset; + break; + case SEEK_CUR: + target = offset + zf->zf_zstream.total_out; + break; + default: + errno = EINVAL; + return (-1); + } + + /* rewind if required */ + if (target < zf->zf_zstream.total_out && zf_rewind(f) != 0) + return (-1); + + /* skip forwards if required */ + while (target > zf->zf_zstream.total_out) { + errno = zf_read(f, discard, min(sizeof (discard), + target - zf->zf_zstream.total_out), NULL); + if (errno != 0) + return (-1); + } + /* This is where we are (be honest if we overshot) */ + return (zf->zf_zstream.total_out); } static int zf_stat(struct open_file *f, struct stat *sb) { - struct z_file *zf = (struct z_file *)f->f_fsdata; - int result; - off_t pos1, pos2; - uint32_t size; - - /* stat as normal, but indicate that size is unknown */ - if ((result = fstat(zf->zf_rawfd, sb)) == 0) { - if (sb->st_size == -1) - return (result); - pos1 = lseek(zf->zf_rawfd, 0, SEEK_CUR); - pos2 = lseek(zf->zf_rawfd, sb->st_size - 4, SEEK_SET); - if (pos2 != -1) { - if (read(zf->zf_rawfd, &size, 4) == 4) - sb->st_size = (off_t) size; - else - sb->st_size = -1; - } else - sb->st_size = -1; - - pos1 = lseek(zf->zf_rawfd, pos1, SEEK_SET); - } - return(result); + struct z_file *zf = (struct z_file *)f->f_fsdata; + int result; + off_t pos1, pos2; + uint32_t size; + + /* stat as normal, but indicate that size is unknown */ + if ((result = fstat(zf->zf_rawfd, sb)) == 0) { + if (sb->st_size == -1) + return (result); + pos1 = lseek(zf->zf_rawfd, 0, SEEK_CUR); + pos2 = lseek(zf->zf_rawfd, sb->st_size - 4, SEEK_SET); + if (pos2 != -1) { + if (read(zf->zf_rawfd, &size, 4) == 4) + sb->st_size = (off_t)size; + else + sb->st_size = -1; + } else + sb->st_size = -1; + + pos1 = lseek(zf->zf_rawfd, pos1, SEEK_SET); + } + return (result); } diff --git a/usr/src/boot/lib/libstand/netif.c b/usr/src/boot/lib/libstand/netif.c index 51bc5aa125..8f46a29668 100644 --- a/usr/src/boot/lib/libstand/netif.c +++ b/usr/src/boot/lib/libstand/netif.c @@ -62,7 +62,7 @@ netif_init(void) { struct netif_driver *drv; int d, i; - + #ifdef NETIF_DEBUG if (netif_debug) printf("netif_init: called\n"); @@ -84,7 +84,7 @@ netif_match(struct netif *nif, void *machdep_hint) printf("%s%d: netif_match (%d)\n", drv->netif_bname, nif->nif_unit, nif->nif_sel); #endif - return drv->netif_match(nif, machdep_hint); + return (drv->netif_match(nif, machdep_hint)); } struct netif * @@ -141,7 +141,7 @@ netif_select(void *machdep_hint) } if (best_if.nif_driver == NULL) - return NULL; + return (NULL); best_if.nif_driver-> netif_ifs[best_if.nif_unit].dif_used |= (1 << best_if.nif_sel); @@ -149,10 +149,10 @@ netif_select(void *machdep_hint) #ifdef NETIF_DEBUG if (netif_debug) printf("netif_select: %s%d(%d) wins\n", - best_if.nif_driver->netif_bname, - best_if.nif_unit, best_if.nif_sel); + best_if.nif_driver->netif_bname, + best_if.nif_unit, best_if.nif_sel); #endif - return &best_if; + return (&best_if); } int @@ -164,7 +164,7 @@ netif_probe(struct netif *nif, void *machdep_hint) if (netif_debug) printf("%s%d: netif_probe\n", drv->netif_bname, nif->nif_unit); #endif - return drv->netif_probe(nif, machdep_hint); + return (drv->netif_probe(nif, machdep_hint)); } void @@ -176,15 +176,15 @@ netif_attach(struct netif *nif, struct iodesc *desc, void *machdep_hint) if (netif_debug) printf("%s%d: netif_attach\n", drv->netif_bname, nif->nif_unit); #endif - desc->io_netif = nif; + desc->io_netif = nif; #ifdef PARANOID if (drv->netif_init == NULL) panic("%s%d: no netif_init support\n", drv->netif_bname, nif->nif_unit); #endif drv->netif_init(desc, machdep_hint); - bzero(drv->netif_ifs[nif->nif_unit].dif_stats, - sizeof(struct netif_stats)); + bzero(drv->netif_ifs[nif->nif_unit].dif_stats, + sizeof (struct netif_stats)); } void @@ -274,7 +274,7 @@ netif_open(void *machdep_hint) int fd; struct iodesc *s; struct netif *nif; - + /* find a free socket */ for (fd = 0, s = sockets; fd < SOPEN_MAX; fd++, s++) if (s->io_netif == (struct netif *)0) @@ -283,10 +283,10 @@ netif_open(void *machdep_hint) return (-1); fnd: - bzero(s, sizeof(*s)); + bzero(s, sizeof (*s)); netif_init(); nif = netif_select(machdep_hint); - if (!nif) + if (!nif) panic("netboot: no interfaces left untried"); if (netif_probe(nif, machdep_hint)) { printf("netboot: couldn't probe %s%d\n", diff --git a/usr/src/boot/lib/libstand/nfs.c b/usr/src/boot/lib/libstand/nfs.c index 1ca0547c9d..a31f449da8 100644 --- a/usr/src/boot/lib/libstand/nfs.c +++ b/usr/src/boot/lib/libstand/nfs.c @@ -48,10 +48,10 @@ #include "netif.h" #include "rpc.h" -#define NFS_DEBUGxx +#define NFS_DEBUGxx -#define NFSREAD_MIN_SIZE 1024 -#define NFSREAD_MAX_SIZE 16384 +#define NFSREAD_MIN_SIZE 1024 +#define NFSREAD_MAX_SIZE 16384 /* NFSv3 definitions */ #define NFS_V3MAXFHSIZE 64 @@ -113,7 +113,7 @@ struct nfs_iodesc { struct iodesc *iodesc; off_t off; uint32_t fhsize; - u_char fh[NFS_V3MAXFHSIZE]; + uchar_t fh[NFS_V3MAXFHSIZE]; struct nfsv3_fattrs fa; /* all in network order */ uint64_t cookie; }; @@ -122,24 +122,24 @@ struct nfs_iodesc { * XXX interactions with tftp? See nfswrapper.c for a confusing * issue. */ -int nfs_open(const char *path, struct open_file *f); -static int nfs_close(struct open_file *f); -static int nfs_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t nfs_seek(struct open_file *f, off_t offset, int where); -static int nfs_stat(struct open_file *f, struct stat *sb); -static int nfs_readdir(struct open_file *f, struct dirent *d); +int nfs_open(const char *path, struct open_file *f); +static int nfs_close(struct open_file *f); +static int nfs_read(struct open_file *f, void *buf, size_t size, size_t *resid); +static off_t nfs_seek(struct open_file *f, off_t offset, int where); +static int nfs_stat(struct open_file *f, struct stat *sb); +static int nfs_readdir(struct open_file *f, struct dirent *d); struct nfs_iodesc nfs_root_node; struct fs_ops nfs_fsops = { - "nfs", - nfs_open, - nfs_close, - nfs_read, - null_write, - nfs_seek, - nfs_stat, - nfs_readdir + .fs_name = "nfs", + .fo_open = nfs_open, + .fo_close = nfs_close, + .fo_read = nfs_read, + .fo_write = null_write, + .fo_seek = nfs_seek, + .fo_stat = nfs_stat, + .fo_readdir = nfs_readdir }; static int nfs_read_size = NFSREAD_MIN_SIZE; @@ -181,7 +181,7 @@ set_nfs_read_size(void) * Return zero or error number. */ int -nfs_getrootfh(struct iodesc *d, char *path, uint32_t *fhlenp, u_char *fhp) +nfs_getrootfh(struct iodesc *d, char *path, uint32_t *fhlenp, uchar_t *fhp) { void *pkt = NULL; int len; @@ -192,7 +192,7 @@ nfs_getrootfh(struct iodesc *d, char *path, uint32_t *fhlenp, u_char *fhp) struct repl { uint32_t errno; uint32_t fhsize; - u_char fh[NFS_V3MAXFHSIZE]; + uchar_t fh[NFS_V3MAXFHSIZE]; uint32_t authcnt; uint32_t auth[7]; } *repl; @@ -209,13 +209,13 @@ nfs_getrootfh(struct iodesc *d, char *path, uint32_t *fhlenp, u_char *fhp) args = &sdata.d; - bzero(args, sizeof(*args)); + bzero(args, sizeof (*args)); len = strlen(path); - if (len > sizeof(args->path)) - len = sizeof(args->path); + if (len > sizeof (args->path)) + len = sizeof (args->path); args->len = htonl(len); bcopy(path, args->path, len); - len = sizeof(uint32_t) + roundup(len, sizeof(uint32_t)); + len = sizeof (uint32_t) + roundup(len, sizeof (uint32_t)); cc = rpc_call(d, RPCPROG_MNT, RPCMNT_VER3, RPCMNT_MOUNT, args, len, (void **)&repl, &pkt); @@ -252,14 +252,14 @@ nfs_lookupfh(struct nfs_iodesc *d, const char *name, struct nfs_iodesc *newfd) struct args { uint32_t fhsize; uint32_t fhplusname[1 + - (NFS_V3MAXFHSIZE + FNAME_SIZE) / sizeof(uint32_t)]; + (NFS_V3MAXFHSIZE + FNAME_SIZE) / sizeof (uint32_t)]; } *args; struct repl { uint32_t errno; uint32_t fhsize; uint32_t fhplusattr[(NFS_V3MAXFHSIZE + - 2 * (sizeof(uint32_t) + - sizeof(struct nfsv3_fattrs))) / sizeof(uint32_t)]; + 2 * (sizeof (uint32_t) + + sizeof (struct nfsv3_fattrs))) / sizeof (uint32_t)]; } *repl; struct { uint32_t h[RPC_HEADER_WORDS]; @@ -274,17 +274,17 @@ nfs_lookupfh(struct nfs_iodesc *d, const char *name, struct nfs_iodesc *newfd) args = &sdata.d; - bzero(args, sizeof(*args)); + bzero(args, sizeof (*args)); args->fhsize = htonl(d->fhsize); bcopy(d->fh, args->fhplusname, d->fhsize); len = strlen(name); if (len > FNAME_SIZE) len = FNAME_SIZE; - pos = roundup(d->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); + pos = roundup(d->fhsize, sizeof (uint32_t)) / sizeof (uint32_t); args->fhplusname[pos++] = htonl(len); bcopy(name, &args->fhplusname[pos], len); - len = sizeof(uint32_t) + pos * sizeof(uint32_t) + - roundup(len, sizeof(uint32_t)); + len = sizeof (uint32_t) + pos * sizeof (uint32_t) + + roundup(len, sizeof (uint32_t)); cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_LOOKUP, args, len, (void **)&repl, &pkt); @@ -292,7 +292,7 @@ nfs_lookupfh(struct nfs_iodesc *d, const char *name, struct nfs_iodesc *newfd) free(pkt); return (errno); /* XXX - from rpc_call */ } - if (cc < 2 * sizeof(uint32_t)) { + if (cc < 2 * sizeof (uint32_t)) { free(pkt); return (EIO); } @@ -303,12 +303,12 @@ nfs_lookupfh(struct nfs_iodesc *d, const char *name, struct nfs_iodesc *newfd) } newfd->fhsize = ntohl(repl->fhsize); bcopy(repl->fhplusattr, &newfd->fh, newfd->fhsize); - pos = roundup(newfd->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); + pos = roundup(newfd->fhsize, sizeof (uint32_t)) / sizeof (uint32_t); if (repl->fhplusattr[pos++] == 0) { free(pkt); return (EIO); } - bcopy(&repl->fhplusattr[pos], &newfd->fa, sizeof(newfd->fa)); + bcopy(&repl->fhplusattr[pos], &newfd->fa, sizeof (newfd->fa)); free(pkt); return (0); } @@ -322,14 +322,14 @@ nfs_readlink(struct nfs_iodesc *d, char *buf) void *pkt = NULL; struct args { uint32_t fhsize; - u_char fh[NFS_V3MAXFHSIZE]; + uchar_t fh[NFS_V3MAXFHSIZE]; } *args; struct repl { uint32_t errno; uint32_t ok; struct nfsv3_fattrs fa; uint32_t len; - u_char path[NFS_MAXPATHLEN]; + uchar_t path[NFS_MAXPATHLEN]; } *repl; struct { uint32_t h[RPC_HEADER_WORDS]; @@ -345,16 +345,16 @@ nfs_readlink(struct nfs_iodesc *d, char *buf) args = &sdata.d; - bzero(args, sizeof(*args)); + bzero(args, sizeof (*args)); args->fhsize = htonl(d->fhsize); bcopy(d->fh, args->fh, d->fhsize); cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READLINK, - args, sizeof(uint32_t) + roundup(d->fhsize, sizeof(uint32_t)), + args, sizeof (uint32_t) + roundup(d->fhsize, sizeof (uint32_t)), (void **)&repl, &pkt); if (cc == -1) return (errno); - if (cc < 2 * sizeof(uint32_t)) { + if (cc < 2 * sizeof (uint32_t)) { rc = EIO; goto done; } @@ -392,7 +392,7 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len) void *pkt = NULL; struct args { uint32_t fhsize; - uint32_t fhoffcnt[NFS_V3MAXFHSIZE / sizeof(uint32_t) + 3]; + uint32_t fhoffcnt[NFS_V3MAXFHSIZE / sizeof (uint32_t) + 3]; } *args; struct repl { uint32_t errno; @@ -401,7 +401,7 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len) uint32_t count; uint32_t eof; uint32_t len; - u_char data[NFSREAD_MAX_SIZE]; + uchar_t data[NFSREAD_MAX_SIZE]; } *repl; struct { uint32_t h[RPC_HEADER_WORDS]; @@ -413,10 +413,10 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len) args = &sdata.d; - bzero(args, sizeof(*args)); + bzero(args, sizeof (*args)); args->fhsize = htonl(d->fhsize); bcopy(d->fh, args->fhoffcnt, d->fhsize); - pos = roundup(d->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); + pos = roundup(d->fhsize, sizeof (uint32_t)) / sizeof (uint32_t); args->fhoffcnt[pos++] = 0; args->fhoffcnt[pos++] = htonl((uint32_t)off); if (len > nfs_read_size) @@ -425,7 +425,7 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len) hlen = offsetof(struct repl, data[0]); cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READ, - args, 4 * sizeof(uint32_t) + roundup(d->fhsize, sizeof(uint32_t)), + args, 4 * sizeof (uint32_t) + roundup(d->fhsize, sizeof (uint32_t)), (void **)&repl, &pkt); if (cc == -1) { /* errno was already set by rpc_call */ @@ -464,7 +464,7 @@ nfs_open(const char *upath, struct open_file *f) struct iodesc *desc; struct nfs_iodesc *currfd = NULL; char buf[2 * NFS_V3MAXFHSIZE + 3]; - u_char *fh; + uchar_t *fh; char *cp; int i; struct nfs_iodesc *newfd = NULL; @@ -518,12 +518,12 @@ nfs_open(const char *upath, struct open_file *f) setenv("boot.nfsroot.nfshandlelen", buf, 1); /* Allocate file system specific data structure */ - currfd = malloc(sizeof(*newfd)); + currfd = malloc(sizeof (*newfd)); if (currfd == NULL) { error = ENOMEM; goto out; } - bcopy(&nfs_root_node, currfd, sizeof(*currfd)); + bcopy(&nfs_root_node, currfd, sizeof (*currfd)); newfd = NULL; cp = path = strdup(upath); @@ -549,7 +549,7 @@ nfs_open(const char *upath, struct open_file *f) } /* allocate file system specific data structure */ - newfd = malloc(sizeof(*newfd)); + newfd = malloc(sizeof (*newfd)); if (newfd == NULL) { error = ENOMEM; goto out; @@ -592,8 +592,8 @@ nfs_open(const char *upath, struct open_file *f) link_len = strlen(linkbuf); len = strlen(cp); - if (link_len + len > MAXPATHLEN - || ++nlinks > MAXSYMLINKS) { + if (link_len + len > MAXPATHLEN || + ++nlinks > MAXSYMLINKS) { error = ENOENT; goto out; } @@ -607,7 +607,7 @@ nfs_open(const char *upath, struct open_file *f) */ cp = namebuf; if (*cp == '/') - bcopy(&nfs_root_node, currfd, sizeof(*currfd)); + bcopy(&nfs_root_node, currfd, sizeof (*currfd)); free(newfd); newfd = NULL; @@ -628,7 +628,7 @@ out: if (!error) { currfd->off = 0; currfd->cookie = 0; - f->f_fsdata = (void *)currfd; + f->f_fsdata = currfd; return (0); } @@ -649,7 +649,7 @@ nfs_close(struct open_file *f) #ifdef NFS_DEBUG if (debug) - printf("nfs_close: fp=0x%lx\n", (u_long)fp); + printf("nfs_close: fp=%#p\n", fp); #endif free(fp); @@ -670,12 +670,12 @@ nfs_read(struct open_file *f, void *buf, size_t size, size_t *resid) #ifdef NFS_DEBUG if (debug) - printf("nfs_read: size=%lu off=%d\n", (u_long)size, - (int)fp->off); + printf("nfs_read: size=%zu off=%j\n", size, + (intmax_t)fp->off); #endif - while ((int)size > 0) { + while (size > 0) { twiddle(16); - cc = nfs_readdata(fp, fp->off, (void *)addr, size); + cc = nfs_readdata(fp, fp->off, addr, size); /* XXX maybe should retry on certain errors */ if (cc == -1) { #ifdef NFS_DEBUG @@ -777,11 +777,12 @@ nfs_readdir(struct open_file *f, struct dirent *d) free(pkt); pkt = NULL; args = &sdata.d; - bzero(args, sizeof(*args)); + bzero(args, sizeof (*args)); args->fhsize = htonl(fp->fhsize); bcopy(fp->fh, args->fhpluscookie, fp->fhsize); - pos = roundup(fp->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); + pos = roundup(fp->fhsize, + sizeof (uint32_t)) / sizeof (uint32_t); args->fhpluscookie[pos++] = htonl(fp->off >> 32); args->fhpluscookie[pos++] = htonl(fp->off); args->fhpluscookie[pos++] = htonl(fp->cookie >> 32); @@ -789,8 +790,8 @@ nfs_readdir(struct open_file *f, struct dirent *d) args->fhpluscookie[pos] = htonl(NFS_READDIRSIZE); cc = rpc_call(fp->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READDIR, - args, 6 * sizeof(uint32_t) + - roundup(fp->fhsize, sizeof(uint32_t)), + args, 6 * sizeof (uint32_t) + + roundup(fp->fhsize, sizeof (uint32_t)), (void **)&buf, &pkt); if (cc == -1) { rc = errno; @@ -822,7 +823,7 @@ nfs_readdir(struct open_file *f, struct dirent *d) bcopy(rent->nameplus, d->d_name, d->d_namlen); d->d_name[d->d_namlen] = '\0'; - pos = roundup(d->d_namlen, sizeof(uint32_t)) / sizeof(uint32_t); + pos = roundup(d->d_namlen, sizeof (uint32_t)) / sizeof (uint32_t); fp->off = cookie = ((uint64_t)ntohl(rent->nameplus[pos]) << 32) | ntohl(rent->nameplus[pos + 1]); pos += 2; diff --git a/usr/src/boot/sys/sys/types.h b/usr/src/boot/sys/sys/types.h index ee3d847278..81168bdff4 100644 --- a/usr/src/boot/sys/sys/types.h +++ b/usr/src/boot/sys/sys/types.h @@ -60,7 +60,10 @@ typedef unsigned int uint; /* Sys V compatibility */ /* * POSIX Extensions */ +typedef unsigned char uchar_t; +typedef unsigned short ushort_t; typedef unsigned int uint_t; +typedef unsigned long ulong_t; /* * XXX POSIX sized integrals that should appear only in <sys/stdint.h>. |