Added comments to nonobvious code fragments

This commit is contained in:
Rafal Wojtczuk 2010-08-03 07:12:59 +02:00
parent 449df64b17
commit 938dc071e4
3 changed files with 26 additions and 1 deletions

View File

@ -143,6 +143,8 @@ void suicide(struct xs_handle *xs)
exit(1); exit(1);
} }
// we are DVM, AppVM sends us a document to work on
// /dev/xvdh contains the dvm_header and document data
void dvm_transaction_request(char *seq, struct xs_handle *xs) void dvm_transaction_request(char *seq, struct xs_handle *xs)
{ {
char filename[1024], cmdbuf[1024]; char filename[1024], cmdbuf[1024];
@ -189,12 +191,16 @@ void dvm_transaction_request(char *seq, struct xs_handle *xs)
if (stat_pre.st_mtime == stat_post.st_mtime) if (stat_pre.st_mtime == stat_post.st_mtime)
suicide(xs); suicide(xs);
xs_daemon_close(xs); xs_daemon_close(xs);
// if the modify timestamp of the document file has changed, write back the
// modified content to the requestor AppVM
execl("/usr/lib/qubes/qvm-dvm-transfer", "qvm-dvm-transfer", src_vm, execl("/usr/lib/qubes/qvm-dvm-transfer", "qvm-dvm-transfer", src_vm,
filename, seq, NULL); filename, seq, NULL);
syslog(LOG_DAEMON | LOG_ERR, "execl qvm-dvm-transfer"); syslog(LOG_DAEMON | LOG_ERR, "execl qvm-dvm-transfer");
suicide(xs); suicide(xs);
} }
// we are AppVM, DVM sends us a modified document
// /dev/xvdh contains the dvm_header and document data
void dvm_transaction_return(char *seq_string, struct xs_handle *xs) void dvm_transaction_return(char *seq_string, struct xs_handle *xs)
{ {
int seq = strtoul(seq_string, 0, 10); int seq = strtoul(seq_string, 0, 10);
@ -213,6 +219,7 @@ void dvm_transaction_return(char *seq_string, struct xs_handle *xs)
goto out_err; goto out_err;
} }
drop_to_user(); drop_to_user();
// read the file name for which the open-in-dvm with transaction=="seq" was started
snprintf(db_name, sizeof(db_name), DBDIR "/%d", seq); snprintf(db_name, sizeof(db_name), DBDIR "/%d", seq);
db_fd = open(db_name, O_RDONLY); db_fd = open(db_name, O_RDONLY);
if (!db_fd) { if (!db_fd) {

View File

@ -39,6 +39,13 @@ void check_name(unsigned char *s)
exit(1); exit(1);
} }
} }
/*
A tool to request action from qfileexchgd by writing to device/qpen xenstore key.
new - please attach a vfat-formatted block device at /dev/xvdg; I will either write some files to it and
then request sending it to other AppVM, or I will place dvm_header+some file on it and send it to DVM
send vmname - detach my /dev/xvdg and attach it to vmname at /dev/xvdh
umount - I am done with my /dev/xvdh, please detach it
*/
void usage(char *argv0) void usage(char *argv0)
{ {

View File

@ -62,7 +62,12 @@ int get_and_set_seq()
close(seq_fd); close(seq_fd);
return seq; return seq;
} }
/*
Write the filename we are sending to DVM to DBDIR/transaction_seq
When DVM sends us a modified document via transaction with transaction_seq,
we will know that we are supposed to update the document with the
filename at DBDIR/transaction_seq
*/
void write_db(char *name, int seq) void write_db(char *name, int seq)
{ {
int db_fd; int db_fd;
@ -137,6 +142,7 @@ int main(int argc, char **argv)
perror("xs_domain_open"); perror("xs_domain_open");
exit(1); exit(1);
} }
// request a new block device at /dev/xvdg from qfileexchgd
if (!xs_write(xs, 0, "device/qpen", "new", 3)) { if (!xs_write(xs, 0, "device/qpen", "new", 3)) {
perror("xs_write"); perror("xs_write");
exit(1); exit(1);
@ -150,8 +156,10 @@ int main(int argc, char **argv)
} }
setuid(getuid()); setuid(getuid());
if (argc == 3) if (argc == 3)
// we are AppVM; get new seq
seq = get_and_set_seq(); seq = get_and_set_seq();
else else
// we are DVM; use the cmdline transaction_seq
seq = strtoul(argv[3], 0, 0); seq = strtoul(argv[3], 0, 0);
file_fd = open(abs_filename, O_RDONLY); file_fd = open(abs_filename, O_RDONLY);
if (file_fd < 0) { if (file_fd < 0) {
@ -165,6 +173,9 @@ int main(int argc, char **argv)
copy_file(xvdg_fd, file_fd); copy_file(xvdg_fd, file_fd);
close(file_fd); close(file_fd);
close(xvdg_fd); close(xvdg_fd);
// request qfileexchgd to send our /dev/xvdg to its destination
// either "disposable", which means "create DVM for me"
// or vmname, meaning this is a reply to originator AppVM
snprintf(buf, sizeof(buf), "send %s %d", argv[1], seq); snprintf(buf, sizeof(buf), "send %s %d", argv[1], seq);
if (!xs_write(xs, 0, "device/qpen", buf, strlen(buf))) { if (!xs_write(xs, 0, "device/qpen", buf, strlen(buf))) {
perror("xs_write"); perror("xs_write");