}
/** Turn a user name into a uid */
-int name_to_uid(const char *name, uid_t *uid_p)
+int name_to_uid(const char *name, uid_t *uid_p, BOOL num_ok)
{
struct passwd *pass;
if (!name || !*name)
return 0;
- if (!(pass = getpwnam(name)))
+ if (num_ok && name[strspn(name, "0123456789")] == '\0') {
+ *uid_p = atol(name);
+ return 1;
+ } else if ((pass = getpwnam(name))) {
+ *uid_p = pass->pw_uid;
+ return 1;
+ } else
return 0;
- *uid_p = pass->pw_uid;
- return 1;
}
/** Turn a group name into a gid */
-int name_to_gid(const char *name, gid_t *gid_p)
+int name_to_gid(const char *name, gid_t *gid_p, BOOL num_ok)
{
struct group *grp;
if (!name || !*name)
return 0;
- if (!(grp = getgrnam(name)))
+ if (num_ok && name[strspn(name, "0123456789")] == '\0') {
+ *gid_p = atol(name);
+ return 1;
+ } else if ((grp = getgrnam(name))) {
+ *gid_p = grp->gr_gid;
+ return 1;
+ } else
return 0;
- *gid_p = grp->gr_gid;
- return 1;
}
/** Lock a byte range in a open file */
return ret;
}
+/* Append formatted text at *dest_ptr up to a maximum of sz (like snprintf).
+ * On success, advance *dest_ptr and return True; on overflow, return False. */
+BOOL snappendf(char **dest_ptr, size_t sz, const char *format, ...)
+{
+ va_list ap;
+ size_t len;
+
+ va_start(ap, format);
+ len = vsnprintf(*dest_ptr, sz, format, ap);
+ va_end(ap);
+
+ if (len >= sz)
+ return False;
+ else {
+ *dest_ptr += len;
+ return True;
+ }
+}
+
int count_dir_elements(const char *p)
{
int cnt = 0, new_component = 1;