From owner-svn-src-projects@FreeBSD.ORG Tue Jan 6 19:52:40 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8E01C10656C1; Tue, 6 Jan 2009 19:52:40 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7C03B8FC0C; Tue, 6 Jan 2009 19:52:40 +0000 (UTC) (envelope-from lulf@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n06JqeNc040397; Tue, 6 Jan 2009 19:52:40 GMT (envelope-from lulf@svn.freebsd.org) Received: (from lulf@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n06JqeAO040391; Tue, 6 Jan 2009 19:52:40 GMT (envelope-from lulf@svn.freebsd.org) Message-Id: <200901061952.n06JqeAO040391@svn.freebsd.org> From: Ulf Lilleengen Date: Tue, 6 Jan 2009 19:52:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186837 - projects/csup_wip/contrib/csup X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Jan 2009 19:52:41 -0000 Author: lulf Date: Tue Jan 6 19:52:40 2009 New Revision: 186837 URL: http://svn.freebsd.org/changeset/base/186837 Log: - Add a handler for SIGINFO, which will print the collection, and the progress of updating the current collection. Modified: projects/csup_wip/contrib/csup/config.c projects/csup_wip/contrib/csup/config.h projects/csup_wip/contrib/csup/lister.c projects/csup_wip/contrib/csup/status.c projects/csup_wip/contrib/csup/status.h projects/csup_wip/contrib/csup/updater.c Modified: projects/csup_wip/contrib/csup/config.c ============================================================================== --- projects/csup_wip/contrib/csup/config.c Tue Jan 6 19:25:24 2009 (r186836) +++ projects/csup_wip/contrib/csup/config.c Tue Jan 6 19:52:40 2009 (r186837) @@ -311,6 +311,7 @@ coll_new(struct coll *def) new->co_accepts = pattlist_new(); new->co_refusals = pattlist_new(); new->co_attrignore = FA_DEV | FA_INODE; + new->co_numdone = 0; return (new); } Modified: projects/csup_wip/contrib/csup/config.h ============================================================================== --- projects/csup_wip/contrib/csup/config.h Tue Jan 6 19:25:24 2009 (r186836) +++ projects/csup_wip/contrib/csup/config.h Tue Jan 6 19:52:40 2009 (r186837) @@ -93,6 +93,7 @@ struct coll { int co_options; mode_t co_umask; struct keyword *co_keyword; + int co_numdone; STAILQ_ENTRY(coll) co_next; }; Modified: projects/csup_wip/contrib/csup/lister.c ============================================================================== --- projects/csup_wip/contrib/csup/lister.c Tue Jan 6 19:25:24 2009 (r186836) +++ projects/csup_wip/contrib/csup/lister.c Tue Jan 6 19:52:40 2009 (r186837) @@ -212,6 +212,7 @@ lister_coll(struct lister *l, struct col } break; } + coll->co_numdone++; } if (ret == -1) { l->errmsg = status_errmsg(st); Modified: projects/csup_wip/contrib/csup/status.c ============================================================================== --- projects/csup_wip/contrib/csup/status.c Tue Jan 6 19:25:24 2009 (r186836) +++ projects/csup_wip/contrib/csup/status.c Tue Jan 6 19:52:40 2009 (r186837) @@ -86,6 +86,7 @@ struct status { int linenum; int depth; int dirty; + int numentries; }; static void @@ -521,11 +522,12 @@ struct status * status_open(struct coll *coll, time_t scantime, char **errmsg) { struct status *st; - struct stream *file; + struct stream *file, *tmp; struct fattr *fa; char *destpath, *path; - int error, rv; + int error, isnew, rv; + isnew = access(path, F_OK); path = coll_statuspath(coll); file = stream_open_file(path, O_RDONLY); if (file == NULL) { @@ -536,6 +538,7 @@ status_open(struct coll *coll, time_t sc return (NULL); } st = status_fromnull(path); + isnew = 1; } else { st = status_fromrd(path, file); if (st == NULL) { @@ -591,6 +594,17 @@ status_open(struct coll *coll, time_t sc return (NULL); } } + + /* Count the number of entries in the file. */ + if (isnew) { + st->numentries = 0; + tmp = stream_open_file(path, O_RDONLY); + if (tmp == NULL) + return (st); + while (stream_getln(tmp, NULL) != NULL) + st->numentries++; + stream_close(tmp); + } return (st); } @@ -872,3 +886,9 @@ status_close(struct status *st, char **e bad: status_free(st); } + +int +status_numentries(struct status *st) +{ + return (st->numentries); +} Modified: projects/csup_wip/contrib/csup/status.h ============================================================================== --- projects/csup_wip/contrib/csup/status.h Tue Jan 6 19:25:24 2009 (r186836) +++ projects/csup_wip/contrib/csup/status.h Tue Jan 6 19:52:40 2009 (r186837) @@ -68,5 +68,6 @@ int status_eof(struct status *); char *status_errmsg(struct status *); int status_delete(struct status *, char *, int); void status_close(struct status *, char **); +int status_numentries(struct status *); #endif /* !_STATUS_H_ */ Modified: projects/csup_wip/contrib/csup/updater.c ============================================================================== --- projects/csup_wip/contrib/csup/updater.c Tue Jan 6 19:25:24 2009 (r186836) +++ projects/csup_wip/contrib/csup/updater.c Tue Jan 6 19:52:40 2009 (r186837) @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -85,6 +86,9 @@ struct updater { int deletecount; }; +static struct file_update *curfup = NULL; +static pthread_mutex_t fuplock; + static struct file_update *fup_new(struct coll *, struct status *); static int fup_prepare(struct file_update *, char *, int); static void fup_cleanup(struct file_update *); @@ -117,6 +121,7 @@ int updater_append_file(struct updater off_t); static int updater_rsync(struct updater *, struct file_update *, size_t); static int updater_read_checkout(struct stream *, struct stream *); +void updater_infohandler(int); static struct file_update * fup_new(struct coll *coll, struct status *st) @@ -127,6 +132,7 @@ fup_new(struct coll *coll, struct status memset(fup, 0, sizeof(*fup)); fup->coll = coll; fup->st = st; + fup->coname = NULL; return (fup); } @@ -233,6 +239,8 @@ updater(void *arg) up->rd = args->rd; up->errmsg = NULL; up->deletecount = 0; + pthread_mutex_init(&fuplock, NULL); + signal(SIGINFO, updater_infohandler); error = updater_batch(up, 0); @@ -316,8 +324,14 @@ updater_batch(struct updater *up, int is return (UPDATER_ERR_MSG); } fup = fup_new(coll, st); + pthread_mutex_lock(&fuplock); + curfup = fup; + pthread_mutex_unlock(&fuplock); error = updater_docoll(up, fup, isfixups); status_close(st, &errmsg); + pthread_mutex_lock(&fuplock); + curfup = NULL; + pthread_mutex_unlock(&fuplock); fup_free(fup); if (errmsg != NULL) { /* Discard previous error. */ @@ -2013,3 +2027,18 @@ bad: free(buf); return (error); } + +void +updater_infohandler(int sig __unused) +{ + pthread_mutex_lock(&fuplock); + if (curfup != NULL) { + printf("Updating %s", curfup->coll->co_name); + if (status_numentries(curfup->st) > 0) + printf(" (%d%% done)", (int) + (((double)curfup->coll->co_numdone * 100.0) / + (double)status_numentries(curfup->st))); + printf("\n"); + } + pthread_mutex_unlock(&fuplock); +}