static int pbap_setpath(struct obex_session *os, void *user_data) { struct pbap_session *pbap = user_data; const char *name; const uint8_t *nonhdr; char *fullname; int err; if (obex_get_non_header_data(os, &nonhdr) != 2) { error("Set path failed: flag and constants not found!"); return -EBADMSG; } name = obex_get_name(os); DBG("name %s folder %s nonhdr 0x%x%x", name, pbap->folder, nonhdr[0], nonhdr[1]); fullname = phonebook_set_folder(pbap->folder, name, nonhdr[0], &err); if (err < 0) return err; g_free(pbap->folder); pbap->folder = fullname; /* * FIXME: Define a criteria to mark the cache as invalid */ pbap->cache.valid = FALSE; pbap->cache.index = 0; cache_clear(&pbap->cache); return 0; }
static int opp_put(struct obex_session *os, void *user_data) { const char *name = obex_get_name(os); const char *folder = obex_option_root_folder(); if (folder == NULL) return -EPERM; if (name == NULL) return -EBADR; return 0; }
static int irmc_get(struct obex_session *os, void *user_data) { struct irmc_session *irmc = user_data; const char *type = obex_get_type(os); const char *name = obex_get_name(os); char *path; int ret; DBG("name %s type %s irmc %p", name, type ? type : "NA", irmc); path = g_strdup(name); ret = obex_get_stream_start(os, path); g_free(path); return ret; }
int ftp_put(struct obex_session *os, obex_object_t *obj, void *user_data) { struct ftp_session *ftp = user_data; const char *name = obex_get_name(os); ssize_t size = obex_get_size(os); DBG("%p name %s size %zd", ftp, name, size); if (ftp->folder == NULL) return -EPERM; if (name == NULL) return -EBADR; if (size == OBJECT_SIZE_DELETE) return ftp_delete(ftp, name); return 0; }
static int opp_get(struct obex_session *os, obex_object_t *obj, void *user_data) { const char *type; if (obex_get_name(os)) return -EPERM; type = obex_get_type(os); if (type == NULL) return -EPERM; if (g_ascii_strcasecmp(type, VCARD_TYPE) == 0) { if (obex_get_stream_start(os, VCARD_FILE) < 0) return -ENOENT; } else return -EPERM; return 0; }
static int mas_setpath(struct obex_session *os, void *user_data) { const char *name; const uint8_t *nonhdr; struct mas_session *mas = user_data; if (obex_get_non_header_data(os, &nonhdr) != 2) { error("Set path failed: flag and constants not found!"); return -EBADR; } name = obex_get_name(os); DBG("SETPATH: name %s nonhdr 0x%x%x", name, nonhdr[0], nonhdr[1]); if ((nonhdr[0] & 0x02) != 0x02) { DBG("Error: requested directory creation"); return -EBADR; } return messages_set_folder(mas->backend_data, name, nonhdr[0] & 0x01); }
static int mas_put(struct obex_session *os, obex_object_t *obj, void *user_data) { struct mas_session *mas = user_data; const char *type = obex_get_type(os); const char *name = obex_get_name(os); int ret; DBG("PUT: name %s type %s mas %p", name, type, mas); if (type == NULL) return -EBADR; ret = obex_put_stream_start(os, name); if (ret < 0) goto failed; return 0; failed: reset_request(mas); return ret; }
int ftp_chkput(struct obex_session *os, void *user_data) { struct ftp_session *ftp = user_data; const char *name = obex_get_name(os); char *path; int ret; DBG("%p name %s", ftp, name); if (name == NULL) return -EBADR; if (obex_get_size(os) == OBJECT_SIZE_DELETE) return 0; path = g_build_filename(ftp->folder, name, NULL); ret = obex_put_stream_start(os, path); g_free(path); return ret; }
static int get_by_type(struct ftp_session *ftp, const char *type) { struct obex_session *os = ftp->os; const char *capability = obex_get_capability_path(os); const char *name = obex_get_name(os); char *path; int err; DBG("%p name %s type %s", ftp, name, type); if (type == NULL && name == NULL) return -EBADR; if (g_strcmp0(type, CAP_TYPE) == 0) return obex_get_stream_start(os, capability); path = g_build_filename(ftp->folder, name, NULL); err = obex_get_stream_start(os, path); g_free(path); return err; }
int ftp_setpath(struct obex_session *os, obex_object_t *obj, void *user_data) { struct ftp_session *ftp = user_data; const char *root_folder, *name; uint8_t *nonhdr; char *fullname; struct stat dstat; gboolean root; int err; if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) { error("Set path failed: flag and constants not found!"); return -EBADMSG; } name = obex_get_name(os); root_folder = obex_get_root_folder(os); root = g_str_equal(root_folder, ftp->folder); DBG("%p name %s", ftp, name); /* Check flag "Backup" */ if ((nonhdr[0] & 0x01) == 0x01) { DBG("Set to parent path"); if (root) return -EPERM; fullname = g_path_get_dirname(ftp->folder); set_folder(ftp, fullname); g_free(fullname); DBG("Set to parent path: %s", ftp->folder); return 0; } if (!name) { DBG("Set path failed: name missing!"); return -EINVAL; } if (strlen(name) == 0) { DBG("Set to root"); set_folder(ftp, root_folder); return 0; } /* Check and set to name path */ if (strstr(name, "/") || strcmp(name, "..") == 0) { error("Set path failed: name incorrect!"); return -EPERM; } fullname = g_build_filename(ftp->folder, name, NULL); DBG("Fullname: %s", fullname); if (root && obex_get_symlinks(os)) err = stat(fullname, &dstat); else err = lstat(fullname, &dstat); if (err < 0) { err = -errno; if (err == -ENOENT) goto not_found; DBG("%s: %s(%d)", root ? "stat" : "lstat", strerror(-err), -err); goto done; } if (S_ISDIR(dstat.st_mode) && (dstat.st_mode & S_IRUSR) && (dstat.st_mode & S_IXUSR)) { set_folder(ftp, fullname); goto done; } err = -EPERM; goto done; not_found: if (nonhdr[0] != 0) { err = -ENOENT; goto done; } if (mkdir(fullname, 0755) < 0) { err = -errno; DBG("mkdir: %s(%d)", strerror(-err), -err); goto done; } err = 0; set_folder(ftp, fullname); done: g_free(fullname); return err; }
static int pbap_get(struct obex_session *os, obex_object_t *obj, void *user_data) { struct pbap_session *pbap = user_data; const char *type = obex_get_type(os); const char *name = obex_get_name(os); struct apparam_field *params; const uint8_t *buffer; char *path; ssize_t rsize; int ret; DBG("name %s type %s pbap %p", name, type, pbap); if (type == NULL) return -EBADR; rsize = obex_aparam_read(os, obj, &buffer); if (rsize < 0) return -EBADR; params = parse_aparam(buffer, rsize); if (params == NULL) return -EBADR; if (pbap->params) { g_free(pbap->params->searchval); g_free(pbap->params); } pbap->params = params; if (g_ascii_strcasecmp(type, PHONEBOOK_TYPE) == 0) { /* Always contains the absolute path */ if (g_path_is_absolute(name)) path = g_strdup(name); else path = g_build_filename("/", name, NULL); } else if (g_ascii_strcasecmp(type, VCARDLISTING_TYPE) == 0) { /* Always relative */ if (!name || strlen(name) == 0) /* Current folder */ path = g_strdup(pbap->folder); else /* Current folder + relative path */ path = g_build_filename(pbap->folder, name, NULL); } else if (g_ascii_strcasecmp(type, VCARDENTRY_TYPE) == 0) { /* File name only */ path = g_strdup(name); } else return -EBADR; if (path == NULL) return -EBADR; ret = obex_get_stream_start(os, path); g_free(path); return ret; }