148404Sbostic /*- 248404Sbostic * Copyright (c) 1988 The Regents of the University of California. 348404Sbostic * All rights reserved. 448404Sbostic * 548404Sbostic * %sccs.include.proprietary.c% 621133Sdist */ 74410Smckusic 821133Sdist #ifndef lint 948404Sbostic char copyright[] = 1048404Sbostic "@(#) Copyright (c) 1988 The Regents of the University of California.\n\ 1148404Sbostic All rights reserved.\n"; 1248404Sbostic #endif /* not lint */ 1321133Sdist 1448404Sbostic #ifndef lint 15*59260Storek static char sccsid[] = "@(#)icheck.c 5.12 (Berkeley) 04/26/93"; 1648404Sbostic #endif /* not lint */ 1748404Sbostic 184240Smckusick /* 194240Smckusick * icheck 204240Smckusick */ 214240Smckusick #define NB 500 224240Smckusick #define MAXFN 500 235349Smckusic #define MAXNINDIR (MAXBSIZE / sizeof (daddr_t)) 244240Smckusick 2538509Sbostic #include <sys/param.h> 2653733Smckusick #include <sys/time.h> 2751619Sbostic #include <ufs/ufs/dinode.h> 2851619Sbostic #include <ufs/ffs/fs.h> 294240Smckusick #ifndef STANDALONE 3057999Sralph #include <unistd.h> 314240Smckusick #include <stdio.h> 324240Smckusick #endif 334240Smckusick 344240Smckusick union { 354240Smckusick struct fs sb; 3634148Smckusick char pad[SBSIZE]; 374240Smckusick } sbun; 384240Smckusick #define sblock sbun.sb 394240Smckusick 404240Smckusick union { 414240Smckusick struct cg cg; 425326Smckusic char pad[MAXBSIZE]; 434240Smckusick } cgun; 444240Smckusick #define cgrp cgun.cg 454240Smckusick 4634148Smckusick struct dinode itab[MAXBSIZE / sizeof(struct dinode)]; 4734148Smckusick 484240Smckusick daddr_t blist[NB]; 499298Smckusick daddr_t fsblist[NB]; 504240Smckusick char *bmap; 514240Smckusick 524240Smckusick int mflg; 534240Smckusick int dflg; 544240Smckusick int fi; 554240Smckusick ino_t ino; 564240Smckusick int cginit; 574240Smckusick 584240Smckusick ino_t nrfile; 594240Smckusick ino_t ndfile; 604240Smckusick ino_t nbfile; 614240Smckusick ino_t ncfile; 626286Smckusick ino_t nlfile; 6334148Smckusick ino_t nsfile; 644240Smckusick 654240Smckusick daddr_t nblock; 664240Smckusick daddr_t nfrag; 674240Smckusick daddr_t nindir; 684240Smckusick daddr_t niindir; 694240Smckusick 704240Smckusick daddr_t nffree; 714240Smckusick daddr_t nbfree; 724240Smckusick 734240Smckusick daddr_t ndup; 744240Smckusick 754240Smckusick int nerror; 7630558Smckusick long dev_bsize = 1; 774240Smckusick 78*59260Storek int bread __P((daddr_t, char *, ssize_t)); 794240Smckusick long atol(); 804240Smckusick #ifndef STANDALONE 814240Smckusick char *malloc(); 825098Smckusic char *calloc(); 834240Smckusick #endif 844240Smckusick 854240Smckusick main(argc, argv) 865098Smckusic int argc; 875098Smckusic char *argv[]; 884240Smckusick { 894240Smckusick register i; 904240Smckusick long n; 914240Smckusick 924240Smckusick blist[0] = -1; 934240Smckusick #ifndef STANDALONE 944240Smckusick while (--argc) { 954240Smckusick argv++; 964240Smckusick if (**argv=='-') 974240Smckusick switch ((*argv)[1]) { 984240Smckusick case 'd': 994240Smckusick dflg++; 1004240Smckusick continue; 1014240Smckusick 1024240Smckusick case 'm': 1034240Smckusick mflg++; 1044240Smckusick continue; 1054240Smckusick 1064240Smckusick case 'b': 10753026Sbostic for(i=0; i<NB && argc >= 2; i++) { 1084240Smckusick n = atol(argv[1]); 1094240Smckusick if(n == 0) 1104240Smckusick break; 1114240Smckusick blist[i] = n; 1124240Smckusick argv++; 1134240Smckusick argc--; 1144240Smckusick } 1154240Smckusick blist[i] = -1; 1164240Smckusick continue; 1174240Smckusick 1184240Smckusick default: 1194240Smckusick printf("Bad flag\n"); 1204240Smckusick } 1214240Smckusick check(*argv); 1224240Smckusick } 1234240Smckusick #else 1244240Smckusick { 1254240Smckusick static char fname[128]; 1264240Smckusick 1274240Smckusick printf("File: "); 1284240Smckusick gets(fname); 1294240Smckusick check(fname); 1304240Smckusick } 1314240Smckusick #endif 1324240Smckusick return(nerror); 1334240Smckusick } 1344240Smckusick 1354240Smckusick check(file) 1365098Smckusic char *file; 1374240Smckusick { 1384240Smckusick register i, j, c; 1394240Smckusick daddr_t d, cgd, cbase, b; 1404240Smckusick long n; 1419298Smckusick char buf[BUFSIZ]; 1424240Smckusick 14334148Smckusick fi = open(file, 0); 1444240Smckusick if (fi < 0) { 1455098Smckusic perror(file); 1464240Smckusick nerror |= 04; 1474240Smckusick return; 1484240Smckusick } 1494240Smckusick printf("%s:\n", file); 1504240Smckusick nrfile = 0; 1514240Smckusick ndfile = 0; 1524240Smckusick ncfile = 0; 1534240Smckusick nbfile = 0; 1546286Smckusick nlfile = 0; 15534148Smckusick nsfile = 0; 1564240Smckusick 1574240Smckusick nblock = 0; 1584240Smckusick nfrag = 0; 1594240Smckusick nindir = 0; 1604240Smckusick niindir = 0; 1614240Smckusick 1624240Smckusick ndup = 0; 1634240Smckusick #ifndef STANDALONE 1644240Smckusick sync(); 1654240Smckusick #endif 1665326Smckusic getsb(&sblock, file); 1675326Smckusic if (nerror) 1684240Smckusick return; 1699298Smckusick for (n=0; blist[n] != -1; n++) 1709298Smckusick fsblist[n] = dbtofsb(&sblock, blist[n]); 1714240Smckusick ino = 0; 1725098Smckusic n = roundup(howmany(sblock.fs_size, NBBY), sizeof(short)); 1734240Smckusick #ifdef STANDALONE 1744240Smckusick bmap = NULL; 1754240Smckusick #else 1764240Smckusick bmap = malloc((unsigned)n); 1774240Smckusick #endif 1784240Smckusick if (bmap==NULL) { 1794240Smckusick printf("Not enough core; duplicates unchecked\n"); 1804240Smckusick dflg++; 1814240Smckusick } 1824240Smckusick ino = 0; 1834240Smckusick cginit = 1; 1846534Smckusick if (!dflg) { 1856534Smckusick for (i = 0; i < (unsigned)n; i++) 1864240Smckusick bmap[i] = 0; 1876534Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 1885382Smckusic cgd = cgtod(&sblock, c); 1896534Smckusick if (c == 0) 1906534Smckusick d = cgbase(&sblock, c); 1916534Smckusick else 1926534Smckusick d = cgsblock(&sblock, c); 19332441Sbostic (void)sprintf(buf, "spare super block %d", c); 1946534Smckusick for (; d < cgd; d += sblock.fs_frag) 1959298Smckusick chk(d, buf, sblock.fs_bsize); 1965382Smckusic d = cgimin(&sblock, c); 19732441Sbostic (void)sprintf(buf, "cylinder group %d", c); 1984240Smckusick while (cgd < d) { 1999298Smckusick chk(cgd, buf, sblock.fs_bsize); 2005326Smckusic cgd += sblock.fs_frag; 2014240Smckusick } 2025382Smckusic d = cgdmin(&sblock, c); 2039298Smckusick i = INOPB(&sblock); 2049298Smckusick for (; cgd < d; cgd += sblock.fs_frag) { 20532441Sbostic (void)sprintf(buf, "inodes %d-%d", ino, ino + i); 2069298Smckusick chk(cgd, buf, sblock.fs_bsize); 2079298Smckusick ino += i; 2089298Smckusick } 2094240Smckusick if (c == 0) { 2106534Smckusick d += howmany(sblock.fs_cssize, sblock.fs_fsize); 2116534Smckusick for (; cgd < d; cgd++) 2126534Smckusick chk(cgd, "csum", sblock.fs_fsize); 2134240Smckusick } 2144240Smckusick } 2154240Smckusick } 2169298Smckusick ino = 0; 2174240Smckusick cginit = 0; 2184240Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 21934148Smckusick for (i = 0; 22034148Smckusick i < sblock.fs_ipg / INOPF(&sblock); 22134148Smckusick i += sblock.fs_frag) { 22234148Smckusick bread(fsbtodb(&sblock, cgimin(&sblock, c) + i), 22334148Smckusick (char *)itab, sblock.fs_bsize); 22434148Smckusick for (j = 0; j < INOPB(&sblock); j++) { 22534148Smckusick pass1(&itab[j]); 22634148Smckusick ino++; 22734148Smckusick } 2284240Smckusick } 2294240Smckusick } 2304240Smckusick ino = 0; 2314240Smckusick #ifndef STANDALONE 2324240Smckusick sync(); 2334240Smckusick #endif 2344240Smckusick nffree = 0; 2354240Smckusick nbfree = 0; 2364240Smckusick for (c = 0; c < sblock.fs_ncg; c++) { 2375382Smckusic cbase = cgbase(&sblock, c); 2385382Smckusic bread(fsbtodb(&sblock, cgtod(&sblock, c)), (char *)&cgrp, 2395326Smckusic sblock.fs_cgsize); 24034148Smckusick if (!cg_chkmagic(&cgrp)) 2416534Smckusick printf("cg %d: bad magic number\n", c); 2425326Smckusic for (b = 0; b < sblock.fs_fpg; b += sblock.fs_frag) { 24334148Smckusick if (isblock(&sblock, cg_blksfree(&cgrp), 2445326Smckusic b / sblock.fs_frag)) { 2454240Smckusick nbfree++; 2469298Smckusick chk(cbase+b, "free block", sblock.fs_bsize); 2474240Smckusick } else { 2485326Smckusic for (d = 0; d < sblock.fs_frag; d++) 24934148Smckusick if (isset(cg_blksfree(&cgrp), b+d)) { 2509298Smckusick chk(cbase+b+d, "free frag", sblock.fs_fsize); 2514240Smckusick nffree++; 2524240Smckusick } 2534240Smckusick } 2544240Smckusick } 2554240Smckusick } 2564240Smckusick close(fi); 2574240Smckusick #ifndef STANDALONE 2584240Smckusick if (bmap) 2594240Smckusick free(bmap); 2604240Smckusick #endif 2614240Smckusick 26234148Smckusick i = nrfile + ndfile + ncfile + nbfile + nlfile + nsfile; 2634240Smckusick #ifndef STANDALONE 26434148Smckusick printf("files %6u (r=%u,d=%u,b=%u,c=%u,sl=%u,sock=%u)\n", 26534148Smckusick i, nrfile, ndfile, nbfile, ncfile, nlfile, nsfile); 2664240Smckusick #else 26734148Smckusick printf("files %u (r=%u,d=%u,b=%u,c=%u,sl=%u,sock=%u)\n", 26834148Smckusick i, nrfile, ndfile, nbfile, ncfile, nlfile, nsfile); 2694240Smckusick #endif 2705326Smckusic n = (nblock + nindir + niindir) * sblock.fs_frag + nfrag; 2714240Smckusick #ifdef STANDALONE 2724240Smckusick printf("used %ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n", 2734240Smckusick n, nindir, niindir, nblock, nfrag); 2745326Smckusic printf("free %ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree, 2754240Smckusick nbfree, nffree); 2764240Smckusick #else 2774240Smckusick printf("used %7ld (i=%ld,ii=%ld,b=%ld,f=%ld)\n", 2784240Smckusick n, nindir, niindir, nblock, nfrag); 2795326Smckusic printf("free %7ld (b=%ld,f=%ld)\n", nffree + sblock.fs_frag * nbfree, 2804240Smckusick nbfree, nffree); 2814240Smckusick #endif 2824240Smckusick if(!dflg) { 2834240Smckusick n = 0; 2844410Smckusic for (d = 0; d < sblock.fs_size; d++) 2855326Smckusic if(!duped(d, sblock.fs_fsize)) { 2864240Smckusick if(mflg) 2874240Smckusick printf("%ld missing\n", d); 2884240Smckusick n++; 2894240Smckusick } 2904240Smckusick printf("missing%5ld\n", n); 2914240Smckusick } 2924240Smckusick } 2934240Smckusick 2944240Smckusick pass1(ip) 2954410Smckusic register struct dinode *ip; 2964240Smckusick { 2975326Smckusic daddr_t ind1[MAXNINDIR]; 2985326Smckusic daddr_t ind2[MAXNINDIR]; 2994429Smckusic daddr_t db, ib; 3004429Smckusic register int i, j, k, siz; 3019298Smckusick int lbn; 3029298Smckusick char buf[BUFSIZ]; 3034240Smckusick 3044240Smckusick i = ip->di_mode & IFMT; 3054790Smckusic if(i == 0) 3064240Smckusick return; 3074240Smckusick switch (i) { 3084240Smckusick case IFCHR: 3094240Smckusick ncfile++; 3104240Smckusick return; 3114240Smckusick case IFBLK: 3124240Smckusick nbfile++; 3134240Smckusick return; 3144240Smckusick case IFDIR: 3154240Smckusick ndfile++; 3164240Smckusick break; 3174240Smckusick case IFREG: 3184240Smckusick nrfile++; 3194240Smckusick break; 32034148Smckusick case IFSOCK: 32134148Smckusick nsfile++; 32234148Smckusick break; 3236286Smckusick case IFLNK: 3246286Smckusick nlfile++; 3256286Smckusick break; 3264240Smckusick default: 3274240Smckusick printf("bad mode %u\n", ino); 3284240Smckusick return; 3294240Smckusick } 3304410Smckusic for (i = 0; i < NDADDR; i++) { 3314410Smckusic db = ip->di_db[i]; 3324410Smckusic if (db == 0) 3334240Smckusick continue; 3345326Smckusic siz = dblksize(&sblock, ip, i); 33532441Sbostic (void)sprintf(buf, "logical data block %d", i); 3369298Smckusick chk(db, buf, siz); 3375326Smckusic if (siz == sblock.fs_bsize) 3384429Smckusic nblock++; 3394429Smckusic else 3405326Smckusic nfrag += howmany(siz, sblock.fs_fsize); 3414240Smckusick } 3424410Smckusic for(i = 0; i < NIADDR; i++) { 3434410Smckusic ib = ip->di_ib[i]; 3449298Smckusick if (ib == 0) 3454240Smckusick continue; 3465326Smckusic if (chk(ib, "1st indirect", sblock.fs_bsize)) 3474410Smckusic continue; 3485326Smckusic bread(fsbtodb(&sblock, ib), (char *)ind1, sblock.fs_bsize); 3494240Smckusick nindir++; 3505326Smckusic for (j = 0; j < NINDIR(&sblock); j++) { 3514410Smckusic ib = ind1[j]; 3524410Smckusic if (ib == 0) 3534240Smckusick continue; 3544410Smckusic if (i == 0) { 3559298Smckusick lbn = NDADDR + j; 3569298Smckusick siz = dblksize(&sblock, ip, lbn); 35732441Sbostic (void)sprintf(buf, "logical data block %d", lbn); 3589298Smckusick chk(ib, buf, siz); 3595326Smckusic if (siz == sblock.fs_bsize) 3604429Smckusic nblock++; 3614429Smckusic else 3625326Smckusic nfrag += howmany(siz, sblock.fs_fsize); 3634240Smckusick continue; 3644240Smckusick } 3655326Smckusic if (chk(ib, "2nd indirect", sblock.fs_bsize)) 3664410Smckusic continue; 3675326Smckusic bread(fsbtodb(&sblock, ib), (char *)ind2, 3685326Smckusic sblock.fs_bsize); 3694240Smckusick niindir++; 3705326Smckusic for (k = 0; k < NINDIR(&sblock); k++) { 3714410Smckusic ib = ind2[k]; 3724410Smckusic if (ib == 0) 3734240Smckusick continue; 3749298Smckusick lbn = NDADDR + NINDIR(&sblock) * (i + j) + k; 3759298Smckusick siz = dblksize(&sblock, ip, lbn); 37632441Sbostic (void)sprintf(buf, "logical data block %d", lbn); 3779298Smckusick chk(ib, buf, siz); 3785326Smckusic if (siz == sblock.fs_bsize) 3794429Smckusic nblock++; 3804429Smckusic else 3815326Smckusic nfrag += howmany(siz, sblock.fs_fsize); 3824240Smckusick } 3834240Smckusick } 3844240Smckusick } 3854240Smckusick } 3864240Smckusick 3874429Smckusic chk(bno, s, size) 3884410Smckusic daddr_t bno; 3894410Smckusic char *s; 3904429Smckusic int size; 3914240Smckusick { 3924240Smckusick register n, cg; 3935957Smckusic int frags; 3944240Smckusick 3955382Smckusic cg = dtog(&sblock, bno); 3966534Smckusick if (cginit == 0 && bno >= sblock.fs_frag * sblock.fs_size) { 3974240Smckusick printf("%ld bad; inode=%u, class=%s\n", bno, ino, s); 3984240Smckusick return(1); 3994240Smckusick } 4009298Smckusick frags = numfrags(&sblock, size); 4019298Smckusick if (frags == sblock.fs_frag) { 4024429Smckusic if (duped(bno, size)) { 4034429Smckusic printf("%ld dup block; inode=%u, class=%s\n", 4044429Smckusic bno, ino, s); 4055326Smckusic ndup += sblock.fs_frag; 4064429Smckusic } 4074429Smckusic } else { 4085957Smckusic for (n = 0; n < frags; n++) { 4095326Smckusic if (duped(bno + n, sblock.fs_fsize)) { 4104429Smckusic printf("%ld dup frag; inode=%u, class=%s\n", 4114429Smckusic bno, ino, s); 4124429Smckusic ndup++; 4134429Smckusic } 4144429Smckusic } 4154240Smckusick } 4164240Smckusick for (n=0; blist[n] != -1; n++) 4179298Smckusick if (fsblist[n] >= bno && fsblist[n] < bno + frags) 4189298Smckusick printf("%ld arg; frag %d of %d, inode=%u, class=%s\n", 4199298Smckusick blist[n], fsblist[n] - bno, frags, ino, s); 4204240Smckusick return(0); 4214240Smckusick } 4224240Smckusick 4234429Smckusic duped(bno, size) 4244410Smckusic daddr_t bno; 4254429Smckusic int size; 4264240Smckusick { 4274240Smckusick if(dflg) 4284240Smckusick return(0); 4295326Smckusic if (size != sblock.fs_fsize && size != sblock.fs_bsize) 4304429Smckusic printf("bad size %d to duped\n", size); 4315326Smckusic if (size == sblock.fs_fsize) { 4324410Smckusic if (isset(bmap, bno)) 4334410Smckusic return(1); 4344410Smckusic setbit(bmap, bno); 4354410Smckusic return (0); 4364410Smckusic } 4375326Smckusic if (bno % sblock.fs_frag != 0) 4384410Smckusic printf("bad bno %d to duped\n", bno); 4395326Smckusic if (isblock(&sblock, bmap, bno/sblock.fs_frag)) 4404410Smckusic return (1); 4415326Smckusic setblock(&sblock, bmap, bno/sblock.fs_frag); 4424240Smckusick return(0); 4434240Smckusick } 4444240Smckusick 4455326Smckusic getsb(fs, file) 4465326Smckusic register struct fs *fs; 4475326Smckusic char *file; 4485326Smckusic { 4496534Smckusick int i, j, size; 4505326Smckusic 451*59260Storek if (bread(SBOFF, (char *)fs, SBSIZE)) { 4525326Smckusic printf("bad super block"); 4535326Smckusic perror(file); 4545326Smckusic nerror |= 04; 4555326Smckusic return; 4565326Smckusic } 4575326Smckusic if (fs->fs_magic != FS_MAGIC) { 4585326Smckusic printf("%s: bad magic number\n", file); 4595326Smckusic nerror |= 04; 4605326Smckusic return; 4615326Smckusic } 46230558Smckusick dev_bsize = fs->fs_fsize / fsbtodb(fs, 1); 4636534Smckusick for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) { 4646534Smckusick size = sblock.fs_cssize - i < sblock.fs_bsize ? 4656534Smckusick sblock.fs_cssize - i : sblock.fs_bsize; 4666534Smckusick sblock.fs_csp[j] = (struct csum *)calloc(1, size); 4676534Smckusick bread(fsbtodb(fs, fs->fs_csaddr + (j * fs->fs_frag)), 4686534Smckusick (char *)fs->fs_csp[j], size); 4695326Smckusic } 4705326Smckusic } 4715326Smckusic 4724240Smckusick bread(bno, buf, cnt) 4734410Smckusic daddr_t bno; 4744410Smckusic char *buf; 475*59260Storek ssize_t cnt; 4764240Smckusick { 4774240Smckusick register i; 4784240Smckusick 47957999Sralph lseek(fi, (off_t)bno * dev_bsize, SEEK_SET); 4804240Smckusick if ((i = read(fi, buf, cnt)) != cnt) { 48157999Sralph for (i = 0; i < sblock.fs_bsize; i++) 4824240Smckusick buf[i] = 0; 4835326Smckusic return (1); 4844240Smckusick } 4855326Smckusic return (0); 4864240Smckusick } 4875326Smckusic 4885326Smckusic /* 4898143Smckusick * check if a block is available 4905326Smckusic */ 4915326Smckusic isblock(fs, cp, h) 4925326Smckusic struct fs *fs; 4935326Smckusic unsigned char *cp; 4945326Smckusic int h; 4955326Smckusic { 4965326Smckusic unsigned char mask; 4975326Smckusic 4985326Smckusic switch (fs->fs_frag) { 4995326Smckusic case 8: 5005326Smckusic return (cp[h] == 0xff); 5015326Smckusic case 4: 5025326Smckusic mask = 0x0f << ((h & 0x1) << 2); 5035326Smckusic return ((cp[h >> 1] & mask) == mask); 5045326Smckusic case 2: 5055326Smckusic mask = 0x03 << ((h & 0x3) << 1); 5065326Smckusic return ((cp[h >> 2] & mask) == mask); 5075326Smckusic case 1: 5085326Smckusic mask = 0x01 << (h & 0x7); 5095326Smckusic return ((cp[h >> 3] & mask) == mask); 5105326Smckusic default: 5118143Smckusick #ifdef STANDALONE 5128143Smckusick printf("isblock bad fs_frag %d\n", fs->fs_frag); 5138143Smckusick #else 5145326Smckusic fprintf(stderr, "isblock bad fs_frag %d\n", fs->fs_frag); 5158143Smckusick #endif 5165326Smckusic return; 5175326Smckusic } 5185326Smckusic } 5195326Smckusic 5208143Smckusick /* 5218143Smckusick * put a block into the map 5228143Smckusick */ 5235326Smckusic setblock(fs, cp, h) 5245326Smckusic struct fs *fs; 5255326Smckusic unsigned char *cp; 5265326Smckusic int h; 5275326Smckusic { 5285326Smckusic switch (fs->fs_frag) { 5295326Smckusic case 8: 5305326Smckusic cp[h] = 0xff; 5315326Smckusic return; 5325326Smckusic case 4: 5335326Smckusic cp[h >> 1] |= (0x0f << ((h & 0x1) << 2)); 5345326Smckusic return; 5355326Smckusic case 2: 5365326Smckusic cp[h >> 2] |= (0x03 << ((h & 0x3) << 1)); 5375326Smckusic return; 5385326Smckusic case 1: 5395326Smckusic cp[h >> 3] |= (0x01 << (h & 0x7)); 5405326Smckusic return; 5415326Smckusic default: 5428143Smckusick #ifdef STANDALONE 5438143Smckusick printf("setblock bad fs_frag %d\n", fs->fs_frag); 5448143Smckusick #else 5455326Smckusic fprintf(stderr, "setblock bad fs_frag %d\n", fs->fs_frag); 5468143Smckusick #endif 5475326Smckusic return; 5485326Smckusic } 5495326Smckusic } 550