コード例 #1
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
int com_rmdir(char *arg)
{
	
	int ret;
	char server_fullname[AFP_MAX_PATH];
	char filename[AFP_MAX_PATH];

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	if (escape_paths(filename,NULL,arg)) {
		printf("Syntax: rmdir <dirname>\n");
		goto error;
	}

	get_server_path(filename,server_fullname);

	if ((ret=ml_rmdir(vol,server_fullname))) {
		printf("Could not remove directory %s, error code is %d\n",
			filename,ret);
		goto error;
	}
	printf("Removed directory %s\n",filename);
	return 0;
error:
	return -1;
}
コード例 #2
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
int com_chmod(char * arg)
{
	unsigned int mode;
	char basename[PATH_MAX];
	char server_fullname[AFP_MAX_PATH];
	char modestring[100];
	int ret;

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	if (escape_paths(modestring,basename,arg)) {
		printf("expecting format: chmod <privs> <filename>\n");
		goto error;
	}

	if (sscanf(modestring,"%o",&mode)!=1) {
		printf("Mode of %s isn't octal\n");
		goto error;
	}

	get_server_path(basename,server_fullname);

	printf("Changing mode of %s to %o\n",server_fullname,mode);
	ret=ml_chmod(vol,server_fullname,mode);
	return 0;
error:
	return -1;
}
コード例 #3
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
int com_touch(char * arg)
{
	char server_fullname[AFP_MAX_PATH];
	int ret;
	char filename[AFP_MAX_PATH];
	char * basename = filename;

	if (escape_paths(filename,NULL,arg)) {
		printf("Syntax: touch <newfile>\n");
		goto error;
	}

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	get_server_path(basename,server_fullname);

	ret=ml_creat(vol,server_fullname,0600);
	return 0;
error:
	return -1;

	return 0;
}
コード例 #4
0
int com_delete (char *arg)
{
	
	int ret;
	char server_fullname[AFP_MAX_PATH];
	char filename[AFP_MAX_PATH];

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	if (escape_paths(filename,NULL,arg)) {
		printf("Syntax: del <filename>\n");
		goto error;
	}

	get_server_path(filename,server_fullname);

	if ((ret=afp_ml_unlink(vol,server_fullname))) {
		printf("Could not remove %s, error code is %d\n",
			filename,ret);
		goto error;
	}
	printf("Removed file %s\n",filename);
	return (1);
error:
	return -1;
}
コード例 #5
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
int com_rename (char * arg)
{

	char from_path[AFP_MAX_PATH], to_path[AFP_MAX_PATH];
	char full_from_path[AFP_MAX_PATH], full_to_path[AFP_MAX_PATH];
	struct stat stbuf;
	int ret;

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	if (escape_paths(from_path,to_path,arg)) {
		printf("Syntax: mv <fromfile> <tofile>\n");
		goto error;
	}

	get_server_path(from_path,full_from_path);
	get_server_path(to_path,full_to_path);
	printf("Moving from %s to %s\n",full_from_path,full_to_path);

	/* Make sure from_file exists */
	if ((ret=ml_getattr(vol,full_from_path,&stbuf))) {
		printf("Could not find file %s, error was %d\n",
			full_from_path,ret);
		goto error;
	}

	/* Make sure to_file doesn't exist */
	ret=ml_getattr(vol,full_to_path,&stbuf);
	if ((ret==0) && ((stbuf.st_mode & S_IFDIR)==0)) {
		printf("File %s already exists, error: %d\n", 
			full_to_path,ret);
		goto error;
	}

	if ((ret=ml_rename(vol,full_from_path, full_to_path))) goto error;

	return 0;
error:
	return -1;
}
コード例 #6
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
static int com_get_file(char * arg, int silent, 
	unsigned long long * total) 
{
	int fd;
	struct stat stat;
	char * localfilename;
	char filename[AFP_MAX_PATH];
	char getattr_path[AFP_MAX_PATH];
	int ret;

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}
	if ((escape_paths(filename,NULL,arg))) {
		printf("expecting format: get <filename>\n");
		goto error;
	}
	localfilename=basename(filename);

	printf("    Getting file %s\n",filename);

	if ((access(localfilename,W_OK)) && (errno!=ENOENT)) {
		printf("Trying to access %s\n",localfilename);
		perror("Access local file for write");
		goto error;
	}

	get_server_path(filename,getattr_path);

	if ((ret=ml_getattr(vol,getattr_path,&stat))!=0) {
		printf("Could not get file attributes for file %s, return code %d\n",filename,ret);
		goto error;
	}

	fd=open(localfilename,O_CREAT | O_TRUNC| O_RDWR, stat.st_mode);
	if (fd<0) {
		perror("Opening local file");
		goto error;
	}
	chmod(localfilename,stat.st_mode);
	chown(localfilename,stat.st_uid,stat.st_gid);
	retrieve_file(filename,fd,silent,&stat, total);

	close(fd);
	return 0;
