forked from enlightenment/efl
* eio: add eio_file_chmod and eio_file_chown.
SVN revision: 53678
This commit is contained in:
parent
534c5d617d
commit
06ea9c415d
|
@ -79,7 +79,9 @@ typedef enum _Eio_File_Op
|
||||||
EIO_FILE_MOVE, /**< IO operation is about a specific file move */
|
EIO_FILE_MOVE, /**< IO operation is about a specific file move */
|
||||||
EIO_DIR_COPY, /**< IO operation is about a specific directory copy */
|
EIO_DIR_COPY, /**< IO operation is about a specific directory copy */
|
||||||
EIO_DIR_MOVE, /**< IO operation is about a specific directory move */
|
EIO_DIR_MOVE, /**< IO operation is about a specific directory move */
|
||||||
EIO_UNLINK /**< IO operation is about a destroying a path (source will point to base path to be destroyed and dest to path destroyed by this IO */
|
EIO_UNLINK, /**< IO operation is about a destroying a path (source will point to base path to be destroyed and dest to path destroyed by this IO */
|
||||||
|
EIO_FILE_GETPWNAM, /**< IO operation is trying to get uid from user name */
|
||||||
|
EIO_FILE_GETGRNAM /**< IO operation is trying to get gid from user name */
|
||||||
} Eio_File_Op;
|
} Eio_File_Op;
|
||||||
|
|
||||||
typedef struct _Eio_File Eio_File; /**< Generic asynchronous IO reference */
|
typedef struct _Eio_File Eio_File; /**< Generic asynchronous IO reference */
|
||||||
|
@ -131,6 +133,19 @@ EAPI Eio_File *eio_file_direct_stat(const char *path,
|
||||||
Eio_Error_Cb error_cb,
|
Eio_Error_Cb error_cb,
|
||||||
const void *data);
|
const void *data);
|
||||||
|
|
||||||
|
EAPI Eio_File *eio_file_chmod(const char *path,
|
||||||
|
mode_t mode,
|
||||||
|
Eio_Done_Cb done_cb,
|
||||||
|
Eio_Error_Cb error_cb,
|
||||||
|
const void *data);
|
||||||
|
|
||||||
|
EAPI Eio_File *eio_file_chown(const char *path,
|
||||||
|
const char *user,
|
||||||
|
const char *group,
|
||||||
|
Eio_Done_Cb done_cb,
|
||||||
|
Eio_Error_Cb error_cb,
|
||||||
|
const void *data);
|
||||||
|
|
||||||
EAPI Eio_File *eio_file_unlink(const char *path,
|
EAPI Eio_File *eio_file_unlink(const char *path,
|
||||||
Eio_Done_Cb done_cb,
|
Eio_Done_Cb done_cb,
|
||||||
Eio_Error_Cb error_cb,
|
Eio_Error_Cb error_cb,
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
|
||||||
#include <Ecore.h>
|
#include <Ecore.h>
|
||||||
|
|
||||||
|
@ -49,10 +51,12 @@ typedef struct _Eio_File_Ls Eio_File_Ls;
|
||||||
typedef struct _Eio_File_Direct_Ls Eio_File_Direct_Ls;
|
typedef struct _Eio_File_Direct_Ls Eio_File_Direct_Ls;
|
||||||
typedef struct _Eio_File_Char_Ls Eio_File_Char_Ls;
|
typedef struct _Eio_File_Char_Ls Eio_File_Char_Ls;
|
||||||
typedef struct _Eio_File_Mkdir Eio_File_Mkdir;
|
typedef struct _Eio_File_Mkdir Eio_File_Mkdir;
|
||||||
|
typedef struct _Eio_File_Mkdir Eio_File_Chmod;
|
||||||
typedef struct _Eio_File_Unlink Eio_File_Unlink;
|
typedef struct _Eio_File_Unlink Eio_File_Unlink;
|
||||||
typedef struct _Eio_File_Stat Eio_File_Stat;
|
typedef struct _Eio_File_Stat Eio_File_Stat;
|
||||||
typedef struct _Eio_File_Progress Eio_File_Progress;
|
typedef struct _Eio_File_Progress Eio_File_Progress;
|
||||||
typedef struct _Eio_File_Move Eio_File_Move;
|
typedef struct _Eio_File_Move Eio_File_Move;
|
||||||
|
typedef struct _Eio_File_Chown Eio_File_Chown;
|
||||||
|
|
||||||
typedef struct _Eio_Dir_Copy Eio_Dir_Copy;
|
typedef struct _Eio_Dir_Copy Eio_Dir_Copy;
|
||||||
|
|
||||||
|
@ -141,6 +145,15 @@ struct _Eio_Dir_Copy
|
||||||
Eina_List *dirs;
|
Eina_List *dirs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _Eio_File_Chown
|
||||||
|
{
|
||||||
|
Eio_File common;
|
||||||
|
|
||||||
|
const char *path;
|
||||||
|
const char *user;
|
||||||
|
const char *group;
|
||||||
|
};
|
||||||
|
|
||||||
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong. */
|
/* Be aware that ecore_thread_run could call cancel_cb if something goes wrong. */
|
||||||
Eina_Bool eio_file_set(Eio_File *common,
|
Eina_Bool eio_file_set(Eio_File *common,
|
||||||
Eio_Done_Cb done_cb,
|
Eio_Done_Cb done_cb,
|
||||||
|
|
|
@ -202,6 +202,100 @@ _eio_file_stat_error(void *data)
|
||||||
_eio_stat_free(s);
|
_eio_stat_free(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eio_file_chmod(Ecore_Thread *thread, void *data)
|
||||||
|
{
|
||||||
|
Eio_File_Chmod *ch = data;
|
||||||
|
|
||||||
|
if (chmod(ch->path, ch->mode) != 0)
|
||||||
|
eio_file_thread_error(&ch->common, thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eio_file_chown(Ecore_Thread *thread, void *data)
|
||||||
|
{
|
||||||
|
Eio_File_Chown *own = data;
|
||||||
|
char *tmp;
|
||||||
|
uid_t owner = -1;
|
||||||
|
gid_t group = -1;
|
||||||
|
|
||||||
|
own->common.error = 0;
|
||||||
|
|
||||||
|
if (own->user)
|
||||||
|
{
|
||||||
|
owner = strtol(own->user, &tmp, 10);
|
||||||
|
|
||||||
|
if (*tmp != '\0')
|
||||||
|
{
|
||||||
|
struct passwd *pw = NULL;
|
||||||
|
|
||||||
|
own->common.error = EIO_FILE_GETPWNAM;
|
||||||
|
|
||||||
|
pw = getpwnam(own->user);
|
||||||
|
if (!pw) goto on_error;
|
||||||
|
|
||||||
|
owner = pw->pw_uid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (own->group)
|
||||||
|
{
|
||||||
|
group = strtol(own->group, &tmp, 10);
|
||||||
|
|
||||||
|
if (*tmp != '\0')
|
||||||
|
{
|
||||||
|
struct group *grp = NULL;
|
||||||
|
|
||||||
|
own->common.error = EIO_FILE_GETGRNAM;
|
||||||
|
|
||||||
|
grp = getgrnam(own->group);
|
||||||
|
if (!grp) goto on_error;
|
||||||
|
|
||||||
|
group = grp->gr_gid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (owner == (uid_t) -1 && group == (gid_t) -1)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
if (chown(own->path, owner, group) != 0)
|
||||||
|
eio_file_thread_error(&own->common, thread);
|
||||||
|
|
||||||
|
return ;
|
||||||
|
|
||||||
|
on_error:
|
||||||
|
ecore_thread_cancel(thread);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eio_chown_free(Eio_File_Chown *ch)
|
||||||
|
{
|
||||||
|
if (ch->user) eina_stringshare_del(ch->user);
|
||||||
|
if (ch->group) eina_stringshare_del(ch->group);
|
||||||
|
eina_stringshare_del(ch->path);
|
||||||
|
free(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eio_file_chown_done(void *data)
|
||||||
|
{
|
||||||
|
Eio_File_Chown *ch = data;
|
||||||
|
|
||||||
|
if (ch->common.done_cb)
|
||||||
|
ch->common.done_cb((void*) ch->common.data);
|
||||||
|
|
||||||
|
_eio_chown_free(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eio_file_chown_error(void *data)
|
||||||
|
{
|
||||||
|
Eio_File_Chown *ch = data;
|
||||||
|
|
||||||
|
eio_file_error(&ch->common);
|
||||||
|
_eio_chown_free(ch);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
* @addtogroup Eio_Group Asynchronous Inout/Output library
|
||||||
|
@ -327,6 +421,92 @@ eio_file_mkdir(const char *path,
|
||||||
return &r->common;
|
return &r->common;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change right of a path.
|
||||||
|
* @param path The directory path to change access right.
|
||||||
|
* @param mode The permission to set, follow (mode & ~umask & 0777).
|
||||||
|
* @param done_cb Callback called from the main loop when the directory has been created.
|
||||||
|
* @param error_cb Callback called from the main loop when the directory failed to be created or has been canceled.
|
||||||
|
* @param data Private data given to callback.
|
||||||
|
* @return A reference to the IO operation.
|
||||||
|
*
|
||||||
|
* eio_file_chmod basically call chmod in another thread. This prevent any lock in your apps.
|
||||||
|
*/
|
||||||
|
EAPI Eio_File *
|
||||||
|
eio_file_chmod(const char *path,
|
||||||
|
mode_t mode,
|
||||||
|
Eio_Done_Cb done_cb,
|
||||||
|
Eio_Error_Cb error_cb,
|
||||||
|
const void *data)
|
||||||
|
{
|
||||||
|
Eio_File_Mkdir *r = NULL;
|
||||||
|
|
||||||
|
if (!path || !done_cb || !error_cb)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
r = malloc(sizeof (Eio_File_Mkdir));
|
||||||
|
if (!r) return NULL;
|
||||||
|
|
||||||
|
r->path = eina_stringshare_add(path);
|
||||||
|
r->mode = mode;
|
||||||
|
|
||||||
|
if (!eio_file_set(&r->common,
|
||||||
|
done_cb,
|
||||||
|
error_cb,
|
||||||
|
data,
|
||||||
|
_eio_file_chmod,
|
||||||
|
_eio_file_mkdir_done,
|
||||||
|
_eio_file_mkdir_error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &r->common;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change owner of a path.
|
||||||
|
* @param path The directory path to change owner.
|
||||||
|
* @param user The new user to set (could be NULL).
|
||||||
|
* @param group The new group to set (could be NULL).
|
||||||
|
* @param done_cb Callback called from the main loop when the directory has been created.
|
||||||
|
* @param error_cb Callback called from the main loop when the directory failed to be created or has been canceled.
|
||||||
|
* @param data Private data given to callback.
|
||||||
|
* @return A reference to the IO operation.
|
||||||
|
*
|
||||||
|
* eio_file_chown determine the uid/gid that correspond to both user and group string and then call chown. This prevent any lock in your apps by calling
|
||||||
|
* this function from another thread. The string could be the name of the user or the name of the group or directly their numerical value.
|
||||||
|
*/
|
||||||
|
EAPI Eio_File *eio_file_chown(const char *path,
|
||||||
|
const char *user,
|
||||||
|
const char *group,
|
||||||
|
Eio_Done_Cb done_cb,
|
||||||
|
Eio_Error_Cb error_cb,
|
||||||
|
const void *data)
|
||||||
|
{
|
||||||
|
Eio_File_Chown *c = NULL;
|
||||||
|
|
||||||
|
if (!path || !done_cb || !error_cb)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
c = malloc(sizeof (Eio_File_Chown));
|
||||||
|
if (!c) return NULL;
|
||||||
|
|
||||||
|
c->path = eina_stringshare_add(path);
|
||||||
|
c->user = eina_stringshare_add(user);
|
||||||
|
c->group = eina_stringshare_add(group);
|
||||||
|
|
||||||
|
if (!eio_file_set(&c->common,
|
||||||
|
done_cb,
|
||||||
|
error_cb,
|
||||||
|
data,
|
||||||
|
_eio_file_chown,
|
||||||
|
_eio_file_chown_done,
|
||||||
|
_eio_file_chown_error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &c->common;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue