//////////////////////////////////////////////////////////////////////////\/ // // FUNCTION: // VisBackInvisiblePixels // // DECLARATION: // static void VisBackInvisiblePixels(CVisRGBAByteImage &img, int v); // // PARAMETERS: // img - // Image to which backing color should be added // // v - // Gray-level value of backing pixel. // // // DESCRIPTION: // // Sets out to in OVER (v,v,v,255). // Also, sets any (v,v,v,255) value to (v+e,v+e,v+e,255), e = +/- 1 // // //////////////////////////////////////////////////////////////////////////\/ void VisBackInvisiblePixels(CVisRGBAByteImage &img, int v) { int rows = img.Height(), cols = img.Width()*img.NBands(); int ic, e = (v < 128) ? 1 : -1; *(CVisRGBABytePixel *) &ic = CVisRGBABytePixel(v, v, v, 255); int i0 = ic; *(CVisRGBABytePixel *) &ic = CVisRGBABytePixel(v+e, v+e, v+e, 255); int i1 = ic; CVisRGBABytePixel a_mask(0, 0, 0, 255); int ia_mask = *(int *) &a_mask; for (int r = 0; r < rows; r++) { CVisRGBABytePixel *p = img.PtrToFirstPixelInRow(r + img.Top()); int *ip = (int *) p; for (int c = 0; c < cols; c++) { #ifdef FASTER // Test 8 pixels at a time (speedup) if ((c & 7) == 0 && (c+7) < cols) { int *f = &ip[c]; int f255 = f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]; if ((f255 & ia_mask) == ia_mask) { c += 7; continue; // all 8 pixels are opaque } int f000 = f[0] | f[1] | f[2] | f[3] | f[4] | f[5] | f[6] | f[7]; if ((f000 & ia_mask) == 0) { // all 8 pixels are transparent f[0] = f[1] = f[2] = f[3] = f[4] = f[5] = f[6] = f[7] = i0; c += 7; continue; } } #endif if (ip[c] == 0) ip[c] = i0; else if (ip[c] == i0) ip[c] = i1; else if (p[c].A() != 255) { int w = ((255 - p[c].A())*v + 127)/255; p[c].SetR(p[c].R() + w); p[c].SetG(p[c].G() + w); p[c].SetB(p[c].B() + w); p[c].SetA(255); } } } }
void mount_tmpfs_parseargs(int argc, char *argv[], struct tmpfs_args *args, int *mntflags, char *canon_dev, char *canon_dir) { int gidset, modeset, uidset; /* Ought to be 'bool'. */ int ch; gid_t gid; uid_t uid; mode_t mode; int64_t tmpnumber; mntoptparse_t mp; struct stat sb; /* Set default values for mount point arguments. */ memset(args, 0, sizeof(*args)); args->ta_version = TMPFS_ARGS_VERSION; args->ta_size_max = 0; args->ta_nodes_max = 0; *mntflags = 0; gidset = 0; gid = 0; uidset = 0; uid = 0; modeset = 0; mode = 0; optind = optreset = 1; while ((ch = getopt(argc, argv, "g:m:n:o:s:u:")) != -1 ) { switch (ch) { case 'g': gid = a_gid(optarg); gidset = 1; break; case 'm': mode = a_mask(optarg); modeset = 1; break; case 'n': if (dehumanize_number(optarg, &tmpnumber) == -1) err(EXIT_FAILURE, "failed to parse nodes `%s'", optarg); args->ta_nodes_max = tmpnumber; break; case 'o': mp = getmntopts(optarg, mopts, mntflags, 0); if (mp == NULL) err(EXIT_FAILURE, "getmntopts"); freemntopts(mp); break; case 's': if (dehumanize_number(optarg, &tmpnumber) == -1) err(EXIT_FAILURE, "failed to parse size `%s'", optarg); args->ta_size_max = tmpnumber; break; case 'u': uid = a_uid(optarg); uidset = 1; break; case '?': default: usage(); } } argc -= optind; argv += optind; if (argc != 2) usage(); strlcpy(canon_dev, argv[0], MAXPATHLEN); pathadj(argv[1], canon_dir); if (stat(canon_dir, &sb) == -1) err(EXIT_FAILURE, "cannot stat `%s'", canon_dir); args->ta_root_uid = uidset ? uid : sb.st_uid; args->ta_root_gid = gidset ? gid : sb.st_gid; args->ta_root_mode = modeset ? mode : sb.st_mode; }
void mount_ntfs_parseargs(int argc, char **argv, struct ntfs_args *args, int *mntflags, char *canon_dev, char *canon_dir) { struct stat sb; int c, set_gid, set_uid, set_mask; char *dev, *dir; mntoptparse_t mp; *mntflags = set_gid = set_uid = set_mask = 0; (void)memset(args, '\0', sizeof(*args)); while ((c = getopt(argc, argv, "aiu:g:m:o:")) != -1) { switch (c) { case 'u': args->uid = a_uid(optarg); set_uid = 1; break; case 'g': args->gid = a_gid(optarg); set_gid = 1; break; case 'm': args->mode = a_mask(optarg); set_mask = 1; break; case 'i': args->flag |= NTFS_MFLAG_CASEINS; break; case 'a': args->flag |= NTFS_MFLAG_ALLNAMES; break; case 'o': mp = getmntopts(optarg, mopts, mntflags, 0); if (mp == NULL) err(1, "getmntopts"); freemntopts(mp); break; case '?': default: usage(); break; } } if (optind + 2 != argc) usage(); dev = argv[optind]; dir = argv[optind + 1]; pathadj(dev, canon_dev); pathadj(dir, canon_dir); args->fspec = dev; if (!set_gid || !set_uid || !set_mask) { if (stat(dir, &sb) == -1) err(EX_OSERR, "stat %s", dir); if (!set_uid) args->uid = sb.st_uid; if (!set_gid) args->gid = sb.st_gid; if (!set_mask) args->mode = sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); } }
int main(int argc, char **argv) { struct iovec *iov = NULL; int iovlen = 0; struct stat sb; int c, set_gid, set_uid, set_mask, set_dirmask; char *dev, *dir, mntpath[MAXPATHLEN], *csp; char fstype[] = "msdosfs"; char errmsg[255] = {0}; char *cs_dos = NULL; char *cs_local = NULL; mode_t mask = 0, dirmask = 0; uid_t uid = 0; gid_t gid = 0; set_gid = set_uid = set_mask = set_dirmask = 0; while ((c = getopt(argc, argv, "sl9u:g:m:M:o:L:D:W:")) != -1) { switch (c) { case 's': build_iovec(&iov, &iovlen, "shortnames", NULL, (size_t)-1); break; case 'l': build_iovec(&iov, &iovlen, "longnames", NULL, (size_t)-1); break; case '9': build_iovec_argf(&iov, &iovlen, "nowin95", "", (size_t)-1); break; case 'u': uid = a_uid(optarg); set_uid = 1; break; case 'g': gid = a_gid(optarg); set_gid = 1; break; case 'm': mask = a_mask(optarg); set_mask = 1; break; case 'M': dirmask = a_mask(optarg); set_dirmask = 1; break; case 'L': { const char *quirk = NULL; if (setlocale(LC_CTYPE, optarg) == NULL) err(EX_CONFIG, "%s", optarg); csp = strchr(optarg,'.'); if (!csp) err(EX_CONFIG, "%s", optarg); quirk = kiconv_quirkcs(csp + 1, KICONV_VENDOR_MICSFT); build_iovec_argf(&iov, &iovlen, "cs_local", quirk); cs_local = strdup(quirk); } break; case 'D': cs_dos = strdup(optarg); build_iovec_argf(&iov, &iovlen, "cs_dos", cs_dos, (size_t)-1); break; case 'o': { char *p = NULL; char *val = strdup(""); p = strchr(optarg, '='); if (p != NULL) { free(val); *p = '\0'; val = p + 1; } build_iovec(&iov, &iovlen, optarg, val, (size_t)-1); } break; case 'W': if (strcmp(optarg, "iso22dos") == 0) { cs_local = strdup("ISO8859-2"); cs_dos = strdup("CP852"); } else if (strcmp(optarg, "iso72dos") == 0) { cs_local = strdup("ISO8859-7"); cs_dos = strdup("CP737"); } else if (strcmp(optarg, "koi2dos") == 0) { cs_local = strdup("KOI8-R"); cs_dos = strdup("CP866"); } else if (strcmp(optarg, "koi8u2dos") == 0) { cs_local = strdup("KOI8-U"); cs_dos = strdup("CP866"); } else { err(EX_NOINPUT, "%s", optarg); } build_iovec(&iov, &iovlen, "cs_local", cs_local, (size_t)-1); build_iovec(&iov, &iovlen, "cs_dos", cs_dos, (size_t)-1); break; case '?': default: usage(); break; } } if (optind + 2 != argc) usage(); if (set_mask && !set_dirmask) { dirmask = mask; set_dirmask = 1; } else if (set_dirmask && !set_mask) { mask = dirmask; set_mask = 1; } dev = argv[optind]; dir = argv[optind + 1]; if (cs_local != NULL) { if (set_charset(&iov, &iovlen, cs_local, cs_dos) == -1) err(EX_OSERR, "msdosfs_iconv"); build_iovec_argf(&iov, &iovlen, "kiconv", ""); } else if (cs_dos != NULL) { build_iovec_argf(&iov, &iovlen, "cs_local", "ISO8859-1"); if (set_charset(&iov, &iovlen, "ISO8859-1", cs_dos) == -1) err(EX_OSERR, "msdosfs_iconv"); build_iovec_argf(&iov, &iovlen, "kiconv", ""); } /* * Resolve the mountpoint with realpath(3) and remove unnecessary * slashes from the devicename if there are any. */ if (checkpath(dir, mntpath) != 0) err(EX_USAGE, "%s", mntpath); (void)rmslashes(dev, dev); if (!set_gid || !set_uid || !set_mask) { if (stat(mntpath, &sb) == -1) err(EX_OSERR, "stat %s", mntpath); if (!set_uid) uid = sb.st_uid; if (!set_gid) gid = sb.st_gid; if (!set_mask) mask = dirmask = sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); } build_iovec(&iov, &iovlen, "fstype", fstype, (size_t)-1); build_iovec(&iov, &iovlen, "fspath", mntpath, (size_t)-1); build_iovec(&iov, &iovlen, "from", dev, (size_t)-1); build_iovec(&iov, &iovlen, "errmsg", errmsg, sizeof(errmsg)); build_iovec_argf(&iov, &iovlen, "uid", "%d", uid); build_iovec_argf(&iov, &iovlen, "gid", "%u", gid); build_iovec_argf(&iov, &iovlen, "mask", "%u", mask); build_iovec_argf(&iov, &iovlen, "dirmask", "%u", dirmask); if (nmount(iov, iovlen, 0) < 0) { if (errmsg[0]) err(1, "%s: %s", dev, errmsg); else err(1, "%s", dev); } exit (0); }
int mount_msdos_parseargs(int argc, char **argv, struct msdosfs_args *args, int *mntflags, char *canon_dev, char *canon_dir) { struct stat sb; int c, set_gid, set_uid, set_mask, set_dirmask, set_gmtoff; char *dev, *dir; mntoptparse_t mp; *mntflags = set_gid = set_uid = set_mask = set_dirmask = set_gmtoff = 0; (void)memset(args, '\0', sizeof(*args)); while ((c = getopt(argc, argv, "Gsl9u:g:m:M:o:t:")) != -1) { switch (c) { case 'G': args->flags |= MSDOSFSMNT_GEMDOSFS; break; case 's': args->flags |= MSDOSFSMNT_SHORTNAME; break; case 'l': args->flags |= MSDOSFSMNT_LONGNAME; break; case '9': args->flags |= MSDOSFSMNT_NOWIN95; break; case 'u': args->uid = a_uid(optarg); set_uid = 1; break; case 'g': args->gid = a_gid(optarg); set_gid = 1; break; case 'm': args->mask = a_mask(optarg); set_mask = 1; break; case 'M': args->dirmask = a_mask(optarg); set_dirmask = 1; break; case 'o': mp = getmntopts(optarg, mopts, mntflags, 0); if (mp == NULL) { warn("getmntopts"); return 1; } freemntopts(mp); break; case 't': args->gmtoff = atoi(optarg); set_gmtoff = 1; break; case '?': default: return 1; } } if (optind + 2 != argc) { return 1; } if (set_mask && !set_dirmask) { args->dirmask = args->mask; } else if (set_dirmask && !set_mask) { args->mask = args->dirmask; set_mask = 1; } dev = argv[optind]; dir = argv[optind + 1]; pathadj(dev, canon_dev); pathadj(dir, canon_dir); args->fspec = dev; if (!set_gid || !set_uid || !set_mask) { if (stat(dir, &sb) == -1) { warn("stat %s", dir); return 1; } if (!set_uid) args->uid = sb.st_uid; if (!set_gid) args->gid = sb.st_gid; if (!set_mask) { args->mask = args->dirmask = sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); } } if (!set_gmtoff) { #ifdef HAVE_STRUCT_TM_TM_GMTOFF time_t now; struct tm *tm; /* use user's time zone as default */ time(&now); tm = localtime(&now); args->gmtoff = tm->tm_gmtoff; #else args->gmtoff = 0; #endif } args->flags |= MSDOSFSMNT_VERSIONED; args->version = MSDOSFSMNT_VERSION; return 0; }