static int preview_path (char *previewpath, const char *path, struct stat *statbuf) { int i, len; char pathbuf[MAXPATHLEN]; struct stat sb; len = strlen(path); if (len + 16 >= MAXPATHLEN) return ENAMETOOLONG; strcpy(pathbuf, path); for (i = len - 1; i > 0; i--) { if (pathbuf[i] == DIRCHAR) { pathbuf[i++] = 0; break; } } snprintf(previewpath, MAXPATHLEN, "%s/.preview", pathbuf); if (stat(previewpath, &sb)) { if (statbuf) return ENOENT; if (SYS_mkdir(previewpath, hxd_cfg.permissions.directories)) return errno; } i--; pathbuf[i] = DIRCHAR; strcat(previewpath, &pathbuf[i]); if (statbuf && stat(previewpath, statbuf)) return errno; return 0; }
static void bookmark_save (GtkWidget *widget, gpointer data) { struct connect_context *cc = (struct connect_context *)data; GtkWidget *name_entry = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(widget), "name"); GtkWidget *dialog = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(widget), "dialog"); char *server = gtk_entry_get_text(GTK_ENTRY(cc->address_entry)); char *login = gtk_entry_get_text(GTK_ENTRY(cc->login_entry)); char *pass = gtk_entry_get_text(GTK_ENTRY(cc->password_entry)); char *home = getenv("HOME"); char *name = gtk_entry_get_text(GTK_ENTRY(name_entry)); char *path = g_strdup_printf("%s/.hx/bookmarks/%s", home, name); char *dir = g_strdup_printf("%s/.hx/bookmarks/", home); FILE *fp; fp = fopen(path, "w"); if (!fp) { SYS_mkdir(dir, 0700); fp = fopen(path, "w"); } if (!fp) { char *basedir = g_strdup_printf("%s/.hx", home); SYS_mkdir(basedir, 0700); SYS_mkdir(dir, 0700); fp = fopen(path, "w"); g_free(basedir); } if (!fp) { /* Give up */ return; } fprintf(fp, "%s\n", server); fprintf(fp, "%s\n", login); fprintf(fp, "%s\n", pass); fclose(fp); g_free(path); g_free(dir); gtk_widget_destroy(dialog); }
void FS_createpath( char *path ) { char *ofs; for (ofs = path+1; *ofs ; ofs++ ) { if ( *ofs == '/' ) { *ofs = 0; SYS_mkdir(path); *ofs = '/'; } } }
void rcv_file_mkdir (struct htlc_conn *htlc) { u_int16_t fnlen = 0; char dir[MAXPATHLEN], filename[NAME_MAX], newbuf[MAXPATHLEN]; int err; dir[0] = 0; dh_start(htlc) switch (dh_type) { case HTLC_DATA_FILE_NAME: fnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(filename, dh_data, fnlen); break; case HTLC_DATA_DIR: err = hldir_to_path(dh, ROOTDIR, dir, dir); if (err && err != ENOENT) { snd_strerror(htlc, err); return; } break; } dh_end() if (!fnlen && !dir[0]) { hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, 6, "huh?!?"); return; } if (dir[0]) { if (fnlen) snprintf(newbuf, sizeof(newbuf), "%s/%s", dir, filename); else strcpy(newbuf, dir); } else { snprintf(newbuf, sizeof(newbuf), "%s/%s", ROOTDIR, filename); } if (check_dropbox(htlc, newbuf)) { snd_strerror(htlc, EPERM); return; } if (log_mkdir) hxd_log("%s:%s:%u - mkdir %s", htlc->name, htlc->login, htlc->uid, newbuf); if (SYS_mkdir(newbuf, hxd_cfg.permissions.directories)) snd_strerror(htlc, errno); else hlwrite(htlc, HTLS_HDR_TASK, 0, 0); }
void rcv_folder_put (struct htlc_conn *htlc) { u_int16_t fnlen = 0, resume = 0; char path[MAXPATHLEN], dir[MAXPATHLEN], filename[NAME_MAX]; char abuf[HOSTLEN+1], buf[128]; struct stat sb; int err, siz, len; u_int32_t ref, data_pos = 0, rsrc_pos = 0, totalsize = 0, nfiles = 0; u_int8_t rflt[74]; struct SOCKADDR_IN lsaddr; struct htxf_conn *htxf; u_int16_t i; if (htlc->nr_puts >= htlc->put_limit) { len = snprintf(buf, sizeof(buf), "%u at a time", htlc->put_limit); hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, len, buf); return; } if (nr_puts >= hxd_cfg.limits.total_uploads) { len = snprintf(buf, sizeof(buf), "maximum number of total uploads reached (%u >= %d)", nr_gets, hxd_cfg.limits.total_uploads); hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, len, buf); return; } for (i = 0; i < HTXF_PUT_MAX; i++) if (!htlc->htxf_in[i]) break; if (i == HTXF_PUT_MAX) { snd_strerror(htlc, EAGAIN); return; } dh_start(htlc) switch (dh_type) { case HTLC_DATA_FILE_NAME: fnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(filename, dh_data, fnlen); break; case HTLC_DATA_DIR: if ((err = hldir_to_path(dh, ROOTDIR, dir, dir))) { snd_strerror(htlc, err); return; } break; case HTLC_DATA_FILE_PREVIEW: dh_getint(resume); break; case HTLC_DATA_HTXF_SIZE: dh_getint(totalsize); break; case HTLC_DATA_FILE_NFILES: dh_getint(nfiles); break; } dh_end() if (!htlc->access.upload_anywhere && (!dir[0] || (!strcasestr(dir, "UPLOAD") && !strcasestr(dir, "DROP BOX")))) { snd_strerror(htlc, EPERM); return; } if (!fnlen && !dir[0]) { /* No file name given */ hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, 6, "huh?!?"); return; } if (dir[0]) { if (fnlen) snprintf(path, sizeof(path), "%s/%s", dir, filename); else strcpy(path, dir); } else { snprintf(path, sizeof(path), "%s/%s", ROOTDIR, filename); } #ifdef HAVE_CORESERVICES resolve_alias_path(path, path); #endif if (!resume) { if (!stat(path, &sb)) { snd_strerror(htlc, EEXIST); return; } if (errno != ENOENT) { snd_strerror(htlc, errno); return; } SYS_mkdir(path, hxd_cfg.permissions.directories); } else { if (stat(path, &sb)) { snd_strerror(htlc, errno); return; } if (!S_ISDIR(sb.st_mode)) { snd_strerror(htlc, ENOTDIR); return; } } ref = htxf_ref_new(htlc); ref = htonl(ref); siz = sizeof(struct SOCKADDR_IN); if (getsockname(htlc->fd, (struct sockaddr *)&lsaddr, &siz)) { hxd_log("rcv_file_get: getsockname: %s", strerror(errno)); snd_strerror(htlc, errno); return; } htxf = htxf_new(htlc, 1); htxf->type = HTXF_TYPE_FOLDER; htxf->data_pos = data_pos; htxf->rsrc_pos = rsrc_pos; htxf->total_size = totalsize; htxf->ref = ref; htxf->sockaddr = htlc->sockaddr; htxf->listen_sockaddr = lsaddr; htxf->listen_sockaddr.SIN_PORT = htons(ntohs(htxf->listen_sockaddr.SIN_PORT) + 1); strcpy(htxf->path, path); htlc->nr_puts++; nr_puts++; if (log_upload) { inaddr2str(abuf, &htlc->sockaddr); hxd_log("%s@%s:%u - %s:%u:%u:%s - upload %s:%08x", htlc->userid, abuf, ntohs(htlc->sockaddr.SIN_PORT), htlc->name, htlc->icon, htlc->uid, htlc->login, htxf->path, htxf->ref); } if (!resume) hlwrite(htlc, HTLS_HDR_TASK, 0, 1, HTLS_DATA_HTXF_REF, sizeof(ref), &ref); else hlwrite(htlc, HTLS_HDR_TASK, 0, 2, HTLS_DATA_RFLT, 74, rflt, HTLS_DATA_HTXF_REF, sizeof(ref), &ref); }