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.
27 * Copyright (c) 2018, Joyent, Inc.
37 #include "proto_list.h"
42 error(const char *msg
, int lc
)
44 (void) fprintf(stderr
, "warning: line %d - %s\n", lc
, msg
);
50 * returns 1 if the string is entirely numeric - if not it returns 0
54 is_num(const char *str
)
57 int len
= strlen(str
);
62 for (i
= 0; i
< len
; i
++)
71 * try and do some sanity/syntax checking against the line just
72 * read in - print warning messages as errors are encountered.
74 * these are simple checks, but then they catch the simple errors-:)
78 check_line(char *v
[], int lc
)
80 if ((!v
[NAME
]) || ((int)strlen(v
[NAME
]) < 1))
81 error("bad name", lc
);
83 if ((!v
[SRC
]) || ((int)strlen(v
[SRC
])) < 1)
84 error("bad source/symbolic line", lc
);
86 if ((!v
[PERM
]) || ((int)strlen(v
[PERM
]) < 3) || (!is_num(v
[PERM
])))
87 error("bad permissions", lc
);
89 if ((!v
[OWNR
]) || ((int)strlen(v
[OWNR
]) < 2))
90 error("bad owner", lc
);
92 if ((!v
[GRP
]) || ((int)strlen(v
[GRP
]) < 2))
93 error("bad group", lc
);
95 if ((!v
[INO
]) || (!is_num(v
[INO
])))
96 error("bad i-node", lc
);
98 if ((!v
[LCNT
]) || (!is_num(v
[LCNT
])))
99 error("bad link-count", lc
);
101 if ((!v
[CODE
]) || ((*v
[CODE
] != 'f') && (*v
[CODE
] != 'c') &&
102 (*v
[CODE
] != 'd') && (*v
[CODE
] != 'b') &&
103 (*v
[CODE
] != 'v') && (*v
[CODE
] != 'e') &&
104 (*v
[CODE
] != 's')) || ((int)strlen(v
[CODE
]) > 1))
105 error("bad type", lc
);
107 if ((!v
[MAJOR
]) || ((!is_num(v
[MAJOR
])) && (*v
[MAJOR
] != '-')))
108 error("bad major number", lc
);
110 if ((!v
[MINOR
]) || ((!is_num(v
[MINOR
])) && (*v
[MINOR
] != '-')))
111 error("bad minor number", lc
);
115 get_line(FILE *fp
, char *v
[])
121 static char buf
[BUFSIZ
];
122 static int line_count
= 0;
128 rc
= fgets(p
, BUFSIZ
, fp
);
131 * check for continuation marks at the end of the
132 * line - if it exists then append the next line at the
140 } else if ((rc
!= NULL
) && ((len
= strlen(p
)) > 1) &&
141 (p
[len
- 2] == '\\')) {
143 * check for continuation marks at the end of the
144 * line - if it exists then append the next line at the
156 * breakup the line into the various fields.
158 v
[PROTOS
] = index(buf
, ';');
161 v
[0] = strtok(buf
, FS
);
162 for (cont
= 1; cont
< FIELDS
- 1; cont
++)
163 v
[cont
] = strtok(NULL
, FS
);
165 check_line(v
, line_count
);
171 parse_line(char **v
, elem
*e
)
176 (void) strcpy(e
->name
, v
[NAME
]);
177 e
->perm
= strtol(v
[PERM
], NULL
, 8);
178 (void) strcpy(e
->owner
, v
[OWNR
]);
179 (void) strcpy(e
->group
, v
[GRP
]);
180 e
->inode
= atoi(v
[INO
]);
181 e
->ref_cnt
= atoi(v
[LCNT
]);
182 e
->file_type
= *v
[CODE
];
183 if ((v
[MAJOR
][0] == '-') && (v
[MAJOR
][1] == '\0'))
186 e
->major
= atoi(v
[MAJOR
]);
188 if ((v
[MINOR
][0] == '-') && (v
[MINOR
][1] == '\0'))
191 e
->minor
= atoi(v
[MINOR
]);
193 if ((v
[SYM
][0] == '-') && (v
[SYM
][1] == '\0'))
196 e
->symsrc
= malloc(strlen(v
[SYM
]) + 1);
197 (void) strcpy(e
->symsrc
, v
[SYM
]);
198 if (e
->file_type
!= SYM_LINK_T
)
200 if (strncmp(e
->symsrc
, "sun4/", 5) == 0)
202 else if (strncmp(e
->symsrc
, "sun4c/", 6) == 0)
204 else if (strncmp(e
->symsrc
, "sun4u/", 6) == 0)
206 else if (strncmp(e
->symsrc
, "sun4d/", 6) == 0)
208 else if (strncmp(e
->symsrc
, "sun4e/", 6) == 0)
210 else if (strncmp(e
->symsrc
, "sun4m/", 6) == 0)
212 else if (strncmp(e
->symsrc
, "sun4v/", 6) == 0)
214 #elif defined(__i386) || defined(__amd64)
215 if (strncmp(e
->symsrc
, "i86pc/", 6) == 0)
218 if (strncmp(e
->symsrc
, "prep/", 5) == 0)
221 #error "Unknown instruction set"
224 (void) fprintf(stderr
,
225 "warning: Unknown relocation architecture "
226 "for %s\n", e
->symsrc
);
233 read_in_protolist(const char *pname
, elem_list
*list
, int verbose
)
236 char *line_vec
[FIELDS
];
238 static elem
*e
= NULL
;
240 list
->type
= PROTOLIST_LIST
;
242 if ((proto_fp
= fopen(pname
, "r")) == NULL
) {
248 (void) printf("reading in proto_list(%s)...\n", pname
);
251 while (get_line(proto_fp
, line_vec
)) {
253 e
= (elem
*)calloc(1, sizeof (elem
));
255 parse_line(line_vec
, e
);
256 if (!find_elem(list
, e
, FOLLOW_LINK
)) {
264 (void) printf("read in %d lines\n", count
);
266 (void) fclose(proto_fp
);