#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
+#include <arpa/inet.h>
#include <atalk/adouble.h>
#include <atalk/ea.h>
#include <atalk/vfs.h>
#include <atalk/util.h>
#include <atalk/unix.h>
+#include <atalk/compat.h>
/*
* Store Extended Attributes inside .AppleDouble folders as follows:
{
int ret = 0;
unsigned int count = 0;
+ uint16_t uint16;
uint32_t uint32;
char *buf;
/* Check magic and version */
buf = ea->ea_data;
- if (*(uint32_t *)buf != htonl(EA_MAGIC)) {
- LOG(log_error, logtype_afpd, "unpack_header: wrong magic 0x%08x", *(uint32_t *)buf);
+ memcpy(&uint32, buf, sizeof(uint32_t));
+ if (uint32 != htonl(EA_MAGIC)) {
+ LOG(log_error, logtype_afpd, "unpack_header: wrong magic 0x%08x", uint32);
ret = -1;
goto exit;
}
buf += 4;
- if (*(uint16_t *)buf != htons(EA_VERSION)) {
- LOG(log_error, logtype_afpd, "unpack_header: wrong version 0x%04x", *(uint16_t *)buf);
+ memcpy(&uint16, buf, sizeof(uint16_t));
+ if (uint16 != htons(EA_VERSION)) {
+ LOG(log_error, logtype_afpd, "unpack_header: wrong version 0x%04x", uint16);
ret = -1;
goto exit;
}
buf += 2;
/* Get EA count */
- ea->ea_count = ntohs(*(uint16_t *)buf);
+ memcpy(&uint16, buf, sizeof(uint16_t));
+ ea->ea_count = ntohs(uint16);
LOG(log_debug, logtype_afpd, "unpack_header: number of EAs: %u", ea->ea_count);
buf += 2;
{
int fd = -1, err = 0;
char *ptr;
+ uint16_t uint16;
+ uint32_t uint32;
if ((fd = open(uname, O_RDWR | O_CREAT | O_EXCL, 0666 & ~ea->vol->v_umask)) == -1) {
LOG(log_error, logtype_afpd, "ea_create: open race condition with ea header for file: %s", uname);
/* Now init it */
ptr = ea->ea_data;
- *(uint32_t *)ptr = htonl(EA_MAGIC);
+ uint32 = htonl(EA_MAGIC);
+ memcpy(ptr, &uint32, sizeof(uint32_t));
ptr += EA_MAGIC_LEN;
- *(uint16_t *)ptr = htons(EA_VERSION);
+
+ uint16 = htons(EA_VERSION);
+ memcpy(ptr, &uint16, sizeof(uint16_t));
ptr += EA_VERSION_LEN;
- *(uint16_t *)ptr = 0; /* count */
+
+ memset(ptr, 0, 2); /* count */
ea->ea_size = EA_HEADER_SIZE;
ea->ea_inited = EA_INITED;
unsigned int count = 0;
if (ea->ea_count == 0) {
- LOG(log_error, logtype_afpd, "ea_delentry('%s'): illegal ea_count of 0 on deletion");
+ LOG(log_error, logtype_afpd, "ea_delentry('%s'): illegal ea_count of 0 on deletion",
+ attruname);
return -1;
}
while (count < ea->ea_count) {
/* search matching EA */
- if (strcmp(attruname, (*ea->ea_entries)[count].ea_name) == 0) {
+ if ((*ea->ea_entries)[count].ea_name &&
+ strcmp(attruname, (*ea->ea_entries)[count].ea_name) == 0) {
free((*ea->ea_entries)[count].ea_name);
(*ea->ea_entries)[count].ea_name = NULL;
*/
char *ea_path(const struct ea * restrict ea, const char * restrict eaname, int macname)
{
- char *adname;
+ const char *adname;
static char pathbuf[MAXPATHLEN + 1];
/* get name of a adouble file from uname */
if ((ea_open(vol, dst, EA_RDWR | EA_CREATE, &dstea)) != 0) {
if (errno == ENOENT) {
/* Possibly the .AppleDouble folder didn't exist, we create it and try again */
- ad_init(&ad, vol->v_adouble, vol->v_ad_options);
- if ((ad_open(dst, ADFLAGS_HF, O_RDWR | O_CREAT, 0666, &ad)) != 0) {
+ ad_init(&ad, vol);
+ if ((ad_open(&ad, dst, ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666)) != 0) {
LOG(log_error, logtype_afpd, "ea_renamefile('%s/%s'): ad_open error: '%s'", src, dst, dst);
ret = AFPERR_MISC;
goto exit;
if ((ea_open(vol, dst, EA_RDWR | EA_CREATE, &dstea)) != 0) {
if (errno == ENOENT) {
/* Possibly the .AppleDouble folder didn't exist, we create it and try again */
- ad_init(&ad, vol->v_adouble, vol->v_ad_options);
- if ((ad_open(dst, ADFLAGS_HF, O_RDWR | O_CREAT, 0666, &ad)) != 0) {
+ ad_init(&ad, vol);
+ if ((ad_open(&ad, dst, ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666)) != 0) {
LOG(log_error, logtype_afpd, "ea_copyfile('%s/%s'): ad_open error: '%s'", src, dst, dst);
ret = AFPERR_MISC;
goto exit;
int ret = AFP_OK;
unsigned int count = 0;
- uid_t uid;
const char *eaname;
const char *eaname_safe = NULL;
struct ea ea;
LOG(log_debug, logtype_afpd, "ea_chmod_dir('%s')", name);
/* .AppleDouble already might be inaccesible, so we must run as id 0 */
- uid = geteuid();
- if (seteuid(0)) {
- LOG(log_error, logtype_afpd, "ea_chmod_dir('%s'): seteuid: %s", name, strerror(errno));
- return AFPERR_MISC;
- }
+ become_root();
/* Open EA stuff */
if ((ea_open(vol, name, EA_RDWR, &ea)) != 0) {
/* ENOENT --> no EA files, nothing to do */
if (errno != ENOENT)
ret = AFPERR_MISC;
- if (seteuid(uid) < 0) {
- LOG(log_error, logtype_afpd, "can't seteuid back: %s", strerror(errno));
- exit(EXITERR_SYS);
- }
+ unbecome_root();
return ret;
}
}
exit:
- if (seteuid(uid) < 0) {
- LOG(log_error, logtype_afpd, "can't seteuid back: %s", strerror(errno));
- exit(EXITERR_SYS);
- }
+ unbecome_root();
if ((ea_close(&ea)) != 0) {
LOG(log_error, logtype_afpd, "ea_chmod_dir('%s'): error closing ea handle", name);