return(st.st_mtime);
}
+/**
+ Check file permissions.
+**/
+
+_PUBLIC_ bool file_check_permissions(const char *fname,
+ uid_t uid,
+ mode_t file_perms,
+ struct stat *pst)
+{
+ int ret;
+ struct stat st;
+
+ if (pst == NULL) {
+ pst = &st;
+ }
+
+ ZERO_STRUCTP(pst);
+
+ ret = stat(fname, pst);
+ if (ret != 0) {
+ DEBUG(0, ("stat failed on file '%s': %s\n",
+ fname, strerror(errno)));
+ return false;
+ }
+
+ if (pst->st_uid != uid && !uid_wrapper_enabled()) {
+ DEBUG(0, ("invalid ownership of file '%s': "
+ "owned by uid %u, should be %u\n",
+ fname, (unsigned int)pst->st_uid,
+ (unsigned int)uid));
+ return false;
+ }
+
+ if ((pst->st_mode & 0777) != file_perms) {
+ DEBUG(0, ("invalid permissions on file "
+ "'%s': has 0%o should be 0%o\n", fname,
+ (unsigned int)(pst->st_mode & 0777),
+ (unsigned int)file_perms));
+ return false;
+ }
+
+ return true;
+}
+
/**
Check if a directory exists.
**/
/**
* Try to create the specified directory if it didn't exist.
*
- * @retval true if the directory already existed and has the right permissions
+ * @retval true if the directory already existed
* or was successfully created.
*/
_PUBLIC_ bool directory_create_or_exist(const char *dname,
- uid_t uid,
mode_t dir_perms)
{
int ret;
struct stat st;
+ mode_t old_umask;
ret = lstat(dname, &st);
- if (ret == -1) {
- mode_t old_umask;
+ if (ret == 0) {
+ return true;
+ }
- if (errno != ENOENT) {
- DEBUG(0, ("lstat failed on directory %s: %s\n",
- dname, strerror(errno)));
- return false;
- }
+ if (errno != ENOENT) {
+ DEBUG(0, ("lstat failed on directory %s: %s\n",
+ dname, strerror(errno)));
+ return false;
+ }
- /* Create directory */
- old_umask = umask(0);
- ret = mkdir(dname, dir_perms);
- if (ret == -1 && errno != EEXIST) {
- DEBUG(0, ("mkdir failed on directory "
- "%s: %s\n", dname,
- strerror(errno)));
- umask(old_umask);
- return false;
- }
+ /* Create directory */
+ old_umask = umask(0);
+ ret = mkdir(dname, dir_perms);
+ if (ret == -1 && errno != EEXIST) {
+ DEBUG(0, ("mkdir failed on directory "
+ "%s: %s\n", dname,
+ strerror(errno)));
umask(old_umask);
+ return false;
+ }
+ umask(old_umask);
- ret = lstat(dname, &st);
- if (ret == -1) {
- DEBUG(0, ("lstat failed on created directory %s: %s\n",
- dname, strerror(errno)));
- return false;
- }
+ ret = lstat(dname, &st);
+ if (ret == -1) {
+ DEBUG(0, ("lstat failed on created directory %s: %s\n",
+ dname, strerror(errno)));
+ return false;
}
return true;
* @brief Try to create a specified directory if it doesn't exist.
*
* The function creates a directory with the given uid and permissions if it
- * doesn't exixt. If it exists it makes sure the uid and permissions are
+ * doesn't exist. If it exists it makes sure the uid and permissions are
* correct and it will fail if they are different.
*
* @param[in] dname The directory to create.
bool ok;
int rc;
- ok = directory_create_or_exist(dname, uid, dir_perms);
+ ok = directory_create_or_exist(dname, dir_perms);
if (!ok) {
return false;
}
dname));
return false;
}
- if (st.st_uid != uid && !uwrap_enabled()) {
+ if (st.st_uid != uid && !uid_wrapper_enabled()) {
DEBUG(0, ("invalid ownership on directory "
"%s\n", dname));
return false;
struct debug_channel_level dcl = { dbgc_class, level };
if (!DEBUGLVLC(dbgc_class, level)) {
- DEBUG(0, ("dbgc_class is %d\n", dbgc_class));
return;
}
dump_data_cb(buf, len, false, debugadd_channel_cb, &dcl);
Like strdup but for memory.
**/
-_PUBLIC_ void *memdup(const void *p, size_t size)
+_PUBLIC_ void *smb_memdup(const void *p, size_t size)
{
void *p2;
if (size == 0)