error:
	return -1;
}
コード例 #7
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
static int retrieve_file(char * arg,int fd, int silent, 
	struct stat *stat, unsigned long long * amount_written)
{
	int flags=O_RDONLY;
	int ret=0;
	struct afp_file_info * fp;
	char path[PATH_MAX];
	off_t offset = 0;
#define BUF_SIZE 102400
	size_t size = BUF_SIZE;
	char buf[BUF_SIZE];
	int eof;
	unsigned long long total=0;
	struct timeval starttv,endtv;

	*amount_written=0;

	if (server==NULL) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	get_server_path(arg,path);

	gettimeofday(&starttv,NULL);

	if ((ret=ml_getattr(vol,path,stat))!=0) {
		printf("Could not get file attributes for file %s, return code %d\n",path,ret);
		goto error;
	}

	ret = ml_open(vol,path,flags,&fp);
	
	if (ret) {
		printf("Could not open %s on server, AFP error %d\n",arg,ret);
		goto error;
	}

	ret =1; /* to get the loop going */
	while (ret) 
	{
		memset(buf,0,BUF_SIZE);
		ret = ml_read(vol,path,buf,size,offset,fp,&eof);
		if (ret<=0) goto out;
		total+=write(fd,buf,ret);
		offset+=ret;
		if ((eof==1) || (ret==0)) goto out;
	}
out:

	if (fd>1) close(fd);
	ml_close(vol,path,fp);

	free(fp);

	if (silent==0) {
		gettimeofday(&endtv,NULL);
		printdiff(&starttv, &endtv,&total);
	}

	*amount_written=total;
	return 0;
error:
	return -1;
}
コード例 #8
0
ファイル: cmdline_afp.c プロジェクト: hiplayer/afpfs-ng
int com_put(char *arg)
{
	int ret, amount_read;
	struct afp_file_info *fp;
	int offset=0;
#define PUT_BUFSIZE 102400
	char buf[PUT_BUFSIZE];
	int fd;
	char server_fullname[AFP_MAX_PATH];
	char * basename;
	uid_t uid;
	gid_t gid;
	struct stat localstat;
	unsigned long long amount_written=0;
	struct timeval starttv,endtv;
	char filename[AFP_MAX_PATH];

	if ((server==NULL) || (vol==NULL)) {
		printf("You're not connected yet to a volume\n");
		goto error;
	}

	if ((escape_paths(filename,NULL,arg))) {
		printf("expecting format: put <filename>\n");
		goto error;
	}

	/* FIXME find basename */
	basename=filename;

	get_server_path(basename,server_fullname);

	/* FIXME need a better way to get server's uid/gid */

	uid=getuid();
	gid=getgid();

	if (stat(filename, &localstat)!=0) {
		perror("Opening local file");
	}

	fd = open(filename,O_RDONLY);

	if (fd<0) {
		perror("Opening local file");
		goto error;
	}

	gettimeofday(&starttv,NULL);

	ret = ml_open(vol,server_fullname,O_CREAT | O_RDWR,&fp);

	if (ret<0) {
		printf("Problem opening file %s on server\n",basename);
		goto out;
	}

	/* Now set various permissions */

	ret=ml_chmod(vol,server_fullname,localstat.st_mode);
	if (ret==-ENOSYS) printf("cannot change permissions\n");
	if (ret) {
		printf("Could not change permissions to 0%o\n",
			localstat.st_mode);
	}

	while (1) {
		amount_read=read(fd,buf,PUT_BUFSIZE);
		if (amount_read<0) {
			perror("Reading");
			goto out;
		}
		if (amount_read==0) goto out;
		ret=ml_write(vol,server_fullname,buf,amount_read,
			offset,fp,uid,gid);
		offset+=amount_read;
		amount_written+=amount_read;
		if (ret<0) {
			printf("IO error when writing to server, error %d\n", 
				ret);
			goto out;
		}
	}

/* FIXME time */

out:
	gettimeofday(&endtv,NULL);
	printdiff(&starttv, &endtv,&amount_written);

	close(fd);
	ml_close(vol,server_fullname,fp);
	return 0;

error:
	return -1;

}