/* we return 0 even if rmwatch fails, because xmsg_handle_data checks * if our session is still connected, so it'll ignore unneeded events */ static COMMAND(xmsg_disconnect) { if (!session_connected_get(session)) { printq("not_connected", session_name(session)); return -1; } xmsg_timer_change(session, NULL); if (!timer_remove_session(session, "o")) xdebug("old oneshot resume timer removed"); session_status_set(session, EKG_STATUS_NA); if (quiet == -1) protocol_disconnected_emit(session, format_find("xmsg_umount"), EKG_DISCONNECT_NETWORK); else protocol_disconnected_emit(session, NULL, EKG_DISCONNECT_USER); #ifdef HAVE_INOTIFY if (session->priv && inotify_rm_watch(in_fd, (long int) session->priv)) xdebug2(DEBUG_ERROR, "rmwatch failed"); else xdebug("inotify watch removed: %d", (long int) session->priv); #endif /*HAVE_INOTIFY*/ return 0; }
/* kind = 0 for sent, 1 for toobig */ static void xmsg_unlink_dotfiles(session_t *s, const char *varname) { if (session_int_get(s, varname)) { const int kind = !xstrcasecmp(varname, "unlink_sent"); const int maxfs = session_int_get(s, "max_filesize"); const char *dfsuffix = session_get(s, "dotfile_suffix"); const char *dir = xmsg_dirfix(session_uid_get(s)+XMSG_UID_DIROFFSET); DIR *d; struct dirent *de; struct stat st, std; char *df, *dfd, *dp, *dpd; if (!dir || !(d = opendir(dir))) { xdebug("unable to open specified directory"); return; } df = xmalloc(xstrlen(dir) + NAME_MAX + 2); dfd = xmalloc(xstrlen(dir) + NAME_MAX + 3 + xstrlen(dfsuffix)); xstrcpy(df, dir); dp = df + xstrlen(df); *(dp++) = '/'; xstrcpy(dfd, df); dpd = dfd + xstrlen(dfd); *(dpd++) = '.'; while ((de = readdir(d))) { if (de->d_name[0] == '.') continue; if (xstrlen(de->d_name) > NAME_MAX) { xdebug2(DEBUG_ERROR, "Filename longer than NAME_MAX (%s), skipping.", de->d_name); continue; } xstrcpy(dp, de->d_name); xstrcpy(dpd, de->d_name); xstrcat(dpd, dfsuffix); if (!stat(df, &st) && !stat(dfd, &std) && ((!maxfs || (st.st_size < maxfs)) == kind)) { xdebug("removing %s", de->d_name); unlink(df); unlink(dfd); } } closedir(d); xfree(df); xfree(dfd); } }
static const char *xmsg_dirfix(const char *path) { char *buf = (char*) prepare_pathf(NULL); /* steal the buffer */ if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX) { /* buffer too small */ xdebug2(DEBUG_ERROR, "Buffer too small for: in = %s, len = %d, PATH_MAX = %d", path, xstrlen(path), PATH_MAX); return NULL; } /* if path starts with slash, we leave it as is, * otherwise we convert # to / */ if (*buf != '/') { char *p; for (p = xstrchr(buf, '#'); p; p = xstrchr(p+1, '#')) *p = '/'; } xdebug("in: %s, out: %s", path, buf); return buf; }
void StnCallBack::TrafficData(ssize_t _send, ssize_t _recv) { xdebug2(TSF"send:%_, recv:%_", _send, _recv); }