void do_send_task(int fd, t_task_base *base, t_pfs_sig_head *h) { struct conn *curcon = &acon[fd]; curcon->send_len = 0; char obuf[2048] = {0x0}; pfs_cs_peer *peer = (pfs_cs_peer *) curcon->user; peer->hbtime = time(NULL); uint8_t tmp_status = FILE_SYNC_DST_2_SRC; if (base->fsize == 0 || base->retry) { if (get_localfile_stat(base) != LOCALFILE_OK) { LOG(pfs_data_log, LOG_ERROR, "filename[%s] get_localfile_stat ERROR %m!\n", base->filename); tmp_status = FILE_SYNC_DST_2_SRC_E_OPENFILE; } } if (tmp_status == FILE_SYNC_DST_2_SRC) { t_pfs_tasklist *task = NULL; if (pfs_get_task(&task, TASK_Q_HOME)) { LOG(pfs_data_log, LOG_ERROR, "filename[%s] do_newtask ERROR!\n", base->filename); tmp_status = FILE_SYNC_DST_2_SRC_E_MALLOC; } else { memset(&(task->task), 0, sizeof(task->task)); t_task_sub *sub = &(task->task.sub); memset(sub, 0, sizeof(t_task_sub)); ip2str(sub->peerip, peer->ip); sub->processlen = base->fsize; sub->starttime = time(NULL); sub->oper_type = OPER_GET_RSP; sub->need_sync = TASK_SRC_NOSYNC; memcpy(&(task->task.base), base, sizeof(t_task_base)); int lfd = -1; if (open_localfile_4_read(base, &lfd) != LOCALFILE_OK) { LOG(pfs_data_log, LOG_ERROR, "fd[%d] err open [%s] %m close it\n", fd, base->filename); tmp_status = FILE_SYNC_DST_2_SRC_E_OPENFILE; task->task.base.overstatus = OVER_E_OPEN_SRCFILE; pfs_set_task(task, TASK_Q_FIN); } else { task->task.base.overstatus = OVER_UNKNOWN; pfs_set_task(task, TASK_Q_SEND); peer->sendtask = task; set_client_fd(fd, lfd, 0, sub->processlen); peer->sock_stat = SENDFILEING; } } } int n = create_sig_msg(CMD_GET_FILE_RSP, tmp_status, (t_pfs_sig_body *)base, obuf, sizeof(t_task_base)); set_client_data(fd, obuf, n); peer->headlen = n; }
static void inotify_event_handler(struct inotify_event *event) { int wd = event->wd; char *filename = event->name; if(filename == NULL ) { LOG(vfs_sig_log, LOG_DEBUG, "inotify event has no filename, go next!\n"); return; } LOG(vfs_sig_log, LOG_DEBUG, "inotify event filename [%s]!\n", filename); if(filename[0] == '.') { LOG(vfs_sig_log, LOG_TRACE, "tmpfile [%s] , i dont care!\n", filename); return; } char path[256] = {0x0}; strcpy(path, watch_dirs[wd]); strcat(path, "/"); strcat(path, filename); if (event->mask & IN_CREATE) { struct stat filestat; if (stat(path, &filestat)) { LOG(vfs_sig_log, LOG_ERROR, "get file stat %s err %m\n", path); return; } if (S_ISDIR(filestat.st_mode)) { LOG(vfs_sig_log, LOG_NORMAL, "new dir %s\n", path); add_watch(inotify_fd, path, mask); } else LOG(vfs_sig_log, LOG_NORMAL, "file %s be create, ignore it\n", path); return; } t_task_base task; memset(&task, 0, sizeof(task)); snprintf(task.filename, sizeof(task.filename), "%s", path); if((event->mask & IN_CLOSE_WRITE) || (event->mask & IN_MOVED_TO)) { if (get_localfile_stat(&task) != LOCALFILE_OK) { LOG(vfs_sig_log, LOG_ERROR, "get_localfile_stat err %s %m\n", task.filename); return; } task.type = TASK_ADDFILE; } if((event->mask & IN_DELETE) || (event->mask & IN_MOVED_FROM)) { LOG(vfs_sig_log, LOG_DEBUG, "inotify file delete or move away %s\n", path); task.type = TASK_DELFILE; } t_vfs_tasklist *vfs_task; int ret = vfs_get_task(&vfs_task, TASK_HOME); if(ret != GET_TASK_OK) { LOG(vfs_sig_log, LOG_ERROR, "inotify get task_home error %s:%d:%d\n", ID, FUNC, LN); return; } memset(&(vfs_task->task), 0, sizeof(t_vfs_taskinfo)); memcpy(&(vfs_task->task.base), &task, sizeof(task)); vfs_set_task(vfs_task, TASK_WAIT); LOG(vfs_sig_log, LOG_DEBUG, "inotify add task to task_wait filepath %s, task type %d\n", task.filename, task.type); return; }