Example #1
0
/*
 * Put the directory entries in the directory file
 */
static void
putdir(char *buf, long size)
{
	struct direct cvtbuf;
	struct odirect *odp;
	struct odirect *eodp;
	struct direct *dp;
	long loc, i;

	if (cvtflag) {
		eodp = (struct odirect *)&buf[size];
		for (odp = (struct odirect *)buf; odp < eodp; odp++)
			if (odp->d_ino != 0) {
				dcvt(odp, &cvtbuf);
				putent(&cvtbuf);
			}
	} else {
		for (loc = 0; loc < size; ) {
			dp = (struct direct *)(buf + loc);
			if (Bcvt)
				swabst((u_char *)"ls", (u_char *) dp);
			if (oldinofmt && dp->d_ino != 0) {
#				if BYTE_ORDER == BIG_ENDIAN
					if (Bcvt)
						dp->d_namlen = dp->d_type;
#				else
					if (!Bcvt)
						dp->d_namlen = dp->d_type;
#				endif
				dp->d_type = DT_UNKNOWN;
			}
			i = DIRBLKSIZ - (loc & (DIRBLKSIZ - 1));
			if ((dp->d_reclen & 0x3) != 0 ||
			    dp->d_reclen > i ||
			    dp->d_reclen < DIRSIZ(0, dp) ||
			    dp->d_namlen > NAME_MAX) {
				vprintf(stdout, "Mangled directory: ");
				if ((dp->d_reclen & 0x3) != 0)
					vprintf(stdout,
					   "reclen not multiple of 4 ");
				if (dp->d_reclen < DIRSIZ(0, dp))
					vprintf(stdout,
					   "reclen less than DIRSIZ (%d < %d) ",
					   dp->d_reclen, DIRSIZ(0, dp));
				if (dp->d_namlen > NAME_MAX)
					vprintf(stdout,
					   "reclen name too big (%d > %d) ",
					   dp->d_namlen, NAME_MAX);
				vprintf(stdout, "\n");
				loc += i;
				continue;
			}
			loc += dp->d_reclen;
			if (dp->d_ino != 0) {
				putent(dp);
			}
		}
	}
}
Example #2
0
int vksprintf(char *buf,char *fmt,va_list parms)
{
    int scanned = 0,w = 0,prec = 0, l, size = 0;
    int n1 = 0;
    unsigned n2 = 0,parsing = 0,flag = 0;
    char *base = buf;
    char *sp = NULL;
    
    while (*fmt != 0) {
	if (*fmt != '%' && !parsing) {
	    /* No token detected */
	    *buf++ = *fmt++;
	    scanned++;
	}
	else {	    
	    /* We need to make a conversion */
	    if (*fmt == '%') {
		fmt++;
		parsing = 1;
		w = 10;
		prec = 4;
		size = STD_SIZE;
		flag = 0;
	    }
	    /* Parse token */
	    switch(*fmt) {
		case '%' : *buf++ = '%';
			   scanned++;
			   parsing = 0;
			   break;
		case 'c' : *buf++ = va_arg(parms, char);
			   scanned++;
			   parsing = 0;
			   break;
		case 'i' :
	 	case 'd' : switch (size) {
		    		case STD_SIZE : n1 = va_arg(parms, int);
						break;
				case LONG_SIZE : n1 = va_arg(parms, long int);
						 break;
				case SHORT_SIZE : n1 = va_arg(parms, short int);
						  break;
			   }
			   l = dcvt(n1,buf,10,w,flag);
			   scanned += l;
			   buf += l;
			   parsing = 0;
			   break;
		case 'u' : switch (size) {
		    		case STD_SIZE : n2 = va_arg(parms, unsigned);
						break;
				case LONG_SIZE : n2 = va_arg(parms, unsigned long);
						 break;
				case SHORT_SIZE : n2 = va_arg(parms, unsigned short);
						  break;
			   }
			   l = ucvt(n2,buf,10,w,flag);
			   scanned += l;
			   buf += l;
			   parsing = 0;
			   break;
		case 'p' :
		case 'x' : switch (size) {
		    		case STD_SIZE : n2 = va_arg(parms, unsigned);
						break;
				case LONG_SIZE : n2 = va_arg(parms, unsigned long);
						 break;
				case SHORT_SIZE : n2 = va_arg(parms, unsigned short);
						  break;
			   }
			   l = ucvt(n2,buf,16,w,flag);
			   scanned += l;
			   buf += l;
			   parsing = 0;
			   break;
		case 's' : sp = va_arg(parms, char *);
			   l = 0;
			   while (*sp != 0) {
			       *buf++ = *sp++;
			       l++;
			   }
			   scanned += l;
			   parsing = 0;
			   break;
		case 'l' : size = LONG_SIZE;
			   break;
		case 'n' :
		case 'h' : size = SHORT_SIZE;
			   break;
		case '+' : flag |= ADD_PLUS;
			   break;
		case '-' : flag |= LEFT_PAD;
			   break;
		case '.' : parsing = 2;
			   flag |= RESPECT_WIDTH;
			   break;
		case '1' :
		case '2' :
		case '3' :
		case '4' :
		case '5' :
		case '6' :
		case '7' :
		case '8' :
		case '9' :
		case '0' : if (parsing == 1) {
		    	      w = strtou(fmt,10,&base);
			      /* MG */
			      /* if the first numeral is zero a ZERO pad is */
			      /* required */
			      /* but not if LEFT_PAD is set*/
			      if (*fmt!='0'||flag&LEFT_PAD)
				  flag |= SPACE_PAD ;
			      else
				  flag |= ZERO_PAD ;
			      fmt = base-1;
			   } else if (parsing == 2) {
			       prec = strtou(fmt,10,&base);
			       fmt = base-1;
			       parsing = 1;
			   }
			   break;
		default :  parsing = 0;
			   break;
	    }
	    fmt++;
	}
    }
    *buf = 0;
    return(scanned);
}