forked from mirrors/tftp-hpa-google
		
	Start work on blksize2 option
This commit is contained in:
		
							parent
							
								
									ce451cc1f7
								
							
						
					
					
						commit
						50f08ba7cf
					
				
					 1 changed files with 35 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -116,15 +116,17 @@ void timer(int);
 | 
			
		|||
void justquit(int);
 | 
			
		||||
void do_opt(char *, char *, char **);
 | 
			
		||||
 | 
			
		||||
int     set_blksize(char *, char **);
 | 
			
		||||
int     set_tsize(char *, char **);
 | 
			
		||||
int	set_timeout(char *, char **);
 | 
			
		||||
int set_blksize(char *, char **);
 | 
			
		||||
int set_blksize2(char *, char **);
 | 
			
		||||
int set_tsize(char *, char **);
 | 
			
		||||
int set_timeout(char *, char **);
 | 
			
		||||
 | 
			
		||||
struct options {
 | 
			
		||||
        char    *o_opt;
 | 
			
		||||
        int     (*o_fnc)(char *, char **);
 | 
			
		||||
} options[] = {
 | 
			
		||||
        { "blksize",    set_blksize  },
 | 
			
		||||
        { "blksize2",   set_blksize2  },
 | 
			
		||||
        { "tsize",      set_tsize },
 | 
			
		||||
	{ "timeout",	set_timeout  },
 | 
			
		||||
        { NULL,         NULL }
 | 
			
		||||
| 
						 | 
				
			
			@ -404,7 +406,7 @@ int
 | 
			
		|||
set_blksize(char *val, char **ret)
 | 
			
		||||
{
 | 
			
		||||
  	static char b_ret[6];
 | 
			
		||||
        int sz = atoi(val);
 | 
			
		||||
        unsigned int sz = atoi(val);
 | 
			
		||||
 | 
			
		||||
        if (sz < 8)
 | 
			
		||||
                return(0);
 | 
			
		||||
| 
						 | 
				
			
			@ -412,10 +414,37 @@ set_blksize(char *val, char **ret)
 | 
			
		|||
                sz = MAX_SEGSIZE;
 | 
			
		||||
 | 
			
		||||
        segsize = sz;
 | 
			
		||||
        sprintf(*ret = b_ret, "%d", sz);
 | 
			
		||||
        sprintf(*ret = b_ret, "%u", sz);
 | 
			
		||||
        return(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Set a power-of-two block size (nonstandard)
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
set_blksize2(char *val, char **ret)
 | 
			
		||||
{
 | 
			
		||||
  	static char b_ret[6];
 | 
			
		||||
        unsigned int sz = atoi(val);
 | 
			
		||||
 | 
			
		||||
        if (sz < 8)
 | 
			
		||||
                return(0);
 | 
			
		||||
        else if (sz > MAX_SEGSIZE)
 | 
			
		||||
	        sz = MAX_SEGSIZE;
 | 
			
		||||
 | 
			
		||||
	/* Convert to a power of two */
 | 
			
		||||
	if ( sz & (sz-1) ) {
 | 
			
		||||
	  unsigned int sz1 = 1;
 | 
			
		||||
	  /* Not a power of two - need to convert */
 | 
			
		||||
	  while ( sz >>= 1 )
 | 
			
		||||
	    sz1 <<= 1;
 | 
			
		||||
	  sz = sz1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        segsize = sz;
 | 
			
		||||
        sprintf(*ret = b_ret, "%u", sz);
 | 
			
		||||
        return(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Return a file size (c.f. RFC2349)
 | 
			
		||||
| 
						 | 
				
			
			@ -547,6 +576,7 @@ validate_access(char *filename, int mode, struct formats *pf)
 | 
			
		|||
			if ((stbuf.st_mode&(S_IREAD >> 6)) == 0)
 | 
			
		||||
				return (EACCESS);
 | 
			
		||||
			tsize = stbuf.st_size;
 | 
			
		||||
			/* We don't know the tsize if conversion is needed */
 | 
			
		||||
			tsize_ok = !pf->f_convert;
 | 
			
		||||
		} else {
 | 
			
		||||
			if ((stbuf.st_mode&(S_IWRITE >> 6)) == 0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue