/* * 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); } } } }
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); }