/* * This database operates on relative names. * * Any name will be interpreted as a pathname offset from the directory * specified in the configuration file. */ static isc_result_t dirdb_lookup(const char *zone, const char *name, void *dbdata, dns_sdblookup_t *lookup) { char filename[255]; char filename2[255]; char buf[1024]; struct stat statbuf; isc_result_t result; int n; UNUSED(zone); UNUSED(dbdata); if (strcmp(name, "@") == 0) snprintf(filename, sizeof(filename), "%s", (char *)dbdata); else snprintf(filename, sizeof(filename), "%s/%s", (char *)dbdata, name); CHECKN(lstat(filename, &statbuf)); if (S_ISDIR(statbuf.st_mode)) CHECK(dns_sdb_putrr(lookup, "txt", 3600, "dir")); else if (S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode)) { CHECKN(snprintf(buf, sizeof(buf), "\"%sdev\" \"major %d\" \"minor %d\"", S_ISCHR(statbuf.st_mode) ? "chr" : "blk", major(statbuf.st_rdev), minor(statbuf.st_rdev))); CHECK(dns_sdb_putrr(lookup, "txt", 3600, buf)); } else if (S_ISFIFO(statbuf.st_mode)) CHECK(dns_sdb_putrr(lookup, "txt", 3600, "pipe")); else if (S_ISSOCK(statbuf.st_mode)) CHECK(dns_sdb_putrr(lookup, "txt", 3600, "socket")); else if (S_ISLNK(statbuf.st_mode)) { CHECKN(readlink(filename, filename2, sizeof(filename2) - 1)); buf[n] = 0; CHECKN(snprintf(buf, sizeof(buf), "\"symlink\" \"%s\"", filename2)); CHECK(dns_sdb_putrr(lookup, "txt", 3600, buf)); } else if (!S_ISREG(statbuf.st_mode)) CHECK(dns_sdb_putrr(lookup, "txt", 3600, "unknown")); else { CHECKN(snprintf(buf, sizeof(buf), "\"file\" \"size = %u\"", (unsigned int)statbuf.st_size)); CHECK(dns_sdb_putrr(lookup, "txt", 3600, buf)); } return (ISC_R_SUCCESS); }
BULLET *GetBulletPtr( INT32 iBullet ) { BULLET *pBullet; CHECKN( iBullet < NUM_BULLET_SLOTS ); pBullet = &gBullets[ iBullet ]; return( pBullet ); }