static int opp_chkput(struct obex_session *os, void *user_data) { char *folder, *name, *path; int32_t time; const char *t; int err; if (obex_get_size(os) == OBJECT_SIZE_DELETE) return -ENOSYS; t = obex_get_name(os); if (t != NULL && !is_filename(t)) return -EBADR; if (obex_option_auto_accept()) { folder = g_strdup(obex_option_root_folder()); name = g_strdup(obex_get_name(os)); goto skip_auth; } time = 0; err = manager_request_authorization(user_data, time, &folder, &name); if (err < 0) return -EPERM; if (folder == NULL) folder = g_strdup(obex_option_root_folder()); if (name == NULL) name = g_strdup(obex_get_name(os)); skip_auth: if (name == NULL || strlen(name) == 0) { err = -EBADR; goto failed; } if (g_strcmp0(name, obex_get_name(os)) != 0) obex_set_name(os, name); path = g_build_filename(folder, name, NULL); err = obex_put_stream_start(os, path); g_free(path); if (err < 0) goto failed; manager_emit_transfer_started(user_data); failed: g_free(folder); g_free(name); return err; }
/* * Recursive function that moves through the directory inodes to find the * inumber of the desired file. */ int path_to_inode_number(struct unixfilesystem *fs, const char *pathname, int dir) { if(pathname[0] == 0) return 1; else if (is_filename(pathname)) { return name_to_inode_number(fs, pathname, dir); } else { char directoryName[MAX_NAME]; const char* newPath = get_directory_name(pathname, directoryName); dir = name_to_inode_number (fs, directoryName, dir); return path_to_inode_number(fs, newPath, dir); } }