projects
/
m6w6
/
libmemcached
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
Rewrote return read() to now read exactly character by character.
[m6w6/libmemcached]
/
src
/
memcp.c
diff --git
a/src/memcp.c
b/src/memcp.c
index 6ae8e3b4905154b3de3115e23408a44e442c064a..ec9a2fafb12a2b1bf88389cb4c6d6585c7ef5b32 100644
(file)
--- a/
src/memcp.c
+++ b/
src/memcp.c
@@
-4,50
+4,53
@@
#include <sys/types.h>
\r
#include <sys/stat.h>
\r
#include <sys/types.h>
\r
#include <sys/types.h>
\r
#include <sys/stat.h>
\r
#include <sys/types.h>
\r
-#include <sys/mman.h>
\r
#include <fcntl.h>
\r
#include <fcntl.h>
\r
+#include <errno.h>
\r
\r
#include <memcached.h>
\r
#include "client_options.h"
\r
\r
#include <memcached.h>
\r
#include "client_options.h"
\r
+#include "utilities.h"
\r
\r
/* Prototypes */
\r
void options_parse(int argc, char *argv[]);
\r
\r
\r
/* Prototypes */
\r
void options_parse(int argc, char *argv[]);
\r
\r
-static int opt_verbose;
\r
-static char *opt_servers;
\r
-static int opt_
replace
;
\r
-uint16_t opt_flags= 0;
\r
-time_t opt_expires= 0;
\r
+static int opt_verbose
= 0
;
\r
+static char *opt_servers
= NULL
;
\r
+static int opt_
method= OPT_SET
;
\r
+
static
uint16_t opt_flags= 0;
\r
+
static
time_t opt_expires= 0;
\r
\r
int main(int argc, char *argv[])
\r
{
\r
memcached_st *memc;
\r
\r
int main(int argc, char *argv[])
\r
{
\r
memcached_st *memc;
\r
- char *string;
\r
- size_t string_length;
\r
memcached_return rc;
\r
\r
options_parse(argc, argv);
\r
\r
memc= memcached_init(NULL);
\r
memcached_return rc;
\r
\r
options_parse(argc, argv);
\r
\r
memc= memcached_init(NULL);
\r
- parse_opt_servers(memc, opt_servers);
\r
\r
\r
- while (optind <= argc)
\r
+ if (opt_servers)
\r
+ parse_opt_servers(memc, opt_servers);
\r
+ else
\r
+ parse_opt_servers(memc, argv[--argc]);
\r
+
\r
+ while (optind < argc)
\r
{
\r
{
\r
- char *mptr;
\r
struct stat sbuf;
\r
int fd;
\r
char *ptr;
\r
struct stat sbuf;
\r
int fd;
\r
char *ptr;
\r
+ ssize_t read_length;
\r
+ char *file_buffer_ptr;
\r
\r
fd= open(argv[optind], O_RDONLY);
\r
\r
fd= open(argv[optind], O_RDONLY);
\r
-
\r
- if (fd == -1)
\r
+ if (fd < 0)
\r
{
\r
{
\r
- fprintf(stderr, "Failed opening %s\n", argv[optind]);
\r
+ fprintf(stderr, "memcp: %s: %s\n", argv[optind], strerror(errno));
\r
+ optind++;
\r
continue;
\r
}
\r
\r
(void)fstat(fd, &sbuf);
\r
continue;
\r
}
\r
\r
(void)fstat(fd, &sbuf);
\r
- mptr= mmap(NULL, sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
\r
\r
ptr= rindex(argv[optind], '/');
\r
if (ptr)
\r
\r
ptr= rindex(argv[optind], '/');
\r
if (ptr)
\r
@@
-55,45
+58,64
@@
int main(int argc, char *argv[])
else
\r
ptr= argv[optind];
\r
\r
else
\r
ptr= argv[optind];
\r
\r
- if (opt_verbose) {
\r
+ if (opt_verbose)
\r
+ {
\r
static char *opstr[] = { "set", "add", "replace" };
\r
static char *opstr[] = { "set", "add", "replace" };
\r
- printf("op: %s\nsource file: %s\nlength: %
d
\n"
\r
- "key: %s\nflags: %
d\n expires: %ld
\n",
\r
- opstr[opt_
replace], argv[optind],
sbuf.st_size,
\r
- ptr, opt_flags, opt_expires);
\r
+ printf("op: %s\nsource file: %s\nlength: %
zu
\n"
\r
+ "key: %s\nflags: %
x\n expires: %llu
\n",
\r
+ opstr[opt_
method], argv[optind], (size_t)
sbuf.st_size,
\r
+ ptr, opt_flags,
(unsigned long long)
opt_expires);
\r
}
\r
\r
}
\r
\r
- if (opt_replace == 0)
\r
- rc= memcached_set(memc, ptr, strlen(ptr),
\r
- mptr, sbuf.st_size,
\r
- opt_expires, opt_flags);
\r
- else if (opt_replace == 1)
\r
+ if ((file_buffer_ptr= (char *)malloc(sizeof(char) * sbuf.st_size)) == NULL)
\r
+ {
\r
+ fprintf(stderr, "malloc: %s\n", strerror(errno));
\r
+ exit(1);
\r
+ }
\r
+
\r
+ if ((read_length= read(fd, file_buffer_ptr, sbuf.st_size)) == -1)
\r
+ {
\r
+ fprintf(stderr, "read: %s\n", strerror(errno));
\r
+ exit(1);
\r
+ }
\r
+ assert(read_length == sbuf.st_size);
\r
+
\r
+ if (opt_method == OPT_ADD)
\r
rc= memcached_add(memc, ptr, strlen(ptr),
\r
rc= memcached_add(memc, ptr, strlen(ptr),
\r
-
m
ptr, sbuf.st_size,
\r
+
file_buffer_
ptr, sbuf.st_size,
\r
opt_expires, opt_flags);
\r
opt_expires, opt_flags);
\r
- else if (opt_
replace == 2
)
\r
+ else if (opt_
method == OPT_REPLACE
)
\r
rc= memcached_replace(memc, ptr, strlen(ptr),
\r
rc= memcached_replace(memc, ptr, strlen(ptr),
\r
-
m
ptr, sbuf.st_size,
\r
+
file_buffer_
ptr, sbuf.st_size,
\r
opt_expires, opt_flags);
\r
else
\r
opt_expires, opt_flags);
\r
else
\r
- abort();
\r
+ rc= memcached_set(memc, ptr, strlen(ptr),
\r
+ file_buffer_ptr, sbuf.st_size,
\r
+ opt_expires, opt_flags);
\r
+
\r
+ if (rc != MEMCACHED_SUCCESS)
\r
+ fprintf(stderr, "memcp: %s: memcache error %s\n",
\r
+ ptr, memcached_strerror(memc, rc));
\r
\r
\r
- munmap(mptr, sbuf.st_size);
\r
+ WATCHPOINT;
\r
+ free(file_buffer_ptr);
\r
close(fd);
\r
optind++;
\r
}
\r
\r
memcached_deinit(memc);
\r
\r
close(fd);
\r
optind++;
\r
}
\r
\r
memcached_deinit(memc);
\r
\r
+ free(opt_servers);
\r
+
\r
return 0;
\r
return 0;
\r
-}
;
\r
+}
\r
\r
void options_parse(int argc, char *argv[])
\r
{
\r
int option_index= 0;
\r
int option_rv;
\r
\r
\r
void options_parse(int argc, char *argv[])
\r
{
\r
int option_index= 0;
\r
int option_rv;
\r
\r
- static struct option long_options[]
=
\r
+ static struct option long_options[]=
\r
{
\r
{"version", no_argument, NULL, OPT_VERSION},
\r
{"help", no_argument, NULL, OPT_HELP},
\r
{
\r
{"version", no_argument, NULL, OPT_VERSION},
\r
{"help", no_argument, NULL, OPT_HELP},
\r
@@
-102,9
+124,9
@@
void options_parse(int argc, char *argv[])
{"servers", required_argument, NULL, OPT_SERVERS},
\r
{"flag", required_argument, NULL, OPT_FLAG},
\r
{"expire", required_argument, NULL, OPT_EXPIRE},
\r
{"servers", required_argument, NULL, OPT_SERVERS},
\r
{"flag", required_argument, NULL, OPT_FLAG},
\r
{"expire", required_argument, NULL, OPT_EXPIRE},
\r
- {"set", no_argument,
&opt_replace
, OPT_SET},
\r
- {"add", no_argument,
&opt_replace
, OPT_ADD},
\r
- {"replace", no_argument,
&opt_replace
, OPT_REPLACE},
\r
+ {"set", no_argument,
NULL
, OPT_SET},
\r
+ {"add", no_argument,
NULL
, OPT_ADD},
\r
+ {"replace", no_argument,
NULL
, OPT_REPLACE},
\r
{0, 0, 0, 0},
\r
};
\r
\r
{0, 0, 0, 0},
\r
};
\r
\r
@@
-114,7
+136,8
@@
void options_parse(int argc, char *argv[])
\r
if (option_rv == -1) break;
\r
\r
\r
if (option_rv == -1) break;
\r
\r
- switch (option_rv) {
\r
+ switch (option_rv)
\r
+ {
\r
case 0:
\r
break;
\r
case OPT_VERSION: /* --version or -V */
\r
case 0:
\r
break;
\r
case OPT_VERSION: /* --version or -V */
\r
@@
-124,13
+147,22
@@
void options_parse(int argc, char *argv[])
printf("useful help messages go here\n");
\r
exit(0);
\r
case OPT_SERVERS: /* --servers or -s */
\r
printf("useful help messages go here\n");
\r
exit(0);
\r
case OPT_SERVERS: /* --servers or -s */
\r
- opt_servers=
optarg
;
\r
+ opt_servers=
strdup(optarg)
;
\r
break;
\r
case OPT_FLAG: /* --flag */
\r
break;
\r
case OPT_FLAG: /* --flag */
\r
- opt_flags= (uint16_t)strtol(optarg, (char **)NULL, 1
0
);
\r
+ opt_flags= (uint16_t)strtol(optarg, (char **)NULL, 1
6
);
\r
break;
\r
case OPT_EXPIRE: /* --expire */
\r
break;
\r
case OPT_EXPIRE: /* --expire */
\r
- opt_expires= (time_t)strtol(optarg, (char **)NULL, 10);
\r
+ opt_expires= (time_t)strtoll(optarg, (char **)NULL, 10);
\r
+ break;
\r
+ case OPT_SET:
\r
+ opt_method= OPT_SET;
\r
+ break;
\r
+ case OPT_REPLACE:
\r
+ opt_method= OPT_REPLACE;
\r
+ break;
\r
+ case OPT_ADD:
\r
+ opt_method= OPT_ADD;
\r
break;
\r
case '?':
\r
/* getopt_long already printed an error message. */
\r
break;
\r
case '?':
\r
/* getopt_long already printed an error message. */
\r