4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #pragma ident "%Z%%M% %I% %E% SMI"
35 #include "proto_list.h"
40 error(const char *msg
, int lc
)
42 (void) fprintf(stderr
, "warning: line %d - %s\n", lc
, msg
);
48 * returns 1 if the string is entirely numeric - if not it returns 0
52 is_num(const char *str
)
55 int len
= strlen(str
);
60 for (i
= 0; i
< len
; i
++)
69 * try and do some sanity/syntax checking against the line just
70 * read in - print warning messages as errors are encountered.
72 * these are simple checks, but then they catch the simple errors-:)
76 check_line(char *v
[], int lc
)
78 if ((!v
[NAME
]) || ((int)strlen(v
[NAME
]) < 1))
79 error("bad name", lc
);
81 if ((!v
[SRC
]) || ((int)strlen(v
[SRC
])) < 1)
82 error("bad source/symbolic line", lc
);
84 if ((!v
[PERM
]) || ((int)strlen(v
[PERM
]) < 3) || (!is_num(v
[PERM
])))
85 error("bad permissions", lc
);
87 if ((!v
[OWNR
]) || ((int)strlen(v
[OWNR
]) < 2))
88 error("bad owner", lc
);
90 if ((!v
[GRP
]) || ((int)strlen(v
[GRP
]) < 2))
91 error("bad group", lc
);
93 if ((!v
[INO
]) || (!is_num(v
[INO
])))
94 error("bad i-node", lc
);
96 if ((!v
[LCNT
]) || (!is_num(v
[LCNT
])))
97 error("bad link-count", lc
);
99 if ((!v
[CODE
]) || ((*v
[CODE
] != 'f') && (*v
[CODE
] != 'c') &&
100 (*v
[CODE
] != 'd') && (*v
[CODE
] != 'b') &&
101 (*v
[CODE
] != 'v') && (*v
[CODE
] != 'e') &&
102 (*v
[CODE
] != 's')) || ((int)strlen(v
[CODE
]) > 1))
103 error("bad type", lc
);
105 if ((!v
[MAJOR
]) || ((!is_num(v
[MAJOR
])) && (*v
[MAJOR
] != '-')))
106 error("bad major number", lc
);
108 if ((!v
[MINOR
]) || ((!is_num(v
[MINOR
])) && (*v
[MINOR
] != '-')))
109 error("bad minor number", lc
);
113 get_line(FILE *fp
, char *v
[])
119 static char buf
[BUFSIZ
];
120 static int line_count
= 0;
126 rc
= fgets(p
, BUFSIZ
, fp
);
129 * check for continuation marks at the end of the
130 * line - if it exists then append the next line at the
138 } else if ((rc
!= NULL
) && ((len
= strlen(p
)) > 1) &&
139 (p
[len
- 2] == '\\')) {
141 * check for continuation marks at the end of the
142 * line - if it exists then append the next line at the
154 * breakup the line into the various fields.
156 v
[PROTOS
] = index(buf
, ';');
159 v
[0] = strtok(buf
, FS
);
160 for (cont
= 1; cont
< FIELDS
- 1; cont
++)
161 v
[cont
] = strtok(NULL
, FS
);
163 check_line(v
, line_count
);
169 parse_line(char **v
, elem
*e
)
174 (void) strcpy(e
->name
, v
[NAME
]);
175 e
->perm
= strtol(v
[PERM
], NULL
, 8);
176 (void) strcpy(e
->owner
, v
[OWNR
]);
177 (void) strcpy(e
->group
, v
[GRP
]);
178 e
->inode
= atoi(v
[INO
]);
179 e
->ref_cnt
= atoi(v
[LCNT
]);
180 e
->file_type
= *v
[CODE
];
181 if ((v
[MAJOR
][0] == '-') && (v
[MAJOR
][1] == '\0'))
184 e
->major
= atoi(v
[MAJOR
]);
186 if ((v
[MINOR
][0] == '-') && (v
[MINOR
][1] == '\0'))
189 e
->minor
= atoi(v
[MINOR
]);
191 if ((v
[SYM
][0] == '-') && (v
[SYM
][1] == '\0'))
194 e
->symsrc
= malloc(strlen(v
[SYM
]) + 1);
195 (void) strcpy(e
->symsrc
, v
[SYM
]);
196 if (e
->file_type
!= SYM_LINK_T
)
198 if (strncmp(e
->symsrc
, "sun4/", 5) == 0)
200 else if (strncmp(e
->symsrc
, "sun4c/", 6) == 0)
202 else if (strncmp(e
->symsrc
, "sun4u/", 6) == 0)
204 else if (strncmp(e
->symsrc
, "sun4d/", 6) == 0)
206 else if (strncmp(e
->symsrc
, "sun4e/", 6) == 0)
208 else if (strncmp(e
->symsrc
, "sun4m/", 6) == 0)
210 else if (strncmp(e
->symsrc
, "sun4v/", 6) == 0)
212 #elif defined(__i386)
213 if (strncmp(e
->symsrc
, "i86pc/", 6) == 0)
216 if (strncmp(e
->symsrc
, "prep/", 5) == 0)
219 #error "Unknown instruction set"
222 (void) fprintf(stderr
,
223 "warning: Unknown relocation architecture "
224 "for %s\n", e
->symsrc
);
231 read_in_protolist(const char *pname
, elem_list
*list
, int verbose
)
234 char *line_vec
[FIELDS
];
236 static elem
*e
= NULL
;
238 list
->type
= PROTOLIST_LIST
;
240 if ((proto_fp
= fopen(pname
, "r")) == NULL
) {
246 (void) printf("reading in proto_list(%s)...\n", pname
);
249 while (get_line(proto_fp
, line_vec
)) {
251 e
= (elem
*)calloc(1, sizeof (elem
));
253 parse_line(line_vec
, e
);
254 if (!find_elem(list
, e
, FOLLOW_LINK
)) {
262 (void) printf("read in %d lines\n", count
);
264 (void) fclose(proto_fp
);