Mercurial > hg > toybox
view toys/cksum.c @ 551:2548e6e590b2
Add string to mode_t parser
added new function string_to_mode(char *m_string, mode_t base) which
parses a given string and converts it to a mode_t.
If either + or - are part of m_string the permissions are either
added or removed from base.
Currently support for permision copy is missing (e.g. g=u),
but all other flags should work.
Format for m_string: either symbolic modes or octal representation.
symbolic modes:
[auog][[+-=][rwxst]*]
examples:
string_to_mode("u=rwx,g=rw,o=r", 0);
string_to_mode("a-x", 0777);
string_to_mode("0744", 0);
author | Daniel Walter <d.walter@0x90.at> |
---|---|
date | Mon, 19 Mar 2012 19:57:56 -0500 |
parents | 0cc0c0e879d1 |
children |
line wrap: on
line source
/* vi: set sw=4 ts=4: * * cksum.c - produce crc32 checksum value for each input * * Copyright 2008 Rob Landley <rob@landley.net> * * See http://www.opengroup.org/onlinepubs/009695399/utilities/cksum.html USE_CKSUM(NEWTOY(cksum, "IPLN", TOYFLAG_BIN)) config CKSUM bool "cksum" default y help usage: cksum [-IPLN] [file...] For each file, output crc32 checksum value, length and name of file. If no files listed, copy from stdin. Filename "-" is a synonym for stdin. -L Little endian (defaults to big endian) -P Pre-inversion -I Skip post-inversion -N Do not include length in CRC calculation */ #include "toys.h" DEFINE_GLOBALS( unsigned crc_table[256]; ) #define TT this.cksum static unsigned cksum_be(unsigned crc, unsigned char c) { return (crc<<8)^TT.crc_table[(crc>>24)^c]; } static unsigned cksum_le(unsigned crc, unsigned char c) { return TT.crc_table[(crc^c)&0xff] ^ (crc>>8); } static void do_cksum(int fd, char *name) { unsigned crc = (toys.optflags&4) ? 0xffffffff : 0; uint64_t llen = 0, llen2; unsigned (*cksum)(unsigned crc, unsigned char c); cksum = (toys.optflags&2) ? cksum_le : cksum_be; // CRC the data for (;;) { int len, i; len = read(fd, toybuf, sizeof(toybuf)); if (len<0) { perror_msg("%s",name); toys.exitval = EXIT_FAILURE; } if (len<1) break; llen += len; for (i=0; i<len; i++) crc=cksum(crc, toybuf[i]); } // CRC the length llen2 = llen; if (!(toys.optflags&1)) { while (llen) { crc = cksum(crc, llen); llen >>= 8; } } printf("%u %"PRIu64, (toys.optflags&8) ? crc : ~crc, llen2); if (strcmp("-", name)) printf(" %s", name); xputc('\n'); } void cksum_main(void) { crc_init(TT.crc_table, toys.optflags&2); loopfiles(toys.optargs, do_cksum); }